perlbs2000 - 建立和安裝 BS2000 用 Perl。
此文件需要更新,但我們不知道它應該說什麼。請將意見提交至 https://github.com/Perl/perl5/issues。
此文件將協助您在 POSIX 子系統中設定、建立、測試和安裝 BS2000 用 Perl。
這是針對 BS2000 VERSION OSD V3.1A 或更新版本的 POSIX 子系統移植的 perl。它可能可以在其他版本上執行,但我們從 3.1A 開始移植和測試,目前使用的是 V4.0A 版本。
您可能需要以下 GNU 程式才能安裝 perl
我們使用 1.2.4 版本,它可以在「make check」期間發生一次失敗的情況下立即安裝。
BS2000 POSIX 附帶的 yacc 對我們不起作用。因此我們必須使用 bison。我們必須對 perl 進行一些變更,才能使用 bison 的純粹(可重新進入)解析器。我們使用 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 ./
有一個針對 BS2000 的「提示」檔案,稱為 hints.posix-bc(因為 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 for a2p.y!我們製作了一個名為 byacc 的軟連結來區分這兩個版本
ln -s /usr/bin/yacc /usr/local/bin/byacc
我們使用 GNU make 來建置 Perl。我們曾試過一次原生 make,它也運作良好。
在 make test
期間,我們仍然會收到一些錯誤。其中一些是使用 bison 的結果。Bison 會印出 parser error 而不是 syntax error,因此我們可以忽略它們。下列清單顯示我們的錯誤,您的結果可能有所不同
op/numconvert.......FAILED tests 1409-1440 op/regexp...........FAILED tests 483, 496 op/regexp_noamp.....FAILED tests 483, 496 pragma/overload.....FAILED tests 152-153, 170-171 pragma/warnings.....FAILED tests 14, 82, 129, 155, 192, 205, 207 lib/bigfloat........FAILED tests 351-352, 355 lib/bigfltpm........FAILED tests 354-355, 358 lib/complex.........FAILED tests 267, 487 lib/dumper..........FAILED tests 43, 45 Failed 11/231 test scripts, 95.24% okay. 57/10595 subtests failed, 99.46% okay.
我們在 BS2000 POSIX 上沒有 nroff(目前),因此我們在安裝文件時會忽略任何錯誤。
BS2000 POSIX 不支援 shebang 符號(#!/usr/local/bin/perl
),因此您必須改用下列列行
: # 使用 perl eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' 如果 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 郵件清單。若要訂閱,請寄送一則空白訊息至 perl-mvs-subscribe@perl.org。
另請參閱
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 版本進行 podified。