2014-04-29 31 views
0

我正在從一個目錄讀取數據,並且正在搜索文件名和擴展名。唯一接受的延期是inout。如果我獲得積極的匹配,我將收集的信息添加到散列中。一個更簡單的方法,從一個目錄開始,構建一個文件名散列

假設該散列可以是這樣的:

#{ 
# filename1 => { 
#  in => 1|0 
#  out => 1|0 
# }, 
# ..., 
# filenameN => { 
#  in => 1|0, 
#  out => 1|0 
# } 
#} 

我做上述所有使用這個片斷:

... 
while (my $file = readdir INDIR) { 
    my ($file_name, $file_ext) = $file =~ /^(\w+)\.([^.]+)$/; 
    next if not($file_name and $file_ext); 
    next if not($file_ext =~ /in|out/); 
    $hash{$file_name}->{$file_ext} = 1; 
} 
... 

我不知道是否有更好的方法達到相同的期望結果,也許即級聯不是兩個next if聲明。

你有一些建議來簡化該片段嗎?

回答

3

你可以消滅兩個if條件有,

my ($file_name, $file_ext) = $file =~ /^(\w+)\.(in|out)$/ or next; 

,或者讓模塊做文件解析,

use File::Basename; 

# .. 

my ($file_name,undef,$file_ext) = fileparse($file, "in", "out"); 
next if !$file_ext; 
2

大廈mpapec的solution,我更喜歡控制流功能在開始該線。

while (my $file = readdir INDIR) { 
    next if $file !~ /^(\w+)\.(in|out)$/; 
    $hash{$1}{$2} = 1; 
} 

或許更清楚:

while (my $file = readdir INDIR) { 
    if ($file =~ /^(\w+)\.(in|out)$/) { 
     $hash{$1}{$2} = 1; 
    } 
} 
+0

我遠離'unless'球迷,但很想在這裏使用它。 –

+2

我同樣受到誘惑。也考慮過'如果!'。如果不是因爲我們捕獲變量,目前的設置會感覺很好,但我真的不確定我喜歡哪個。在回到最短的形式之前,我循環了他們。 – Miller

相關問題