2

私のperlスクリプトでこれができるようにしたい:

$ ./code file.txt | myperl.pl param1 param2

したがって、基本的には から入力 (STIDN) を受け取り、and./codeで実行します。param1param2

しかし、なぜこれが機能しないのですか:

my $param1 = $ARGV[0];
my $param2 = $ARGV[1];

while (<>) {
   if ($param1 > 0.5 && $param2 > 0) {
     # do something
  }

}

それを行うための正しい構造は何ですか?

4

3 に答える 3

7

<>akareadlineのデフォルトの引数は ARGV です。これは、@ARGV で指定されたすべてのファイルから読み取る魔法のファイルハンドルです。ファイルがない場合は STDIN から読み取ります。引数を提供しているので、使用する前に @ARGV からそれらをクリアするか、マジック ARGV ハンドルを<>明示的に指定して使用しないようにする必要があります。<STDIN>

于 2012-06-18T10:22:43.387 に答える
5

これは機能し、@ARGV の最初の 2 つのパラメーターを削除します。

my $param1 = shift;
my $param2 = shift;

while (<>) {
   if ($param1 > 0.5 && $param2 > 0) {
     # do something
   }
}

<>( の略)が空でない場合<ARGV>にリストされているファイルから読み取ります。空の場合 (オプションをシフトアウトしたために上記のように)、代わりにから読み取ります。@ARGV@ARGVSTDIN

<STDIN>代わりにを使用することもでき<>ますが、呼び出し元は を実行するオプションを失いますmyperl.pl param1 param2 file.txt

于 2012-06-18T11:06:17.643 に答える
4

この場合に使用する必要があります<STDIN>

my $param1 = $ARGV[0];
my $param2 = $ARGV[1];

while (<STDIN>) {
   if ($param1 > 0.5 && $param2 > 0) {
     # do something
  }

}

ひし形演算子は、<>引数 + stdin を意味します。

の代わりにひし形演算子を使用する場合は、これらの 2 つの引数とbeforeを<STDIN>削除する必要があります。しかし、あなたの場合はその方が良いと思います。param1param2ARGV<STDIN>

于 2012-06-18T10:12:17.940 に答える