2016-08-02 80 views
3

如果我想查找由<>生成的數組的大小,爲什麼以下不工作?<>生成的數組大小?

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

它給出了第一個匹配文件的名稱。

+0

@ user2864740如何在相同的語句中將列表轉換爲數組? – CJ7

+0

哦,我很錯:請參閱http://perldoc.perl.org/perlfunc.html#glob-EXPR「在*標量上下文*中,glob遍歷這樣的文件名擴展..」 – user2864740

回答

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. 除了在某些情況下@a的快捷方式(包括\@a@a = LIST和陣列操縱器等push @a, LIST)。

+1

我想使用連接而不是'0 +'來執行標量上下文 - 例如'print「.DOC和.PDF文件的數量是:」。 (()= <*.PDF *.DOC>);' –

+1

@Dave Cross,這也是我會用的,既然我不堅持使用OP,反正我已經更新了我的答案 – ikegami

相關問題