<>生成的数组大小?

时间:2016-08-02 04:04:57

标签: arrays perl size glob

如果我想查找由<>生成的数组的大小,为什么以下不起作用?

print "Number of .DOC and .PDF files is: " scalar(<*.PDF *.DOC>);

它改为给出第一个匹配文件的名称。

1 个答案:

答案 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";
    
  1. <*.PDF *.DOC>glob(qq<*.PDF *.DOC>)

  2. 的快捷方式
  3. 在某些情况下(包括@a\@a@a = LIST等阵列操纵器),push @a, LIST除外。