どのように私はPerlで、<>のためのコマンドライン引数とファイル名を混在させることができますか?
質問
以下の愚かなPerlプログラムを考えてみましょう
$firstarg = $ARGV[0];
print $firstarg;
$input = <>;
print $input;
私のような端末から、それを実行します
perl myprog.pl sample_argument
このエラーを取得します:
Can't open sample_argument: No such file or directory at myprog.pl line 5.
任意のアイデアこれはなぜですか?それはになると、<>それは(存在しない)ファイル、「sample_argument」か何かから読み取るしようとしていますか?そして、なぜ?
解決
<>
は「@ARGV
で指定された、または@ARGV
が空の場合は、その後、STDIN
から読み込まれたファイルから読み込む」の省略形です。あなたのプログラムでは、@ARGV
は、値("sample_argument")
が含まれており、Perlはあなたが<>
演算子を使用した場合、そのファイルから読み込もうとしてます。
あなたは@ARGV
ラインに到達する前にあなたはクリア<>
でそれを修正することができます:
$firstarg = shift @ARGV;
print $firstarg;
$input = <>; # now @ARGV is empty, so read from STDIN
print $input;
他のヒント
の部分を読み込みperlioのmanページを参照してください。
ヌルファイルハンドル<>は特別である:SEDの動作をエミュレートするために使用することができます そして、AWK。 > <からの入力は、標準入力から、または記載されている各ファイルのいずれかから来て コマンドラインで。しくみはこうだ:初めて<>が評価され、 @ARGV配列を確認し、それが空の場合、$ ARGV [0]に設定されている「 - 」、そのとき 開かれたが、あなたに標準入力を与えます。 @ARGV配列は、その後のリストとして処理されます ファイル名。
はSTDIN、使用STDINをしたい場合は、ない<>
ます。
デフォルトでは、perlの消費<>
の入力ファイルとして、コマンドライン引数。あなたがそれらを使用した後、あなたがshift;
で自分で消費する必要があります。
所属していません StackOverflow