perlvms - クラウドでオンライン

これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、MAC OS オンライン エミュレーターなど、複数の無料オンライン ワークステーションのいずれかを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド perlvms です。

プログラム:

NAME


perlvms - Perl の VMS 固有のドキュメント

DESCRIPTION


以下は、VMS での Perl 5 の動作の詳細を説明するメモです。 彼らは
通常の Perl 5 ドキュメントを補足するため、
Perl 5 は、VMS での機能と Unix での機能との相互作用が異なります。
Perl と残りのオペレーティング システムの間。 完全な複製は試みていません
主な Perl ドキュメントからの Perl 機能の説明。
[.ポッド] Perl ディストリビューションのサブディレクトリ。

これらのメモが、Perl スクリプトを作成する際の混乱や不眠からあなたを救ってくれることを願っています。
VMSで。 ここに表示されるべきだと思われるものを見逃していることがわかった場合は、表示しないでください
にラインをドロップすることをためらう vmsperl@perl.org.

インストール


Perl 5 のビルドとインストールの手順は、ファイルに記載されています。 README.vms セクションに
Perl ディストリビューションのメイン ソース ディレクトリ。

組織 of パール 画像


基本 画像
ビルド プロセス中に、XNUMX つの Perl イメージが生成されます。 Miniperl.Exe 実行可能ファイルです
Perl の基本機能をすべて含んでいるが、それを利用できないイメージ
Perl XS 拡張機能と、純粋な Perl をロードするためのライブラリの場所のハードワイヤード リストがあります。
モジュール。 Perl やさまざまな拡張機能のビルドとテストに広く使用されていますが、そうではありません。
インストールされています。

完全な Perl のほとんどは、共有可能なイメージに存在します。 PerlShr.Exeこれは
Perl 実行可能イメージとすべての Perl 拡張機能がリンクされているコア。 それは
通常、論理名を介して配置されます ペルシュル. 画像を入れることは可能ですが、
SYS$シェア ロード可能にすることはお勧めしません。 そして、あなたがインストールしたいかもしれませんが
パフォーマンス上の理由からイメージをインストールしないでください。特権を使用してインストールしないでください。 もしあなたがそうするなら、
Perl の起動時にイメージ権限が無効になるため、結果は期待したものとは異なります。
アップ。

最後に、 Perl.exe Perl のメイン エントリ ポイントも含む実行可能イメージです。
いくつかの初期化コードとして。 公開ディレクトリに配置し、世界にする必要があります
実行可能。 コマンド ライン引数で Perl を実行するには、外部変数を定義する必要があります。
このイメージを呼び出すコマンド。

パール 拡張機能
Perl 拡張機能は、XS と Perl コードの両方を提供して新しい機能を追加するパッケージです。
パールに。 (XS は、XS と対話する C コードの作成を簡素化するメタ言語です。
Perl については、perlxs を参照してください。) 拡張機能の Perl コードは、他のコードと同じように扱われます。
他のライブラリ モジュール - 適切な「使用」または
"require" ステートメントであり、通常は拡張機能を含む Perl パッケージを定義します。

XS コードによって提供される拡張機能の部分は、Perl の残りの部分に接続されている可能性があります。
XNUMX つの方法のいずれかで。 の中に 静的な 構成、拡張機能のオブジェクト コードは
に直接リンク PerlShr.Exeであり、Perl が呼び出されるたびに初期化されます。 の中に
ダイナミック 構成では、拡張機能のマシン コードは別の共有可能ファイルに配置されます。
拡張子が "use" または "require" されたときに Perl の DynaLoader によってマップされる画像
あなたのスクリプト。 これにより、拡張機能を別のエンティティとして維持できますが、費用はかかります
追加の共有可能なイメージを追跡します。 ほとんどの拡張機能は次のように設定できます
静的または動的のいずれかです。

拡張機能のソース コードは通常、独自のディレクトリにあります。 少なくとも XNUMX つ
通常、以下のファイルが提供されます。 Extshortname.xs (どこで 拡張ショートネーム の部分です
最後の "::" に続く拡張子の名前)、XS コードを含み、 Extshortname.pm
拡張用の Perl ライブラリ モジュール、および メイクファイル.PLを使用する Perl スクリプト
Perl に付属の「MakeMaker」ライブラリ モジュールは、 説明.MMS ファイル
拡大。

装着 静的な エクステンション
静的拡張機能は直接組み込まれるため、 PerlShr.Exe、再構築する必要があります
Perl に新しい拡張機能を組み込みます。 メインを編集する必要があります 説明.MMS or メークファイル フォーム
拡張機能の名前を「ext」マクロに追加し、拡張機能の
オブジェクト ファイルを「extobj」マクロに追加します。 また、拡張機能のオブジェクト ファイルをビルドする必要があります。
メインに依存関係を追加することによって 説明.MMS、または別の 説明.MMS for
拡張子。 その後、再構築します PerlShr.Exe 新しいコードを組み込む。

最後に、拡張機能の Perl ライブラリ モジュールを [.Extname]
@INC 内のいずれかのディレクトリの下にあるサブディレクトリ。 内線名 の名前です
すべての「::」を「.」に置き換えた拡張子。 (例: 拡張 Foo::Bar のライブラリ モジュール
にコピーされます [.Foo.Bar] サブディレクトリ)。

装着 ダイナミック エクステンション
一般に、Perl 拡張機能の配布キットには、Makefile.PL という名前のファイルが含まれています。
これは、を作成するために使用される Perl プログラムです。 説明.MMS 使えるファイル
拡張機能に必要なファイルをビルドしてインストールします。 キットは、
ディレクトリツリー メインの Perl ソース ディレクトリの下、およびビルド手順
拡張子は単純です

$ perl Makefile.PL ! Descrip.MMS の作成
$ mmk ! 必要なファイルをビルドする
$ mmk テスト ! 提供されている場合は、テスト コードを実行します
$ mmk インストール ! パブリック Perl ツリーにインストールする

Perl の現在のリリースでのこのプロセスの VMS サポートは、ほとんどを処理するのに十分です。
拡張機能。 (インストール オプションの詳細については、MakeMaker のドキュメントを参照してください。
拡張機能。)

・ NS [.Lib.Auto.Arch$PVersExtname] @INC 内のいずれかのディレクトリのサブディレクトリ
(どこで Pvers $] で提供される、使用している Perl のバージョンです。
'_' に変換)、または

· @INC 内のディレクトリの XNUMX つ、または

· 拡張 Perl ライブラリ モジュールが DynaLoader に渡すディレクトリ
共有可能な画像をマッピングするように依頼する、または

· システム$共有 or システム$ライブラリ.

共有可能なイメージがこれらの場所のいずれにもない場合は、論理名を定義する必要があります
拡張ショートネームここで、 拡張ショートネーム 拡張子の名前の最後の部分です。
「::」は、共有可能なイメージの完全なファイル仕様に変換されます。

File 仕様


