3

私は最近、Perl コードに少し触れるようになりましたが、そのいくつかの側面はまだわかりません。これです:

@collection = <*>;

collectionat-symbolが配列として定義されていることを理解しています。また、少し調べてみたところ、特にI/O Operatorsに関する部分で perldoc にたどり着きました。null ファイルハンドルが特に興味深いことがわかりました。コードは続きます。

while (<>) {
    ...
}

同じトピックで、この構文も有効であることにも気付きました。

while (<*.c>) {
    ...
}

globperldoc によると、実際には、次のコードと同様の方法で呼び出す内部関数を呼び出しています。

open(FOO, "echo *.c | tr -s ' \t\r\f' '\\012\\012\\012\\012'|");
while (<FOO>) {
    ...
}

質問

最初の行で言及されている小なり、アスタリスク、大なり ( <*> ) 記号は実際には何をしますか? 内部で開いて参照されているグロブへの参照ですか? null ファイルハンドルなどの特殊なケースでしょうか? それとも、従来の実装のように、まったく異なるものにすることができますか?

4

2 に答える 2

5

<>(ひし形演算子) は、2 つの異なる構文で使用されます。

<*.c>などは、glob組み込み関数<*>の省略形です。したがって、現在のディレクトリ内のすべてのファイルとディレクトリのリストを返します。(ドットで始まるものを除く。そのために使用)。<*><* .*>

<$fh>呼び出しの省略形ですreadline($fh)。ファイルハンドルが指定されていない場合 ( <>) 魔法の *ARGV ハンドルが想定されます。これは、コマンドライン引数として指定されたファイルのリストであり、何も指定されていない場合は標準入力です。あなたが言及したように、perldocは両方を詳細にカバーしています。

Perl はこの 2 つをどのように区別しますか? <>内部のものが裸のファイルハンドルであるか、ファイルハンドルへの単純なスカラー参照であるかをチェックします (例: $fh)。それ以外の場合は、代わりに呼び出しglob()ます。<$hash{$key}>これはorのようなものにも当てはまります<$x >- への呼び出しとして解釈されglob()ます。perldoc をもう少し詳しく読むと、これが説明されています。また、これらの問題を回避するためglob()に変数を内部に配置する場合は、明示的に使用することをお勧めします。<>

于 2013-09-28T21:17:56.093 に答える
1

現在のディレクトリ内のすべてのファイル名を収集し、配列コレクションに保存します。ドットで始まるものを除く。以下と同じです:

@collection = glob "*";
于 2013-09-28T21:16:34.417 に答える