2013-05-03 18 views
2
sub open_directory { 
    my $directory = shift @_; 
    my @files =(); 

    opendir (my $dh, $directory) or die "Couldn't open dir '$directory' : $!"; 
    my @all_files = readdir $dh; 
    closedir $dh; 

    foreach my $files(@all_files){ 
      while($files =~ /\.htm/){ 
       push(@files); 
      } 
    } 
    return @files; 
} 

的錯誤是在代碼push(@files); 的錯誤是: Useless use of push with no values排序文件名到一個數組使用Perl和正則表達式

我想要處理的的.htm.html結束名稱中的文件在@files數組中使用正則表達式/\.htm/請幫助我。

+2

有錯誤消息意味着你忘了指定_what_挺進陣列。想想看。 – Mat 2013-05-03 08:26:07

+1

另外,'while'應該是一個'if'。 – amon 2013-05-03 08:28:04

+0

我想這樣的事情應該工作? 'push(@files,$ files);' – 2013-05-03 08:31:23

回答

5

解決此問題的最簡單方法是使用grep內建函數:它從條件爲真的列表中選擇那些元素,然後返回所有匹配元素的列表。

my @even = grep { $_ % 2 == 0 } 1 .. 10; # even number in the interval [1, 10]. 

在我們的例子中,我們可以做

my @files = grep { /\.htm/ } readdir $dh; 

如果你想使用push,則(a)您必須指定要推到陣列上的東西,和(b)應只能做推如果正則表達式匹配,而不是它匹配:

for my $file (@all_files) { 
    push @files, $file if $file =~ /\.htm/; 
} 
+0

非常感謝。我已經解決了這個小問題:) \t \t \t如果{ \t \t \t \t推(@文件,文件$)($文件=〜/ \ HTM /); \t \t \t} – 2013-05-03 09:35:10

+1

@DeepakTivari請注意,該正則表達式還會考慮(例如)'foobar.htm.tar.gz'這個有效的文件名。 (因爲正則表達式不是錨定在文件名的末尾) – TLP 2013-05-03 09:39:28

+0

哦,是的,謝謝你指出。我仍然在做初學者的東西,但會記得正確設置正則表達式:D – 2013-05-03 09:51:17

0

試着去了解是低代碼,這將只處理.htm或.html文件。

use strict; 
use Data::Dumper; 

my @all_files = ("abc.htm", "xyz.gif", "pqr.html") ; 
my @files; 
foreach my $files(@all_files){ 
    if($files =~ /\.html?/){ # This will process only .htm or .html files 
     push(@files, $files); 
    } 
} 
print Dumper(\@files); 

輸出:

$VAR1 = [ 
      'abc.htm', 
      'pqr.html' 
     ]; 
2

amon給予了正確的回答你的問題,使用grep過濾的文件名。但是,你正在嘗試的功能來完成聽起來更像是一個glob對我說:

my @html_files = glob("*.html *htm"); # html files 

您還可以插入一個目錄:

my $dir = "foo"; 
my @html_files = glob("$dir/*.html $dir/*.htm"); 
+0

非常感謝。我已經解決了這個小問題:) – 2013-05-03 09:34:15