構文
Perl に VMS スタイルと Unix スタイルの両方のファイル仕様を認識させようとしました。
可能な限り。 コマンドラインとスクリプトでは、いずれかまたは両方のスタイルを使用できます。
ただし、XNUMX つのファイル仕様内で XNUMX つのスタイルを組み合わせることはできません。 VMS パール
CRTL とほぼ同じ方法で Unix パス名を解釈します (マシン情報の記入> という構文でなければなりません。例えば、 の最初のコンポーネント
絶対パスは、VMS ファイル仕様のデバイス名として読み取られます)。 セットがあります
"VMS::Filespec" パッケージで提供される関数の明示的な相互変換
VMS と Unix の構文。 そのドキュメントに詳細が記載されています。

Perl ライブラリ モジュールの Unix 構文への依存を最小限に抑えようとしましたが、
これらの一部、および Unix システム用に作成された一部のスクリプトでは、
「/」がディレクトリ区切り文字であると想定されるため、Unix 構文を使用することに注意してください。 等々
Perl ディストリビューション自体にこれのインスタンスが見つかった場合は、お知らせください。
それらを回避しようとすることができます。

また、VMS で Perl プログラムを操作しているときに、特定のオペレーティング システムで構文が必要な場合は、
システム形式の場合、適切な DECC$ 機能論理をチェックする必要があります。
変換ルーチンを呼び出して、その形式に強制します。

フィーチャーの論理名 DECC$FILENAME_UNIX_REPORT は、従来の Perl の動作を変更します。
従うための Unix から VMS フォーマットへのファイル仕様の変換
CRTL で期待されるようになった拡張文字処理規則。 具体的には、このとき
機能が有効になると、Unix パスの "./.../" は "[.^.^.^.]" に変換されるようになりました。
従来の VMS "[...]" の。 VMS の場合、MakeMaker が期待するものと互換性があるため
path は Unix パスに変換できず、そのまま渡されるため、
"unixify("[...]")" は "[...]" を返します。

変換ルーチンが、
入力ファイル名は Unix 形式または VMS 形式です。これは、VMS と Unix ファイルの両方であるためです。
仕様には、
他のタイプ。 したがって、一部のパス名は、どちらのタイプも許可するモードでは使用できません
存在するパス名の。 Perl は、あいまいなファイル名が Unix にあると想定する傾向があります。
形式でダウンロードすることができます。

「。」を許可します。 バージョン区切り文字は、
pathname は、VMS 形式または拡張ファイル構文を使用した Unix 形式です。 する方法はありません
に渡すときに、「perl-5.8.6」が Unix の「perl-5.8.6」か VMS の「perl-5.8;6」かがわかります。
unixify() or vmsify().

DECC$FILENAME_UNIX_REPORT 論理名は、Perl がファイル名を解釈する方法を制御します。
Perl が多くの目的で CRTL を内部的に使用し、CRTL に従おうとする範囲
ファイル名を報告するための規則。 DECC$FILENAME_UNIX_ONLY 機能は、次の点で異なります。
C ランタイムに渡されるすべてのファイル名がすでに Unix 形式になっていると想定しています。 これ
Perl は従来の OpenVMS ファイルを使用するため、この機能は Perl ではまだサポートされていません
内部およびテストハーネスの仕様であり、これがこれであるかどうかはまだ明確ではありません
モードは便利または使用可能になります。 機能の論理名 DECC$POSIX_COMPLIANT_PATHNAMES
RMS シンボリック リンク SDK で新しく追加され、OpenVMS v8.3 に含まれていますが、まだ
Perl でサポートされています。

ファイル名 シミュレーション例
Perl はデフォルトで DECC$EFS_CASE_PRESERVE と DECC$ARGV_PARSE_STYLE を有効にします。 注意してください
後者は、Perl が実行されるプロセスで拡張解析が設定されている場合にのみ有効になります。
ランニング。 これらの機能が環境で明示的に無効になっている場合、または CRTL が無効になっている場合
それらをサポートしていないため、Perl はコマンドラインを小文字にするという従来の CRTL の動作に従います。
引数と返されるファイル仕様は小文字のみです。

N. B. 外部の他のプログラムを組み合わせて使用​​すると、つまずくのは非常に簡単です。
ユーティリティ、および大文字と小文字を処理できるさまざまな状態の Perl スクリプト
保存。 たとえば、古いバージョンのアーカイブ ユーティリティまたは
MMK や MMS などのビルド ユーティリティは、
ODS-5 ボリューム。 このファイル名が後で Perl スクリプトまたはモジュールによって取得された場合
環境を維持するため、大文字の名前は大文字と小文字の混合または小文字と一致しない場合があります
Perl コードの期待。 あなたの最善の策は、オールオアナッシングアプローチに従うことです
ケースの保存: まったく使用しないか、ツールチェーン全体と
アプリケーション環境をサポートし、それを使用します。

OpenVMS Alpha v7.3-1 以降および OpenVMS I64 のすべてのバージョンは、大文字と小文字の区別をサポートしています。
プロセス設定 (「SET PROCESS /CASE_LOOKUP=SENSITIVE」を参照)。 Perl は現在、
VMS では大文字と小文字の区別がサポートされていますが、将来的にはそうなる可能性があるため、Perl プログラムでは
"File::Spec->case_tolerant" メソッドを使用して、$^O 変数ではなく、状態を判別します。

シンボリック リンク
シンボリック リンクを有効にして ODS-5 ボリューム上に構築すると、Perl はデフォルトで
ファイルシステムと CRTL で必要なサポートが利用可能な場合のシンボリック リンク
(通常は 64 ビット OpenVMS v8.3 以降)。 いくつかの制限と注意事項があります
VMS でシンボリック リンクを使用する場合に注意してください。 最も注目すべきは、
有効なシンボリック リンクは、Unix スタイルのパスとして表現する必要があり、ボリューム上に存在する必要があります
POSIX ルートから表示できます (DCL ヘルプの「SHOW ROOT」コマンドを参照してください)。 さらなる
シンボリック リンクの機能と要件の詳細については、CRTL マニュアルの第 12 章を参照してください。
OpenVMS v8.3 以降に同梱されています。

