如果我想查找由<>
生成的数组的大小,为什么以下不起作用?
print "Number of .DOC and .PDF files is: " scalar(<*.PDF *.DOC>);
它改为给出第一个匹配文件的名称。
答案 0 :(得分:10)
让我们首先澄清一些误解。
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
除外。