一种更简单的方法,从目录开始,构建文件名的哈希

时间:2014-04-29 12:22:38

标签: perl file hash directory

我正在从目录中读取,我正在搜索文件名和扩展名。接受的唯一扩展名为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语句。

您有什么建议来简化该代码段吗?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;
    }
}