内容

名称

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

在 BS2000 上使用 gzip

我们使用了 1.2.4 版本,它可以开箱即用,但在“make check”期间出现了一次故障。

BS2000 上的 bison

BS2000 POSIX 附带的 yacc 对我们不起作用。因此我们不得不使用 bison。为了使用 bison 的纯(可重入)解析器,我们必须对 perl 进行一些更改。我们使用了 1.25 版本,但由于 EBCDIC,我们不得不添加一些更改。有关 yacc 的更多详细信息,请参见下文。

在 BS2000 上解压缩 Perl 发行版

要在 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 ./

在 BS2000 上编译 Perl

有一个名为 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,它也成功了。

在 BS2000 上测试 Perl

我们在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 上安装 Perl

我们还没有在 BS2000 POSIX 上安装 nroff,因此我们在安装文档时忽略了所有错误。

在 BS2000 的 Posix-Shell 中使用 Perl

BS2000 POSIX 不支持 shebang 符号 (#!/usr/local/bin/perl),因此您必须使用以下行代替

: # use perl eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' if 0; # ^ 仅在 shell 下运行

在 "native" BS2000 中使用 Perl

我们对此还没有太多经验,但请尝试以下操作

使用 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 上的浮点异常

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。

在 ASCII 和 EBCDIC 分区上使用 PerlIO 和不同的编码

从 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

另请参阅

INSTALLperlport

邮件列表

如果您对 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 版本中进行了修改。