#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. )
}
我该怎么做?
谢谢,
答案 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%的编程错误。