如果我想查找由<>
生成的數組的大小,爲什麼以下不工作?<>生成的數組大小?
print "Number of .DOC and .PDF files is: " scalar(<*.PDF *.DOC>);
它給出了第一個匹配文件的名稱。
如果我想查找由<>
生成的數組的大小,爲什麼以下不工作?<>生成的數組大小?
print "Number of .DOC and .PDF files is: " scalar(<*.PDF *.DOC>);
它給出了第一個匹配文件的名稱。
我們先來澄清一些誤解。
glob
[1]從未返回一個數組。運營商不返回陣列[2];他們返回標量。有時候沒有,有時是一個,有時很多。
scalar
影響操作員,而不是他們返回的值。具體而言,scalar
會導致內部運算符在標量上下文中進行評估。
運營商如何受上下文影響取決於每個運營商。唯一不變的是,它們必須在標量環境中返回一個標量。在他們選擇以標量方式返回時,有很多variety。
在標量環境,glob
起作用的迭代器,返回它會在列表環境已經返回,或undef
到信號沒有進一步的值返回的下一個項目。
解決方案:
存儲器高效的解決方案:
my $num_files = 0;
++$num_files while <*.PDF *.DOC>;
print "Number of .DOC and .PDF files is: $num_files\n";
更快的溶液:
my @qfns = <*.PDF *.DOC>;
print "Number of .DOC and .PDF files is: " . @qfns . "\n";
上述的內聯版本:
print "Number of .DOC and .PDF files is: " . @{[ <*.PDF *.DOC> ]} . "\n";
甚至更快,浪費更少,但更先進的解決方案:
print "Number of .DOC and .PDF files is: " . (() = <*.PDF *.DOC>) . "\n";
在標量上下文的list assignment operator返回其RHS返回的標量數量。
清潔劑/清潔劑?
my $num_files =() = <*.PDF *.DOC>;
print "Number of .DOC and .PDF files is: $num_files\n";
<*.PDF *.DOC>
爲glob(qq<*.PDF *.DOC>)
除了在某些情況下@a
的快捷方式(包括\@a
,@a = LIST
和陣列操縱器等push @a, LIST
)。
我想使用連接而不是'0 +'來執行標量上下文 - 例如'print「.DOC和.PDF文件的數量是:」。 (()= <*.PDF *.DOC>);' –
@Dave Cross,這也是我會用的,既然我不堅持使用OP,反正我已經更新了我的答案 – ikegami
@ user2864740如何在相同的語句中將列表轉換爲數組? – CJ7
哦,我很錯:請參閱http://perldoc.perl.org/perlfunc.html#glob-EXPR「在*標量上下文*中,glob遍歷這樣的文件名擴展..」 – user2864740