CJ7*_*CJ7 3 arrays size perl glob
如果我想查找生成的数组的大小<>
,为什么以下不起作用?
print "Number of .DOC and .PDF files is: " scalar(<*.PDF *.DOC>);
Run Code Online (Sandbox Code Playgroud)
它提供了第一个匹配文件的名称.
ike*_*ami 10
让我们首先澄清一些误解.
glob
[1]永远不会返回数组.运算符不返回数组[2] ; 他们返回标量.有时没有,有时一个,有时很多.
scalar
影响运营商,而不是他们返回的价值.具体而言,scalar
使得内部运算符在标量上下文中进行评估.
操作员如何受上下文影响取决于每个操作员.唯一不变的是它们必须在标量上下文中返回一个标量.他们选择在标量语境中返回的内容有很多种.
在标量上下文中,glob
作为迭代器,返回它将在列表上下文中返回的下一个项,或者undef
表示没有其他值要返回.
解决方案:
一种节省内存的解决方案:
my $num_files = 0;
++$num_files while <*.PDF *.DOC>;
print "Number of .DOC and .PDF files is: $num_files\n";
Run Code Online (Sandbox Code Playgroud)更快的解决方案:
my @qfns = <*.PDF *.DOC>;
print "Number of .DOC and .PDF files is: " . @qfns . "\n";
Run Code Online (Sandbox Code Playgroud)上面的内联版本:
print "Number of .DOC and .PDF files is: " . @{[ <*.PDF *.DOC> ]} . "\n";
Run Code Online (Sandbox Code Playgroud)更快,更少浪费但更先进的解决方案:
print "Number of .DOC and .PDF files is: " . ( () = <*.PDF *.DOC> ) . "\n";
Run Code Online (Sandbox Code Playgroud)
标量上下文中的列表赋值运算符返回其RHS返回的标量数.
清洁/更清晰?
my $num_files = () = <*.PDF *.DOC>;
print "Number of .DOC and .PDF files is: $num_files\n";
Run Code Online (Sandbox Code Playgroud)<*.PDF *.DOC>
是一个快捷方式 glob(qq<*.PDF *.DOC>)
除了@a
在某些情况下(包括\@a
,@a = LIST
和阵列操纵器等push @a, LIST
).