ワイルドカード 拡大
ワイルドカードを含むファイル指定は、コマンド ラインと内部の両方で許可されます。
Perl グロブ (例: "<*.c>")。 ワイルドカード filespec が VMS 構文を使用する場合、結果として
filespecs は VMS 構文に従います。 Unix スタイルのファイル仕様が渡された場合、Unix スタイル
filespecs が返されます。 Unix のワイルドカード グロビングの動作に似ています。
シェルでは、perl を二重引用符 """ で囲んでコマンド ライン ワイルドカードをエスケープできます
プログラムのコマンド ライン引数。 ただし、運ばれる「」」文字の除去により、
argv の C 処理によって、このような構造をエスケープする必要があります (
ファイルを含むディレクトリ PERL.C, PERL.EXE, パールH, PERL.OBJ):

$ perl -e "print join(' ',@ARGV)" perl.*
perl.c perl.exe perl.h perl.obj

次の三重引用符の方法で:

$ perl -e "print join(' ',@ARGV)" """perl.*"""
パール*

引用符で囲まれていないコマンド ライン引数の場合、または "glob()" VMS ワイルドカードの呼び出しの場合
拡張が実行されます。 (使用する場合、csh スタイルのワイルドカード展開が利用可能です。
"File::Glob::glob".) ワイルドカード ファイル指定にデバイスまたはディレクトリが含まれている場合
仕様の場合、結果のファイル仕様にもデバイスとディレクトリが含まれます。
そうしないと、デバイスとディレクトリの情報が削除されます。 VMS スタイルの結果ファイル仕様
完全なデバイスとディレクトリが含まれますが、Unix スタイルの結果のファイル仕様は
入力ファイル仕様に存在していたディレクトリ パスのみが含まれます。 為に
たとえば、デフォルトのディレクトリが Perl_Root:[000000] の場合、「[.t]*.*」の展開は
"perl_root:[t]base.dir" のような filespec を生成しますが、"t/*/*" を展開すると生成されます
「t/base.dir」のようなファイル仕様。 (これは、グロブ展開の動作に一致させるために行われます
Unix シェルによって実行されます。)

同様に、結果の filespec には、ファイル バージョンが存在する場合にのみファイル バージョンが含まれます。
入力ファイル仕様。

パイプ
Perl ファイルハンドルへの入力パイプと出力パイプがサポートされています。 「ファイル名」が渡されます
リブ$スポーン() 非同期実行用。 あなたが持っているすべてのパイプを閉じるように注意する必要があります
Perl スクリプトで開かれ、Perl の実行時に「孤立した」サブプロセスが残らないようにします。
終了します。

バッククォートを使用して DCL サブプロセスを呼び出すこともできます。その出力はリターンとして使用されます。
式の値。 バッククォートの間の文字列は、
「システム」演算子への引数 (以下を参照)。 この場合、Perl は
サブプロセスを完了してから続行してください。

パイプと通信するために perl が作成できるメールボックス (MBX) のデフォルトはバッファ
サイズは 8192 ビット システムでは 64、VAX では 512 です。 デフォルトのバッファ サイズは、
論理名 PERL_MBX_SIZE (値が 128 と SYSGEN の間である場合)
パラメータ MAXBUF を含みます。 たとえば、メールボックスのサイズを 32767 に設定するには、次を使用します。
"$ENV{'PERL_MBX_SIZE'} = 32767;" 次に、パイプ構造を開いて使用します。 代替案
次のコマンドを発行します。

$ PERL_MBX_SIZE 32767 を定義

ワイド レコード パイプ プログラムを実行する前に。 値を大きくすると、パフォーマンスが向上する場合があります。
BYTLM UAF クォータの費用。

Perl5Lib および ペルリブ


PERL5LIB と PERLLIB の論理名は、perl で説明されているように機能しますが、要素が
セパレータは「|」ですそれ以外の ':'。 ディレクトリ仕様は、VMS または Unix のいずれかを使用できます。
構文。

この パール 分岐した デバッガ


Perl フォーク デバッガーは、デバッガー コマンドと出力を別の X-11 ファイルに配置します。
複数のプロセスからのコマンドと出力が混在しないようにするためのターミナル ウィンドウ
一緒に。

VMS 上の Perl は、Perl が VMS システムで実行されている場合、フォークされたデバッガーのエミュレーションをサポートします。
X11 サポートがインストールされている。

フォークされたデバッガーを使用するには、デフォルトのディスプレイを X-11 サーバーに設定し、
Unix が予期するいくつかの環境変数セット。

フォークされたデバッガーでは、環境変数「TERM」が「xterm」である必要があり、
環境変数「DISPLAY」が存在すること。 「xterm」は小文字でなければなりません。

$define TERM "xterm"

$define DISPLAY "ホスト名:0.0"

現在、「DISPLAY」の値は無視されます。 に設定することをお勧めします。
Unix 表記のディスプレイ、サーバー、および画面のホスト名。 これからの価値
デフォルトの表示を使用する代わりに、Perl が DISPLAY の値を受け入れる場合があります。

フォークされたデバッガーを常に使用して、スクリプト I/O を分離すると便利な場合があります。
デバッガー I/O。 論理変数に値を代入することで、デバッガを強制的にフォークできます。
名前これはプロセス識別番号ではありません。

$define PERLDB_PIDS XXXX

PERL_VMS_EXCEPTION_DEBUG


PERL_VMS_EXCEPTION_DEBUG が「ENABLE」として定義されていると、VMS デバッガーが
他の方法では処理されない致命的な例外が発生した場合に呼び出されます。 これの目的
そのような状態を引き起こす可能性のある内部の Perl の問題をデバッグできるようにすることです。

これにより、プログラマーは実行スタックと変数を調べて、
例外の原因。 Perlインタープリターが約
致命的な終了を行うには、通常、デバッグ モードで実行を継続することは実用的ではありません。

VMS デバッガーで Perl を起動すると、プログラムの実行プロファイルが次のように変更される場合があります。
そのような問題は再現されません。

「kill」機能を使用して、プログラム内からこの機能をテストできます。

典型的な VMS スタイルでは、この論理名の値の最初の文字だけが実際に
大文字と小文字を区別しないモードでチェックされ、値の場合は有効と見なされます
「T」、「1」または「E」。

この論理名は、Perl を開始する前に定義する必要があります。

Command ライン


I / O 出力先変更 および 背景
Perl for VMS は、サブセットを使用して、コマンド ラインでの入力と出力のリダイレクトをサポートします。
Bourne シェルの構文:

· "

· ">file" は stdout を "file" に書き込みます。

· ">>file" は stdout を "file" に追加します。

· "2>file" は stderr を "file" に書き込みます。

· "2>>file" は stderr を "file" に追加し、

· "2>&1" は stderr を stdout にリダイレクトします。

さらに、文字「|」を使用して、出力をサブプロセスにパイプすることもできます。 その後は何でも
コマンドラインのこの文字は、実行のためにサブプロセスに渡されます。 サブプロセス
Perl の出力を入力として受け取ります。

最後に、コマンド ラインが「&」で終わる場合、コマンド全体がバックグラウンドで次のように実行されます。
非同期サブプロセス。

Command ライン スイッチ
次のコマンド ライン スイッチは、VMS での動作が で説明されているものとは異なります。
perlrun. 大文字のスイッチを Perl に渡すには、次のように囲む必要があることにも注意してください。
CRTL は引用符で囲まれていないすべての文字列を小文字にするため、コマンド ラインでは二重引用符で囲みます。

より新しい 64 ビット バージョンの OpenVMS では、プロセス設定によって、引用が有効かどうかが制御されるようになりました。
コマンドライン引数の大文字と小文字を保持するために必要です。

-i 「-i」スイッチが存在するが、バックアップ コピーの拡張子が指定されていない場合、
インプレース編集では、ファイルの新しいバージョンが作成されます。 既存のコピーは削除されません。
(拡張子が指定されている場合、既存のファイルはバックアップ ファイルに名前が変更されることに注意してください。
他のオペレーティング システムの場合と同様に、以前のバージョンとしては残りません。
元のファイル名の下のバージョン)。

-S 「-S」または「-"S"」スイッチが存在する場合 および スクリプト名に
ディレクトリの場合、Perl は論理名 DCL$PATH をそれぞれを使用して検索リストとして変換します。
スクリプトを探すディレクトリとしての翻訳。 また、ファイルがない場合
type が指定されている場合、Perl は各ディレクトリで名前に一致するファイルを探します
指定された、空白のタイプで、タイプ .pl、および種類 .COM、この順序で。

-u "-u" スイッチを指定すると、Perl プログラムの実行後に VMS デバッガーが呼び出されます。
コンパイル済みですが、実行前です。 コア ダンプ ファイルは作成されません。

パール 機能


このドキュメントが最後に改訂された時点で、次の Perl 関数が
Perl の VMS ポートに実装されています (* でマークされた機能については、さらに詳しく説明します)。
以下):

ファイル テスト*、abs、アラーム、atan、バックティック*、binmode*、bless、
発信者、chdir、chmod、chown、chomp、chop、chr、
close、closedir、cos、crypt*、定義済み、削除、死ぬ、do、dump*、
それぞれ、endgrent、endpwent、eof、eval、exec*、exists、exit、exp、
fileno、群れ getc、getgrent*、getgrgid*、getgrnam、getlogin、
getppid、getpwent*、getpwnam*、getpwuid*、glob、gmtime*、goto、
grep、hex、ioctl、import、index、int、join、keys、kill*、
最後、lc、lcfirst、lchown*、長さ、リンク*、ローカル、ローカルタイム、ログ、
lstat、m//、map、mkdir、my、next、no、oct、open、opendir、ord、
パック、パイプ、ポップ、ポス、プリント、printf、プッシュ、q//、qq//、qw//、
qx//*、quotemeta、rand、read、readdir、readlink*、redo、ref、
名前の変更、require、reset、return、reverse、rewinddir、rindex、
rmdir、s///、スカラー、seek、seekdir、select(内部)、
select (システムコール)*、setgrent、setpwent、shift、sin、sleep、
socketpair、ソート、スプライス、スプリット、sprintf、sqrt、srand、stat、
研究、substr、シンボリックリンク*、sysread、system*、syswrite、tell、
telldir、tie、time、times*、tr///、uc、ucfirst、umask、
undef、unlink*、unpack、untie、unshift、use、utime*、
値、vec、wait、waitpid*、wantarray、warn、write、y///

次の関数は VMS ポートに実装されていませんでした。
致命的なエラー (通常) または未定義の動作 (まれですが、希望します):

chroot、dbmclose、dbmopen、fork*、getpgrp、getpriority、
msgctl、msgget、msgsend、msgrcv、semctl、
semget、semop、setpgrp、setpriority、shmctl、shmget、
shmread、shmwrite、syscall

次の関数は、Dec C 5.2 以降でコンパイルされた Perl で使用できます。
VMS 7.0 以降を実行している場合:

切り詰める

次の関数は、VMS 7.2 以降でビルドされた Perl で使用できます。

fcntl (ロックなし)

次の関数は、ソケットのタイプに応じて実装される場合と実装されない場合があります。
Perl のコピーに組み込んだサポート:

受け入れ、バインド、接続、getpeername、
gethostbyname、getnetbyname、getprotobyname、
getservbyname、gethostbyaddr、getnetbyaddr、
getprotobynumber、getservbyport、gethostent、
getnetent、getprotoent、getservent、sethostent、
setnetent、setprotoent、setservent、endhostent、
endnetent、endprotoent、endservent、getsockname、
getsockopt、listen、recv、select(システムコール)*、
送信、setsockopt、シャットダウン、ソケット

次の関数は、ハード リンクを備えた 64 ビット OpenVMS v8.2 上に構築された Perls で使用できます。
ODS-5 フォーマットのビルド ディスクで有効になります。 CRTL のサポートは、原則として現在利用可能です。
OpenVMS v7.3-1、およびより優れた構成サポートにより、これを検出できます。



次の関数は、64 ビット OpenVMS v8.2 以降でビルドされた Perls で使用できます。
CRTL のサポートは原則として OpenVMS v7.3-2 で利用可能になり、構成が改善されました
サポートはこれを検出できます。

getgrgid、getgrnam、getpwnam、getpwuid、
setgrent、ttyname

次の関数は、64 ビット OpenVMS v8.2 以降でビルドされた Perls で使用できます。

statvfs、ソケットペア

ファイル テスト
テスト "-b"、"-B"、"-c"、"-C"、"-d"、"-e"、"-f"、"-o"、"-M"、"-s "、"-S"、"-t"、
「-T」と「-z」は宣伝どおりに機能します。 「-r」、「-w」、および「-x」の戻り値は、
実際にファイルにアクセスできるかどうか。 これは、UIC ベースのファイルを反映していない可能性があります
保護。 VMS では実際の UIC と有効な UIC に違いはないので、"-O"、"-R"、"-W"、
および "-X" は、"-o"、"-r"、"-w"、および "-x" と同等です。 同様に、他のいくつかの
「-A」、「-g」、「-k」、「-l」、「-p」、「-u」を含むテストは、特に
VMS の下で意味があり、これらのテストによって返される値は、
CRTL の "stat()" ルーチンは、st_mode フィールドの同等のビットに対して実行します。 最後に「-d」
明示的なディレクトリなしでデバイス仕様が渡された場合は true を返します (例:
"DUA1:")、およびディレクトリが渡された場合。

DECC 機能の論理名と、制御も行う ODS-5 ボリューム属性があります。
日付フィールドに返される値。

注: 一部のサイトでは、ファイル アクセス テスト (「-r」、「-w」、
および「-x」) DEC の DFS 経由でアクセスされるファイル。 具体的には、DFS は現在のところ
リモート ボリューム上のファイルの拡張ファイル ヘッダーへのアクセスを提供し、
ACL を調べると失敗し、ファイル テストは $! で false を返します。 ことを示す
ファイルが存在しません。 UIC をチェックするため、これらのファイルで「stat」を使用できます。
ベースの保護のみを行い、適切なビットを手動でチェックします。
あなたのCコンパイラの ステータスh、近似が必要な場合は、返されるモード値で
ファイルの保護の。

バックティック
バッククォートはサブプロセスを作成し、囲まれた文字列をサブプロセスに渡します。
DCL コマンド。 サブプロセスは "lib$spawn()" を介して直接作成されるため、有効な任意の
DCL コマンド文字列を指定できます。

binmodeファイルハンドル
「binmode」オペレーターは、キャリッジ制御の変換がないことを保証しようとします。
このファイルハンドルへの入力または出力で発生します。 これには、
この関数が FALSE を返す場合、そのファイル位置インジケータを復元します。
基になるファイルハンドルは、開いているファイルを指していないか、別のファイルを指している可能性があります
「binmode」が呼び出される前とはファイル内の位置が異なります。

通常のファイルハンドルを使用する場合、「binmode」は一般に必要ないことに注意してください。 それは
次の場合に、既存のレコード構造ファイルへの I/O を制御できるように提供されています。
必要。 VMS::Stdio 拡張機能の「vmsfopen」関数を使用して、
レコード構造が異なるファイルやデバイスへの I/O をより細かく制御できます。

暗号化プレーンテキスト、ユーザー
「crypt」オペレータは、「sys$hash_password」システム サービスを使用して、
PLAINTEXT のハッシュ表現。 USER が有効なユーザー名である場合、アルゴリズムと
ソルト値は、そのユーザーの UAF レコードから取得されます。 そうでない場合は、優先
アルゴリズムと 0 のソルトが使用されます。 クワッドワードで暗号化された値は、
8文字の文字列。

「crypt」によって返される値は、暗号化されたパスワードと比較できます。
ユーザーを認証するために、「getpw*」関数によって返される UAF。 もしあなたが〜なら
これを行うには、UAF の暗号化されたパスワードが次を使用して生成されたことを思い出してください。
大文字のユーザー名とパスワードの文字列。 引数を大文字にする必要があります
「crypt」を使用して、適切な値を取得できるようにします。

サブvalidate_passwd {
my($user,$passwd) = @_;
私の($pwdash);
if ( !($pwdhash = (getpwnam($user))[1]) ||
$pwdhash ne crypt("\U$passwd","\U$name") ) {
intruder_alert($name);
}
1リターン;
}

die "die" は、ネイティブ VMS の終了ステータスを強制的に SS$_ABORT コードにします。
$! または$? ステータス値は、ネイティブステータスが解釈される原因となる値です
VMS が DCL エラー処理の SEVERE_ERROR 重大度として分類するものとして。

「PERL_VMS_POSIX_EXIT」がアクティブな場合 (以下の「$?」を参照)、ネイティブ VMS の終了ステータス
値は $! のいずれかになります。 または$? または $^E または Unix 値 255 にエンコードされた
有効な元の値が、書かれた他のプログラムによってデコードできる方法で
Perl と GNV パッケージを含む C で。 「死ぬ」の通常の非 VMS 動作に従って
$! または$? ゼロでない場合、これらの値の XNUMX つがネイティブ VMS にエンコードされます
ステータス値。 Unix ステータス値が両方とも 0 で、$^E 値が XNUMX に設定されている場合
ERROR または SEVERE_ERROR 重大度の場合、$^E 値が終了コードとして使用されます。
は。 上記のいずれにも当てはまらない場合、Unix 値の 255 はネイティブにエンコードされます。
VMS 終了ステータス値。

"die" の動作に大きな違いがあることに注意してください。
「PERL_VMS_POSIX_EXIT」モードは、VMS SEVERE_ERROR ステータスを強制しないことです。
出口。 2 から 255 の Unix 終了値は、VMS ステータス値にエンコードされます。
SUCCESS の重大度レベル。 Unix の終了値 1 は、VMS ステータスでエンコードされます
重大度レベルが ERROR の値。 これは、VMS C の方法と互換性があります。
ライブラリはこれらの値をエンコードします。

「PERL_VMS_POSIX_EXIT」モードで「die」によって設定された最小重大度レベルが変更される可能性があります
テストの結果に応じて、将来的にERROR以上になる可能性があります。
レビュー。

「$?」を参照してください。 ネイティブ VMS を生成するための Unix 値のエンコーディングの説明
それを含む状態。

ダンプ
Perl を中止してコアをダンプさせるのではなく、「ダンプ」オペレータは VMS を呼び出します。
デバッガ。 デバッガで Perl プログラムを実行し続けると、制御
「ダンプ」への引数として指定されたラベルに転送されます。ラベルがない場合は、
プログラムの先頭に戻ります。 プログラムの他のすべての状態
(マシン情報の記入> という構文でなければなりません。例えば、 変数の値、開いているファイル ハンドル) は、「ダンプ」を呼び出しても影響を受けません。

実行リスト
"exec" を呼び出すと、Perl は終了し、引数として与えられたコマンドを呼び出します。
"lib$do_command" による "exec" への引数。 引数が「@」または「$」で始まる場合
(filespec の一部として以外)、DCL コマンドとして実行されます。 さもないと、
コマンド ラインの最初のトークンは、実行するイメージのファイル仕様として扱われます。
それを呼び出す試みが行われます(を使用して 。EXE プロセスはデフォルトで展開します
filespec) を作成し、"exec" の残りの引数をパラメーターとして渡します。 トークンの場合
ファイル タイプがなく、null タイプのファイルに一致する場合、次の試行が行われます。
ファイルが「MCR」を使用して呼び出す必要がある実行可能イメージであるかどうかを判断します
または、コマンド プロシージャとして DCL に渡されるテキスト ファイル。

フォーク
原則として、「フォーク」演算子は (および同じ方法で実装できます)
CRTL "vfork()" ルーチンなどのかなり厳しい制限、およびいくつかの内部的な制限
それを行うためのサポートは整っていますが、実装は完了していません。
「フォーク」を現在利用できないようにします。 将来、真のカーネル「fork()」が期待されます
VMS のバージョン、およびインタプリタ スレッドに基づく疑似フォークは、
VMS 上の Perl の将来のバージョン (perlfork を参照)。 とりあえず「システム」を使って、
サブプロセスを作成するためのバッククォート、またはパイプされたファイルハンドル。

行った
ゲットプナム
getpwid
これらの演算子は、perlfunc に記述されている情報を取得します。
「sys$getuai」を介して指定ユーザーの UAF 情報を取得するために必要な権限。
そうでない場合は、$name、$uid、および $gid アイテムのみが返されます。 $dir アイテム
VMS 構文のログイン ディレクトリが含まれ、$comment 項目にはログインが含まれます。
UNIX 構文のディレクトリ。 $gcos アイテムには、UAF レコードの所有者フィールドが含まれています。
$quota アイテムは使用されません。

グラムタイム
CRTL "gmtime()" が動作している場合、"gmtime" 演算子は適切に機能します。
または論理名 SYS$TIMEZONE_DIFFERENTIAL がルーチンの数として定義されている場合
現地時間を得るために UTC に追加する必要がある秒。 (この論理名は定義されています。
UTC サポートが組み込まれたバージョンの VMS を実行している場合は、自動的に
これらのケースのどちらも真でない場合、警告メッセージが表示され、「undef」が返されます。

kill
ほとんどの場合、"kill" は文書化されていないシステム サービス $SIGPRC を介して実装されます。
$FORCEX と同じ呼び出しシーケンスを持ちますが、ターゲットで例外をスローします
$EXIT の呼び出しを強制するのではなく、処理します。 一般的に言えば、「殺す」は次のようになります。
CRTL の「kill()」関数の動作とは異なりますが、その関数とは異なり、
シグナルハンドラ内。 また、CRTL の一部のバージョンの「kill」とは異なり、Perl の
「kill」は、渡されたシグナルの有効性をチェックし、エラーではなくエラーを返します。
認識されていない信号を送信しようとしています。

また、負の信号値は VMS では特別なことをしません。 彼らはただ
対応する正の値に変換されます。

qx//
上記の「バックティック」のエントリを参照してください。

select (システムコール)
Perl がソケットをサポートするようにビルドされていない場合、"select" のシステム コール バージョンはサポートされていません。
まったく利用可能です。 ソケットサポートが存在する場合、システムコールのバージョン
「選択」機能は、ソケットに接続されたファイル記述子に対してのみ機能します。 それは提供しません
通常のファイルまたはパイプに関する情報。CRTL の「select()」ルーチンは
この機能を提供します。

統計経験値
VMS は Unix とは異なるスキームに従ってファイルを追跡するので、そうではありません。
の「st_dev」および「st_ino」フィールドでファイルの ID を表すことは実際に可能です。
「構造体統計」。 Perl は最善を尽くしますが、使用する値は非常に優れています。
XNUMX つの異なるファイルで同じになる可能性は低いです。 ただし、これを保証することはできませんので、
スクリプト作成者に警告します。

システムリスト
「システム」オペレーターはサブプロセスを作成し、その引数をサブプロセスに渡します
DCL コマンドとして実行します。 サブプロセスは直接作成されるため、
"lib$spawn()" には、有効な DCL コマンド文字列を指定できます。 文字列が始まる場合
'@' を指定すると、無条件に DCL コマンドとして扱われます。 そうでなければ、最初の場合
トークンには、ファイル指定で区切り文字として使用される文字が含まれています (例: ":" または
"]")、デフォルトのタイプの 。EXE そしてプロセス
成功した場合、結果のファイルは「MCR」を介して呼び出されます。 これにより、
ファイル仕様を「system」に渡すだけでイメージを直接呼び出すには、
Unixish の一般的なイディオム。 トークンにファイル タイプがなく、null のファイルと一致する場合
タイプである場合、ファイルが実行可能イメージであるかどうかを判断しようとします。
これは、「MCR」またはテキスト ファイルを使用して呼び出す必要があり、DCL に
コマンド手順。

LIST が空の文字列で構成されている場合、"system" はインタラクティブな DCL サブプロセスを生成します。
タイピングと同じように スポーン DCL プロンプトで。

Perl はサブプロセスが完了するのを待ってから、現在のプロセスで実行を継続します。
処理する。 perlfunc で説明されているように、「system」の戻り値は偽の「status」です
これは、プラグマ「use vmsish 'status'」が有効でない限り、POSIX セマンティクスに従います。
$? の説明を参照してください。 詳細については、このドキュメントを参照してください。

時間
「time」によって返される値は、01 年 1970 月 00 日 00:00:XNUMX からの秒単位のオフセットです (ちょうど
CRTLのように times() から入ってくるコードの生活を楽にするために
POSIX/Unix の世界。

<font style="vertical-align: inherit;">回数</font>
「times」演算子によって返される配列は、同じ規則に従って分割されます
CRTL "times()" ルーチン。 したがって、「システム時間」要素は常に 0 になります。
VMS では「ユーザー時間」と「システム」時間に違いがないため、
サブプロセスによって蓄積された時間は、「子時間」に個別に表示される場合と表示されない場合があります
"times()" がサブプロセスを個別に追跡するかどうかによって異なります。 ノート
特に、VAXCRTL は (少なくとも) を使用して生成されたサブプロセスのみを追跡します。
"fork()" および "exec()"; によって生成されたサブプロセスの時間は累積されません
パイプ、「system()」、またはバッククォート。

リストのリンクを解除
「リンク解除」は、ファイルの最新バージョンのみを削除します。 すべて削除するには
バージョン、あなたが言う必要があります

LIST のリンクを解除している間は 1。

Unix システム用に書かれたスクリプトにこの変更を加える必要があるかもしれません。
「unlink」の呼び出し後、「unlink」に渡された名前のファイルは存在しません。
(注: これはコンパイル時に変更できます。「構成を使用」し、
$Config{'d_unlink_all_versions'} が「define」の場合、「unlink」はすべてのバージョンを削除します
最初の呼び出しでファイルの。)

「リンク解除」は、ファイルの変更が必要な場合でも、可能であればファイルを削除します
保護 (ただし、親ディレクトリの保護を変更しようとはしません)。
を使用して、ファイルへの明示的な削除アクセス権を持っているかどうかを確認できます。
"VMS::Filespec::candelete" 演算子。 たとえば、ファイルのみを削除するには、
あなたが削除アクセス権を持っている場合、次のように言うことができます

サブ safe_unlink {
私の($file,$num);
foreach $ファイル (@_) {
次でない限り VMS::Filespec::candelete($file);
$num += $file のリンクを解除します。
}
$num;
}

(または、VMS::Stdio がインストールされている場合は、"VMS::Stdio::remove" を使用することもできます)
Perl で配布される拡張機能)。 「リンク解除」でファイル保護を変更する必要がある場合
ファイルを削除し、途中で中断すると、ファイルはそのまま残る場合がありますが、
変更された ACL を使用すると、アクセスを削除できます。

この「リンク解除」の動作は、POSIX の動作と互換性があり、従来の動作ではありません。
VMS の動作。

ユータイムリスト
このオペレーターは、ファイルの変更時刻 (VMS 改訂日) のみを変更します。
アクセス日付が有効になっていない ODS-2 ボリュームおよび ODS-5 ボリューム。 ODS-5 ボリュームで
アクセス日を有効にすると、実際のアクセス時刻が変更されます。

waitpid PID、フラグ
PID が、パイプされた「open()」(open を参照) によって開始されたサブプロセスである場合、「waitpid」は
そのサブプロセスを実行し、その最終ステータス値を $? で返します。 PID がサブプロセスの場合
他の方法で作成された場合 (たとえば、Perl が呼び出される前に SPAWNed)、"waitpid" は
プロセスが完了したかどうかを XNUMX 秒に XNUMX 回確認し、完了したら戻ります。
もっている。 (PID が現在のプロセスのサブプロセスではないプロセスを指定している場合、
「-w」スイッチを指定して Perl を起動すると、警告が発行されます。)

成功すると PID を返し、エラーの場合は -1 を返します。 FLAGS 引数は常に無視されます。

パール variables


次の VMS 固有の情報は、示された「特別な」Perl 変数に適用されます。
perlvar の一般的な情報に加えて。 競合がある場合、これは
情報が優先されます。

%ENV
%ENV 配列の操作は、論理名の変換に依存します。
PERL_ENV_TABLES. 定義されている場合、それは検索リストである必要があり、その各要素は
%ENV 要素の場所を指定します。 Perl に要素の読み取りまたは設定を指示すると、
"$ENV{""}" の場合、Perl は次の翻訳を使用します PERL_ENV_TABLES 次のように:

CRTL_ENV
この文字列は Perl に、キーと値の CRTL の内部「環境」配列を参照するように指示します。
ペア、使用 キーとして。 ほとんどの場合、これにはいくつかのキーしか含まれていませんが、
Perl が C の "exec[lv]e()" 関数を介して呼び出された場合、一部の場合のように
組み込みの Perl アプリケーション、または GNV bash などのシェルで実行している場合、
「environ」配列は、呼び出しプログラムによって取り込まれた可能性があります。

CLISYM_[ローカル]
「CLISYM_」で始まる文字列は、Perl に CLI のシンボル テーブルを調べるように指示します。
シンボルの名前として。 %ENV の要素を読み取るとき、ローカル
シンボル テーブルが最初にスキャンされ、次にグローバル シンボル テーブルがスキャンされます。
「CLISYM_」に続く文字は、%ENV の要素が設定されている場合、または
削除: 完全な文字列が「CLISYM_LOCAL」の場合、変更はローカルで行われます
記号表; それ以外の場合は、グローバル シンボル テーブルが変更されます。

その他の文字列
の要素の場合 PERL_ENV_TABLES 他の文字列に変換されます。その文字列は
を使用して参照される論理名テーブルの名前として使用されます。 として
論理名。 アクセス モードの通常の検索順序が使用されます。

PERL_ENV_TABLES Perl の起動時に一度翻訳されます。 その間に行った変更
Perl が実行されていても、%ENV の動作には影響しません。 もしも PERL_ENV_TABLES ではありません
定義されている場合、Perl はデフォルトで、指定された論理名テーブルを最初に調べます。
LNM$FILE_DEV、次に CRTL "environ" 配列。 このデフォルトの順序は、次の場合に逆になります。
論理名 GNV$UNIX_SHELL GNV bash で実行する場合などに定義されます。

%ENV のすべての操作で、キー文字列はすべて大文字であるかのように扱われます。
Perl 式で実際に指定された大文字小文字に関係なく。

%ENV の要素が読み取られると、 PERL_ENV_TABLES ポイントは
順番にチェックされ、最初に成功したルックアップから取得された値が返されます。
%ENV 要素の名前にセミコロンが含まれている場合、それとその後のすべての文字
削除されます。 これらは、CRTL「environ」配列または CLI シンボル テーブルが指定されている場合は無視されます。
相談した。 ただし、名前は論理名テーブルで検索され、接尾辞は
セミコロンは、ルックアップに使用される変換インデックスとして扱われます。 これ
検索リストの論理名の連続する値を検索できます。 たとえば、
あなたは言う

$ 定義 STORY once,upon,a,time,there,was
$ perl -e "for ($i = 0; $i <= 6; $i++) " -
_$ -e "{ print $ENV{'story;'.$i},' '}"

Perl は "ONCE UPON A TIME THERE WAS" を表示します。もちろん、
PERL_ENV_TABLES CLIではなく、論理名「story」が見つかるように設定されています
同じ名前のシンボルまたは CRTL "environ" 要素。

%ENV の要素が定義済み文字列に設定されている場合、対応する定義は次のとおりです。
の最初の翻訳が行われた場所で作成された PERL_ENV_TABLES ポイント。 もしも
これにより、スーパーバイザー モードで定義される論理名が作成されます。 (同じ
既存の論理名がエグゼクティブ モードまたはカーネル モードで定義された場合に実行されます。 を
既存のユーザーまたはスーパーバイザー モードの論理名は新しい値にリセットされます。)
値は空の文字列で、論理名の変換は単一の「NUL」として定義されます
(ASCII "\0") 文字。論理名は長さ XNUMX の文字列に変換できないためです。
(この制限は、CLI シンボルまたは CRTL の「環境」値には適用されません。
空の文字列に。)

%ENV の要素が「undef」に設定されている場合、その要素はあたかもそうであるかのように検索されます。
読み取られ、見つかった場合は削除されます。 (CRTL から「削除」された項目
"environ" 配列は空の文字列に設定されます。) "delete" を使用して要素を削除します
%ENV にも同様の効果がありますが、要素が削除された後、別の試行が行われます
要素を検索するため、内部モードの論理名または別の場所にある名前
削除したばかりの論理名を置き換えます。 いずれの場合も、最初に見つかった値のみ
PERL_ENV_TABLES の検索が変更されました。 を定義することは現在のところ不可能である.
%ENV を介してリストの論理名を検索します。

要素 $ENV{DEFAULT} は特別です: 読み込まれると、Perl の現在のデフォルトを返します
デバイスとディレクトリの定義に関係なく、設定されている場合はそれらをリセットします
PERL_ENV_TABLES. 消去または削除することはできません。 そうしようとする試みは静かに行われます
無視されます。

C ローカル環境配列の要素を
fork/exec によって開始されていないサブプロセス、または C プログラムを実行していないサブプロセスは、次のことができます。
それらを現在のプロセスの論理名に「昇格」し、継承されます
すべてのサブプロセスによって、言うことによって

foreach my $key (qw[昇格させたい C ローカル キー]) {
私の $temp = $ENV{$key}; # C ローカル配列から読み取る
$ENV{$key} = $temp; # 論理名として定義
}

(Perl オプティマイザーは十分に賢いので、単に $ENV{$key} = $ENV{$key} と言うわけにはいきません。
表現を省略します。)

「%ENV = ();」と言って %ENV をクリアしようとしないでください。致命的なエラーがスローされます。 これは
DCL から次を実行するのと同じです。

削除/論理 *

たとえば、SYS$MANAGER または SYS$SYSTEM
論理名が削除されました。

現在、「キー」または「値」を使用して初めて %ENV を反復処理すると、
%ENV を完全に設定するために、すべての論理名が読み取られるため、時間のペナルティが発生します。
後続の反復では論理名を再読み取りしないため、それほど遅くはありませんが、
また、他のプログラムによって引き起こされた論理名テーブルへの変更も反映されません。

プロセス永続ファイルを表す論理名には注意する必要があります。
「SYS$INPUT」や「SYS$OUTPUT」など。 これらの論理名の翻訳は次のとおりです。
0 バイトのバイナリ値 (1x0B 00xXNUMX) が先頭に追加されます。
あなたはそれを使いたいです。 (以前のバージョンの Perl では、値を取得できませんでした。
null バイトが文字列の終わりのマーカーとして機能するため、これらの論理名の

$! $! の文字列値CRTLによって返されるものです strerror() 機能するので、
VMS 固有のエラーの VMS メッセージを含めます。 $! の数値値です
ただし、errno が EVMSERR の場合は除きます。この場合、$! の値を含む
vaxc$errno. 設定 $! 常に errno を指定された値に設定します。 この値が
また、vaxc$errno を 4 (NONAME-F-NOMSG) に設定するため、$!
$! より前の VMS エラー メッセージは反映されません。 設定されました。

$^E この変数は、vaxc$errno の VMS ステータス値への直接アクセスを提供します。
多くの場合、$! の一般的な Unix スタイルのエラー メッセージよりも具体的です。 その数値
value は vaxc$errno の値であり、その文字列値は対応する VMS です
sys$ によって取得されるメッセージ文字列getmsg(). $^E を設定すると、vaxc$errno が
指定された値。

Perl は vaxc$errno の値を最新に保とうとしますが、errno がそうでない場合は
EVMSERR、現在の操作によるものではない可能性があります。

$? $? で返される「ステータス値」 の実際の終了ステータスから合成されます
POSIXに近似する方法でサブプロセス wait (5) Perl を許可するためのセマンティクス
サブプロセスの正常な完了を移植可能にテストするプログラム。 下位 8
$のビット? プロセスの終了ステータスが
例外によって生成されたものではない可能性があります。

次の 8 ビットには、プログラムの終了ステータスが含まれます。

子プロセスが、
_POSIX_EXIT マクロ セット、ステータス値には 0 ~ 255 の実際の値が含まれます
通常の終了時にそのプログラムによって返されます。

_POSIX_EXIT マクロを設定すると、Unix の終了値ゼロは VMS として表されます。
1 のネイティブ ステータス、および 2 ~ 255 の Unix 値は次の式でエンコードされます。

VMS_status = 0x35a000 + (unix_value * 8) + 1。

また、Unix 値 1 の特殊なケースでは、エンコーディングは次のようになります。

VMS_ステータス = 0x35a000 + 8 + 2 + 0x10000000。

その他の終了ステータスの場合、サブプロセスの終了ステータスの重大度部分
使用されます: 重大度が成功または情報である場合、これらのビットはすべて 0 です。 もし
重大度は警告で、値は 1 です。 重大度がエラーまたは致命的であった場合
エラー、それらには実際の重大度ビットが含まれています。
エラーと深刻なエラーの 4。 Fatal は、severe_error ステータスの別の用語です。

その結果、$? サブプロセスの終了ステータスが示されている場合、常にゼロになります
正常終了。警告またはエラーが発生した場合、またはプログラムが終了した場合はゼロ以外。
エンコーディング _POSIX_EXIT 値に準拠して実行され、ステータスが設定されました。

VMS の結果であるゼロ以外のステータスの違いをどのように見分けることができますか?
ネイティブ エラー ステータスまたはエンコードされた Unix ステータス? 見ないとできない
${^CHILD_ERROR_NATIVE} 値。 ${^CHILD_ERROR_NATIVE} 値は実際の VMS を返します
ステータス値と重大度ビットをチェックします。 重大度ビットが 1 の場合、
$? の数値2 ~ 255 または 0 の場合、$? を正確に反映する
Unix アプリケーションから返された値。 もし$? は 1 であり、重大度ビットは
VMS エラー (2)、次に $? Unix アプリケーションの終了値からのものです。

実際には、_POSIX_EXIT タイプのステータスを返すプログラムを呼び出す Perl スクリプト
値はそれらの値を期待し、従来の VMS プログラムを呼び出すプログラム
以前の動作を期待するか、ゼロ以外のステータスをチェックするだけです。

そして成功は、すべての動作において常に値 0 です。

子の実際の VMS 終了ステータスがエラーの場合、内部的に $!
値はそのエラーに最も近い Unix errno 値に設定されるため、Perl スクリプトは
エラー メッセージのテストでは、予想される Unix スタイルのエラー メッセージが表示されます。
VMS メッセージ。

逆に、$? を設定すると、 END ブロックで、POSIX を変換しようとします。
Perl の終了時に、値をオペレーティング システムが理解できるネイティブ ステータスにします。
要するに、$? を設定するということです。 ゼロにすると、一般的な成功が得られます
値 SS$_NORMAL、および設定 $? ゼロ以外の値にすると、一般的なエラーが発生します
ステータス SS$_ABORT。 perlport の「exit」も参照してください。

「PERL_VMS_POSIX_EXIT」論理名を「ENABLE」と定義し、$? 原因になります
元の親または子のいずれかが終了するように $^E にエンコードされる新しい値
ステータス値
0 から 255 は、_POSIX_EXIT の動作を期待する C プログラムによって自動的に回復できます。
親と子の両方の終了値がゼロ以外の場合、次のように想定されます。
これは、実際に渡される VMS ネイティブのステータス値です。 の特別な価値
0xFFFF は、C で現在のネイティブ VMS ステータスを引き起こすため、ほとんど NOOP です。
ライブラリは現在のネイティブ Perl VMS ステータスになり、そのままこの方法で処理されます。
有効なネイティブ VMS ステータス値ではないことがわかっています。 の値のみを使用することをお勧めします。
通常の Unix の親または子ステータス番号の範囲である 0 から 255 が使用されます。

プラグマ「use vmsish 'status'」は $? 代わりに実際の VMS 終了ステータスを反映する
上記のPOSIXステータスのデフォルトエミュレーションの。 このプラグマも無効にします
$? を設定するときのゼロ以外の値の SS$_ABORT への変換END ブロック内 (ただし、
ゼロは引き続き SS$_NORMAL に変換されます)。

"PERL_VMS_POSIX_EXIT" を有効にして "use vmsish 'status'" プラグマを使用しないでください。
彼らは時々相反する行動を要求し、これを無視した結果
POSIX 出口処理の将来の改善を可能にするために、アドバイスは未定義になります。

一般に、「PERL_VMS_POSIX_EXIT」を有効にすると、より詳細な情報が表示されます
DCL スクリプトまたはその他のネイティブ VMS ツールの終了ステータスで利用可能であり、
Posix プログラムに期待される情報。 ではデフォルトにされていません。
下位互換性を維持するため。

注意: "DECC$FILENAME_UNIX_REPORT" を設定すると、暗黙的に "PERL_VMS_POSIX_EXIT" が有効になります。

$| 設定 $| I/O ストリームの場合、データは各ストリームでディスクに完全にフラッシュされます。
書きます (すなわち 基礎となるファイルの RMS バッファだけではありません)。 言い換えれば、それは
呼び出すのと同等 fflush() および fsync() Cから。

スタンダード モジュール   VMS 固有 の違い


SDBM_ファイル
SDBM_File は VMS 上で正しく動作します。 ただし、小さな違いが XNUMX つあります。 データベース
作成されたディレクトリ ファイルには .sdbm_dir ではなく拡張子 。あります 拡大。 。あります ファイル
VMS ファイルシステム ディレクトリ ファイルであり、それらを他の目的に使用すると、
容認できない問題。

リビジョン date


改訂履歴については、git リポジトリを参照してください。

onworks.net サービスを使用してオンラインで perlvms を使用する



最新のLinuxおよびWindowsオンラインプログラム