2013-03-15 58 views
-1

我是Perl和Linux的新手。我正在嘗試在Perl中編寫一個程序來查找數組中的元素數量。 (這個數組應該是由當前目錄下帶有「.txt」擴展名的文件組成的,然後我計劃使用這個數組來讀取所有「.txt」文件到一個哈希中)。但是,我一直得到一個數組大小= 0.我知道我的目錄中有八個以上的「.txt」文件,所以我沒有超過八個數組元素?在數組(Perl)中查找元素數量時出錯?

我的程序如下:

#!/user/bin/perl 
    my $readfdir = '.'; 
    opendir(DIR, $readfdir) or die $!; 
    my @readf = glob(".*.txt"); 
    my $arrSize = @readf; 
    print "array size = $arrSize\n"; 

請指導我什麼,我做錯了。謝謝!

回答

5

你的水珠是最有可能不是你想

my @readf = glob(".*.txt"); 

您正在使用什麼看起來像一個正則表達式的語法,即.*匹配任何字符串,但在水珠,那就是*。所以它應該是:

my @readf = glob("*.txt"); 

另外,如果您使用glob代替,則您的opendir語句相當多餘。使用opendir/readdir或glob。

+0

感謝您的糾正。 – user2174373 2013-03-15 16:51:35

+0

@ user2174373不客氣。通過點擊複選標記,您可以將答案標記爲已接受。 – TLP 2013-03-15 19:10:36

1
glob(".*.txt"); 

你有一個「。」在文件名的開始處,你確定有文件在你的目錄中以這種方式命名嗎?

0

更改您的glob規範。

use warnings; 
use strict; 

my @readf = glob("*.txt"); 
my $arrSize = @readf; 
print "array size = $arrSize\n"; 

而且,沒有必要兩個opendirglob

+0

非常感謝!你能告訴我如何將此標記爲有用或作爲另一個可接受的答案嗎? – user2174373 2013-03-15 22:17:49

+0

不客氣。當你獲得足夠的代表時,只需加註它。 – toolic 2013-03-15 23:04:22

0

這是一個不使用glob的解決方案。

my $dir = "."; 
my @list_of_files; 

opendir(my $dh, $dir) or die "$!"; 
for my $file (readdir $dh){ 
    push(@list_of_files, $file) if 
     $file =~ /\.txt$/; 
} 

print join(' ', @list_of_files), "\n"; 
print "Number of files: ", scalar(@list_of_files), "\n"; 

此外,我相信readdir是不需要你的例子。例如。你可以只需glob

這個例子也只是掃描txt文件的給定目錄。如果你想找到給定目錄下的所有內容,File::Find是很棒的。

+0

「推」命令是做什麼的?你可以將當前目錄中的所有「.txt」文件放到一個數組中而不使用「push」命令嗎?我爲這個簡單的問題表示歉意。謝謝你的幫助! – user2174373 2013-03-15 16:48:58

+0

@ user2174373'push'將元素添加到列表的末尾。參見[perldoc](http://perldoc.perl.org/functions/push.html) – chrsblck 2013-03-15 17:20:23

+0

這個解決方案不好,原因有兩個:(1)你在'for(readdir $ dh)中將整個目錄一次讀入內存)'。在標量上下文中使用'readdir'來一次使用一個條目:'while(my $ file = readdir $ dh){}'。 (2)哦,所有這些都在推動着。你只是重新發明了'grep'內建函數:'my @files = grep /\.txt$/,readdir $ dh;'可以替換你的整個循環,儘管這會將整個目錄列表加載到內存中。 – amon 2013-03-15 18:56:39