この質問が単純に聞こえる場合は申し訳ありません。私の意図は、この (これらの?) 特定の演算子がどのように機能するかを深く理解することであり、perldocs で満足のいく説明を見つけることができませんでした (おそらくどこかに存在します。私の人生のためにそれを見つけてください)
特に、私は知りたいです
a)<>
b)<*>
または任意のグロブと
c)<FH>
基本的に類似しているか異なるか、および内部でどのように使用されているか。
これについての洞察を得るために、独自のテスト関数を作成しました (以下に示します)。私はまだ完全に理解していません (私の理解は間違っているかもしれません) が、これが私の結論です:
<>
- スカラー コンテキスト: 読み取り中の「現在のファイル」の次の行を読み取ります (@ARGV で提供)。質問: これは非常に特殊なシナリオのように思えますが、なぜそうなのか、一般化できるのかどうか疑問に思っています。また、読み取られている「現在のファイル」とは何ですか? それはファイルハンドルにありますか?カウンターとは?
- In List Context: @ARGV 内のすべてのファイルを配列に読み込みます
<list of globs>
- スカラー コンテキスト: グロブに一致する現在のフォルダーで見つかった最初のファイルの名前。質問: なぜ現在のフォルダなのですか? これを変更するにはどうすればよいですか?これを < /home/* > のように変更する唯一の方法はありますか?
- リスト コンテキスト: 現在のフォルダー内のグロブに一致するすべてのファイル。
<FH>
変数に割り当てられたときに undef を返すようです。 質問: なぜ undef なのですか? 型はないのですか?FH がベアワード ファイルハンドルでない場合、これは同様に動作しますか?
一般的な質問: 実行中に <> などの値を処理するのは何ですか? スカラー コンテキストでは、何らかの種類の参照が返されるか、またはそれらを割り当てる変数は、その時点で他の非 ref スカラーと同一ですか?
また、順番に割り当てているにもかかわらず、出力が毎回リセットされることにも気付きました。つまり、私がそうするとき、私はそれを想定していたでしょう
$thing_s = <>;
@thing_l = <>;
@thing_l
はすでに に受信されているため、最初のアイテムが欠落している可能性があります$thing_s
。そうでないのはなぜですか?
テストに使用するコード:
use strict;
use warnings;
use Switch;
use Data::Dumper;
die "Call with a list of files\n" if (@ARGV<1);
my @whats = ('<>','<* .*>','<FH>');
my $thing_s;
my @thing_l;
for my $what(@whats){
switch($what){
case('<>'){
$thing_s = <>;
@thing_l = <>;
}
case('<* .*>'){
$thing_s = <* .*>;
@thing_l = <* .*>;
}
case('<FH>'){
open FH, '<', $ARGV[0];
$thing_s = <FH>;
@thing_l = <FH>;
}
}
print "$what in scalar context is: \n".Dumper($thing_s)."\n";
print "$what in list context is: \n".Dumper(@thing_l)."\n";
}