6

-CSDAPerlスクリプトのシバン行のオプションについて私が知っていると思うことを正式に確認または修正してくれる人を探しています。

のドキュメントについては、perldocperlrunを参照してください-CSDA。簡単に言えば

  • S :、およびUTF-8にあると想定されSTDINますSTDOUTSTDERR
  • D:UTF-8は、入力ストリームと出力ストリームの両方のデフォルトのPerlIOレイヤーです。
  • A:@ARGV要素は、UTF-8でエンコードされた文字列であることが期待されます
  • 効果を得るには-CSDA、のようにコマンドラインで指定する必要がありますperl -CSDA script.pl

  • 5.10より前では、コマンドラインでも指定されていない限り-CSDA、標準ストリームはすでに開かれていて、検出されるまでに@ARGVすでに入力されているため、シバンラインではサイレントに失敗していました。-CSDA

  • 5.10以降-CSDA、シバンラインにのみ表示されるperlため、その問題のために鳴き声が発生します。

  • 5.10より前のスクリプトで-CSDA使用されていたスクリプトは、コマンドラインでこれらのオプションを使用して呼び出されることはなかったため、シバン行から削除する必要があります(また、オプションをシバン行でのみ指定した場合は、何も実行されませんでした)。perl-CSDA

上記の私の仮定のどれが間違っているかについて、確かなフィードバックをもらいたいと思います。

4

2 に答える 2

3

スクリプトが

#!/usr/bin/perl -CSDA

を使用してスクリプトを開始します

./script foo

OSは次のようにPerlを起動します。

/usr/bin/perl -CSDA ./script foo

動作の変更は、スクリプトを誤って起動した場合にのみ機能します。

/usr/bin/perl ./script foo

修正は削除すること-CSDAではなく、スクリプトを正しく呼び出すことです。

于 2011-03-18T18:26:57.387 に答える
3

私がどれほど権威があるかはわかりませんが、これがどのように機能するかは知っています。

  • 最初の仮定はほぼ正確です。SDAオプションを有効にするには、インタプリタの起動時にそれらが存在している必要があります。これは、コマンドラインの-CSDAが原因である可能性があります。または、PERL_UNICODE環境変数が原因である可能性があります。あるいは、私が知らない他のメソッドが原因である可能性があります。
  • 少なくとも5.8.8については、2番目の仮定は正しいです。Dフラグは、スクリプトによって開かれたストリームに対しては通常の効果を持っていることに注意してください。
  • 3番目の仮定は正しいです。ただし、5.10.1以降では、PERL_UNICODE環境変数またはその他のメカニズムを介して適切なフラグが有効になっている場合は鳴りません。
  • 4番目の仮定は一般的に正しくありません。スクリプトを引数としてperlインタープリターを呼び出すのではなく、スクリプトが直接呼び出される状況を参照していると思います。一般的なケースは2つあります。
    • Windowsのように、拡張子が「.pl」のファイルが実行のためにperlインタープリターに渡されるとオペレーティングシステムが判断するシステムでは、正しい可能性があります。しかし、-CSDAなしで呼び出されたときのスクリプトの鳴き声は、スクリプトが期待するように標準入力と@ARGVがUTF-8ではないために不思議なことに失敗するのではなく、望ましい動作であると主張できます。
    • ほとんどの*nixシェルのように、スクリプトが直接実行されるときにシバン行を読み取るシステムでは、インタープリターを呼び出すときにシバン行で指定されたコマンドラインオプションが使用されるため、シバン行の-CSDAが尊重されます。
于 2011-03-18T16:23:55.787 に答える