38

Perl での <> の使用は何ですか。それの使い方 ?簡単に書くと

<>;

while(<>)

どちらの場合も、プログラムは何をしているのでしょうか?

4

6 に答える 6

36

上記の答えはすべて正しいですが、一般的な 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 コマンド ラインの動作を取得します...私が提供するすべてのファイルを処理するか、パイプで送ったものを処理します。

于 2012-09-05T06:41:36.617 に答える
18
 <>;

短い書き方です

 readline();

または、デフォルトの引数を追加すると、

 readline(*ARGV);

readline指定されたファイルハンドルから行を読み取る演算子です。特別なファイルハンドルからのARGV読み取りは、空のSTDIN場合@ARGV、または空でない場合に指定されたファイルの連結から読み取ります@ARGV


はどうかと言うと

while (<>)

構文エラーです。あなたが持っていた場合

while (<>) { ... }

に書き直されます

while (defined($_ = <>)) { ... }

そして前に説明したように、それはと同じことを意味します

while (defined($_ = readline(*ARGV))) { ... }

つまり、読み取る行ARGVがなくなるまで、(前に説明した)から行を読み取ります。

于 2012-09-05T06:17:35.090 に答える
7

これはダイアモンド演算子と呼ばれ、ARGVが空の場合はstdinから、またはARGVで指定されたファイルの各行からデータをフィードします。このウェブページhttp://docstore.mik.ua/orelly/perl/learn/ch06_02.htmはそれを非常によく説明しています。

于 2012-09-05T06:18:24.027 に答える
5

引用perldoc perlop

null ファイルハンドル <> は特別です: sed と awk、およびファイル名のリストを受け取る他の Unix フィルター プログラムの動作をエミュレートするために使用でき、それらすべてからの入力の各行に対して同じことを行います。<> からの入力は、標準入力から、またはコマンド ラインにリストされた各ファイルから取得されます。

于 2012-09-05T06:11:36.213 に答える
5

このようなシンタックス シュガーを使用したプログラミングの多くの場合、DeparseO何が起こっているかを調べるのに役立ちます。

$ perl -MO=Deparse -e 'while(<>){print 42}'
while (defined($_ = <ARGV>)) {
    print 42;
}
-e syntax OK
于 2012-09-05T09:51:00.590 に答える
2

STDIN 標準入力を使用します。

> cat temp.pl
#!/usr/bin/perl

use strict;

use warnings;
my $count=<>;
print "$count"."\n";
>

以下は実行です:

> temp.pl
3
3

>

そのため、スクリプトを実行するとすぐに、ユーザーが何らかの入力を行うまで待機します。3入力として与えられた後、その値をに保存$countし、次のステートメントで値を出力します。

于 2012-09-05T06:15:16.630 に答える