处理数组并创建非必需元素的列表

时间:2013-08-15 23:21:30

标签: perl

#array 

@myfiles = ("public", "A0", "B0", "KS"); 

现在,我只想要A0,B0并且不想要任何其他元素,如public和KS。所以,为此,我有以下代码:

my @MYFILES; 

foreach $names ( @myfiles )  {

  next if ( $names =~ m/public/);
  next if ( $names =~ m/KS/ ) ; 
  push (@MYFILES, "$names");

}  

现在,接下来if语句有助于跳过我在新数组中不想要的元素“@MYFILES”

但是,如果我想创建一个不需要的元素列表,如public,KS,并且只是在foreach循环中调用它,并且只收集所需的元素,如A0,B0,那么如何创建一个不需要的元素列表,而不是下一个if语句,那么它怎么可能是做了什么?我的意思是:

创建哈希%bad_dir =(public = 1,KS = 1);然后在foreach循环中调用它,如下所示:

%bad_dir = ( public = 1, KS = 1 );

foreach $names ( @myfiles ) { 

 next if ( exists ( $bad_dirs{$names} )); 
 #but this code does not work ( Reason for creating hash is I will be having many such files that I don't need and I want to use next if statements. I want some shorter way. ) 

}

我该怎么做?

谢谢,

3 个答案:

答案 0 :(得分:7)

perldoc -f grep对于过滤列表非常有用:

use warnings;
use strict;

my @myfiles = ("public", "A0", "B0", "KS");
my %bads    = map { $_ => 1 } qw(public KS);
my @MYFILES = grep { not exists $bads{$_} } @myfiles;

答案 1 :(得分:1)

查看grep:http://perldoc.perl.org/functions/grep.html

如果你有一个简短的清单,你可以这样做(当然使用你自己的正确的正则表达式):

my @myfiles = grep { !/public|KS/ } @myfiles;

答案 2 :(得分:1)

你在想它:

use strict;
use warnings;
use feature qw(say);

my @files = qw(public A0 B0 KS);
my @not_required;
my @required;

for my $file ( @files )  {
    if ( $name =~ /public|KS/i ) {
        push @not_required, $name;
    }
    else {
        push @required, $name;
    }
}

这是真的你在说什么:你想要两个数组:一个必需的文件和一个不需要的文件。 if/else逻辑清楚地表明了这一点。您要么将文件推送到@required@not_required数组。

还要注意这些名字应该意味着什么。你在谈论文件,所以带有名字的数组应该被称为@files,而不仅仅是@myname这是奇异的,即使你在谈论一些东西

而且,use strict;use warnings;。这些将捕获大约90%的编程错误。