perlbs2000 - 在 BS2000 上构建和安装 Perl。
此文档需要更新,但我们不知道应该写些什么。请将评论提交到 https://github.com/Perl/perl5/issues。
此文档将帮助您在 BS2000 的 POSIX 子系统中配置、构建、测试和安装 Perl。
这是一个移植到 BS2000 VERSION OSD V3.1A 或更高版本的 POSIX 子系统中的 Perl。它可能适用于其他版本,但我们从 3.1A 开始移植和测试它,目前正在使用版本 V4.0A。
您可能需要以下 GNU 程序才能安装 Perl
我们使用了 1.2.4 版本,它可以开箱即用,但在“make check”期间出现了一次故障。
BS2000 POSIX 附带的 yacc 对我们不起作用。因此我们不得不使用 bison。为了使用 bison 的纯(可重入)解析器,我们必须对 perl 进行一些更改。我们使用了 1.25 版本,但由于 EBCDIC,我们不得不添加一些更改。有关 yacc 的更多详细信息,请参见下文。
要在 BS2000 POSIX 上解压缩 ASCII tar 存档,您需要一个 ASCII 文件系统(我们为此使用了挂载点 /usr/local/ascii)。现在您在 ASCII 文件系统中解压缩存档,无需 I/O 转换
cd /usr/local/ascii export IO_CONVERSION=NO gunzip < /usr/local/src/perl.tar.gz | pax -r
您可以忽略存档第一个元素的错误消息(这不像 tar 存档 / 跳到下一个文件...),它只是目录,无论如何都会自动创建。
解压缩存档后,将整个目录树复制到您的 EBCDIC 文件系统。**这次您使用 I/O 转换**
cd /usr/local/src IO_CONVERSION=YES cp -r /usr/local/ascii/perl5.005_02 ./
有一个名为 hints.posix-bc 的 BS2000 “提示”文件(因为 posix-bc 是 `uname` 给出的操作系统名称),它指定了大多数事物的正确值。主要问题是(当然)EBCDIC 字符集。我们有德语 EBCDIC 版本。
由于我们遇到了原生 yacc 的问题,我们使用 GNU bison 为 perly.y 生成一个纯(=可重入)解析器。所以我们的 yacc 实际上是以下脚本
-----8<-----/usr/local/bin/yacc-----8<----- #! /usr/bin/sh
# Bison 作为可重入 yacc
# 保存参数:params="" while [[ $# -gt 1 ]]; do params="$params $1" shift done
# 添加标志 %pure_parser
tmpfile=/tmp/bison.$$.y echo %pure_parser > $tmpfile cat $1 >> $tmpfile
# 调用 bison
echo "/usr/local/bin/bison --yacc $params $1\t\t\t(Pure Parser)" /usr/local/bin/bison --yacc $params $tmpfile
# 清理
rm -f $tmpfile -----8<----------8<-----
我们仍然使用普通的 yacc 来处理 a2p.y!我们创建了一个名为 byacc 的软链接来区分这两个版本
ln -s /usr/bin/yacc /usr/local/bin/byacc
我们使用 GNU make 构建 perl。我们尝试过一次使用原生 make,它也成功了。
我们在make test
过程中仍然遇到了一些错误。其中一些错误是使用 bison 造成的。Bison 会打印解析器错误而不是语法错误,因此我们可以忽略它们。以下列表显示了我们的错误,您的结果可能有所不同。
op/numconvert.......FAILED 测试 1409-1440 op/regexp...........FAILED 测试 483, 496 op/regexp_noamp.....FAILED 测试 483, 496 pragma/overload.....FAILED 测试 152-153, 170-171 pragma/warnings.....FAILED 测试 14, 82, 129, 155, 192, 205, 207 lib/bigfloat........FAILED 测试 351-352, 355 lib/bigfltpm........FAILED 测试 354-355, 358 lib/complex.........FAILED 测试 267, 487 lib/dumper..........FAILED 测试 43, 45 失败 11/231 个测试脚本,95.24% 通过。57/10595 个子测试失败,99.46% 通过。
我们还没有在 BS2000 POSIX 上安装 nroff,因此我们在安装文档时忽略了所有错误。
BS2000 POSIX 不支持 shebang 符号 (#!/usr/local/bin/perl
),因此您必须使用以下行代替
: # use perl eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' if 0; # ^ 仅在 shell 下运行
我们对此还没有太多经验,但请尝试以下操作
使用 bs2cp 将您的 Perl 可执行文件复制到 BS2000 LLM
bs2cp /usr/local/bin/perl 'bs2:perl(perl,l)'
现在您可以使用以下 (SDF) 命令启动它
/START-PROG FROM-FILE=*MODULE(PERL,PERL),PROG-MODE=*ANY,RUN-MODE=*ADV
首先,您将获得 BS2000 命令行提示符 ('*')。在这里,您可以输入您的参数,例如 -e 'print "Hello World!\\n";'
(注意双反斜杠!)或 -w
以及您的 Perl 脚本的名称。以 /
开头的文件名将在 Posix 文件系统中搜索,其他文件名将在 BS2000 文件系统中搜索。如果您在文件名之前添加 %
,您甚至可以使用通配符(例如 -w checkfiles.pl %*.c
)。阅读您的 C/C++ 手册以了解命令行提示符的其他可能性(查找 PARAMETER-PROMPTING)。
BS2000 POSIX 系统上的浮点实现似乎存在一个错误,即对一个数字和一个很小数量的乘积调用 int() 与对该数字和一个很大数量的商调用 int() 的结果不同。例如,在以下 Perl 代码中
my $x = 100000.0;
my $y = int($x * 1e-5) * 1e5; # '0'
my $z = int($x / 1e+5) * 1e5; # '100000'
print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000
虽然人们期望 $y 和 $z 的值相同且都等于 100000,但它们将不同,并且分别为 0 和 100000。
从 5.8 版本开始,Perl 在 BS2000 上使用新的 PerlIO。这使您能够在每个 IO 通道上使用不同的编码。例如,您可以使用
use Encode;
open($f, ">:encoding(ascii)", "test.ascii");
print $f "Hello World!\n";
open($f, ">:encoding(posix-bc)", "test.ebcdic");
print $f "Hello World!\n";
open($f, ">:encoding(latin1)", "test.latin1");
print $f "Hello World!\n";
open($f, ">:encoding(utf8)", "test.utf8");
print $f "Hello World!\n";
获取两个包含 "Hello World!\n" 的文件,分别以 ASCII、EBCDIC、ISO Latin-1(在本例中与 ASCII 相同)和 UTF-EBCDIC(在本例中与普通 EBCDIC 相同)编码。有关详细信息,请参阅 Encode::PerlIO 的文档。
由于 PerlIO 层在内部使用原始 IO,因此所有这些都完全忽略了您的文件系统类型(ASCII 或 EBCDIC)和 IO_CONVERSION 环境变量。如果您想获得旧的行为,即 BS2000 IO 函数根据文件系统确定转换,PerlIO 仍然是您的朋友。您可以像往常一样使用 IO_CONVERSION 并告诉 Perl 使用本机 IO 层
export IO_CONVERSION=YES
export PERLIO=stdio
现在您的 IO 在 ASCII 分区上将是 ASCII,在 EBCDIC 分区上将是 EBCDIC。有关更多可能性,请参阅 PerlIO(不带 Encode::
!)的文档。
Thomas Dorner
如果您对 Perl 的 z/OS(以前称为 OS/390)和 POSIX-BC(BS2000)端口感兴趣,请查看 perl-mvs 邮件列表。要订阅,请向 [email protected] 发送空邮件。
另请参阅
https://lists.perl.org/list/perl-mvs.html
邮件列表的网络存档位于
https://www.nntp.perl.org/group/perl.mvs/
本文档最初由 Thomas Dorner 为 Perl 5.005 版本编写。
本文档在 2000 年 7 月 11 日的 perl 5.6 版本中进行了修改。