Perl での <> の使用は何ですか。それの使い方 ?簡単に書くと
<>;
と
while(<>)
どちらの場合も、プログラムは何をしているのでしょうか?
上記の答えはすべて正しいですが、一般的な UNIX コマンド ラインの使用法を理解していれば、より明確に理解できるかもしれません。コマンドを複数のファイルで動作させたいということはよくあることです。例えば
ls -l *.c
コマンド ライン シェル (bash など) は、これを次のように変換します。
ls -l a.c b.c c.c ...
つまり、パターンが一致しない限り、ls は '*.c' を認識しません。コマンドプロンプトでこれを試してください(perlではありません):
echo *
* を取得していないことに気付くでしょう。
したがって、シェルが一連のファイル名を渡しており、それぞれのデータを順番に調べたい場合、perl の <> 演算子はそれを行うための優れた方法を提供します...これは、次のファイル (ファイルが指定されていない場合は stdin) を $_ (デフォルトのスカラー) に挿入します。
これは貧乏人のgrepです:
while(<>) {
print if m/pattern/;
}
このスクリプトの実行:
./t.pl *
指定されたパターンに一致するすべてのファイルのすべての行を出力します。
cat /etc/passwd | ./t.pl
cat を使用して、perl のループによってパターンがチェックされるテキスト行を生成します。
ご覧のとおり、while(<>) は非常に標準的な UNIX コマンド ラインの動作を取得します...私が提供するすべてのファイルを処理するか、パイプで送ったものを処理します。
<>;
短い書き方です
readline();
または、デフォルトの引数を追加すると、
readline(*ARGV);
readline
指定されたファイルハンドルから行を読み取る演算子です。特別なファイルハンドルからのARGV
読み取りは、空のSTDIN
場合@ARGV
、または空でない場合に指定されたファイルの連結から読み取ります@ARGV
。
はどうかと言うと
while (<>)
構文エラーです。あなたが持っていた場合
while (<>) { ... }
に書き直されます
while (defined($_ = <>)) { ... }
そして前に説明したように、それはと同じことを意味します
while (defined($_ = readline(*ARGV))) { ... }
つまり、読み取る行ARGV
がなくなるまで、(前に説明した)から行を読み取ります。
これはダイアモンド演算子と呼ばれ、ARGVが空の場合はstdinから、またはARGVで指定されたファイルの各行からデータをフィードします。このウェブページhttp://docstore.mik.ua/orelly/perl/learn/ch06_02.htmはそれを非常によく説明しています。
null ファイルハンドル <> は特別です: sed と awk、およびファイル名のリストを受け取る他の Unix フィルター プログラムの動作をエミュレートするために使用でき、それらすべてからの入力の各行に対して同じことを行います。<> からの入力は、標準入力から、またはコマンド ラインにリストされた各ファイルから取得されます。
このようなシンタックス シュガーを使用したプログラミングの多くの場合、Deparse
Oは何が起こっているかを調べるのに役立ちます。
$ perl -MO=Deparse -e 'while(<>){print 42}'
while (defined($_ = <ARGV>)) {
print 42;
}
-e syntax OK
STDIN 標準入力を使用します。
> cat temp.pl
#!/usr/bin/perl
use strict;
use warnings;
my $count=<>;
print "$count"."\n";
>
以下は実行です:
> temp.pl
3
3
>
そのため、スクリプトを実行するとすぐに、ユーザーが何らかの入力を行うまで待機します。3
入力として与えられた後、その値をに保存$count
し、次のステートメントで値を出力します。