Perl 一种更简单的方法,从目录开始,构建文件名的散列

Perl 一种更简单的方法,从目录开始,构建文件名的散列,perl,file,hash,directory,Perl,File,Hash,Directory,我正在从一个目录中读取,我正在搜索文件名和扩展名。唯一接受的扩展名是in和out。如果我得到一个正匹配,我将收集到的信息添加到一个散列中 假设这个散列可以是这样的: #{ # filename1 => { # in => 1|0 # out => 1|0 # }, # ..., # filenameN => { # in => 1|0, # out => 1|0 # } #} 我正在使用此代码段执行上述所有

我正在从一个目录中读取,我正在搜索文件名和扩展名。唯一接受的扩展名是
in
out
。如果我得到一个正匹配,我将收集到的信息添加到一个散列中

假设这个散列可以是这样的:

#{
#   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
语句


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

如果使用

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;

如果条件为

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;
在mpapec的基础上,我更喜欢生产线开始时的控制流功能

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;
    }
}
在mpapec的基础上,我更喜欢生产线开始时的控制流功能

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;
    }
}

我远离
,除非我是
粉丝,但我很想在这里使用它。我也同样很想。还考虑了
if。如果不是因为我们捕获变量的事实,当前的设置会感觉很好,但是我真的不确定我更喜欢哪一个。在返回到最短的表单之前,我循环了所有这些表单。我远不是
粉丝,而是想在这里使用它。我也同样受到诱惑。还考虑了
if。如果不是因为我们捕获变量的事实,当前的设置会感觉很好,但是我真的不确定我更喜欢哪一个。在回到最短的表格之前,我把它们都循环了一遍。