<>
Perlでの読み取りは何をしますか? たとえば、次のようにするとどうなりますか?
print for(<>);
いわゆるひし形演算子 ( <>
) は、コマンドライン引数として指定された STDIN またはファイル名から 1 行ずつ (スカラー コンテキストで) 読み取ります。
null ファイルハンドル
<>
は特別です: sed と awk の動作をエミュレートするために使用できます。からの入力<>
は、標準入力から、またはコマンド ラインにリストされた各ファイルから取得されます。これがどのように機能するかです: 初めて<>
が評価され、@ARGV
配列がチェックされ、空の場合$ARGV[0]
は に設定され"-"
、開かれると標準入力が得られます。次に、@ARGV
配列はファイル名のリストとして処理されます。
リスト コンテキストでは、<>
すべての行を返します。各行はリスト内の要素として格納されます。
これは、より多くのメモリを使用しますprint for <>;
が、 と同じことを行うことを意味します。print while <>;
Perl の最も魔法のような部分を見つけました。もっと魔法のようなことがあると思いますが、このちょっとしたイディオムを使うと、シェル パイプラインやファイル操作で使用するプログラムを非常に簡単に作成できます。
引数なしで実行する<>
と、標準入力から一度に 1 行ずつ読み取ります。
引数を指定して実行すると、引数をファイル名として扱い、名前付きファイルから一度に 1 行ずつ順番に読み取ります。
短いデモ:
$ cat > print.pl
#!/usr/bin/perl -w
print for(<>);
$ chmod 755 print.pl
$ echo hello world | ./print.pl
hello world
$ ./print.pl print.pl
#!/usr/bin/perl -w
print for(<>);
$ ./print.pl print.pl print.pl
#!/usr/bin/perl -w
print for(<>);
#!/usr/bin/perl -w
print for(<>);
$
私はそこに手でプログラムを打ち込みました。^D
完全に入力したらヒットします。
標準入力から一度に 1 行ずつ読み取り、 に格納し$_
ます。$_
printは、引数が与えられていないため、デフォルトで出力されます。このプログラムは、標準入力から読み取り、EOF に達するまで標準出力にエコーします。