我有一个数组@astreams
,其中包含以下值
jatm5_INT jatm5_APPL jatm5_JAVA jatm5_RLS jatm5_EDAG jatm5_REC
我想用下面的构造
搜索其中的字符串if ( @astreams !~ /$stream_s/ )
并且想要在匹配或不匹配的情况下打印某些东西但是它不起作用
我正在使用CCPERL (ClearCase Perl): This is perl, v5.8.6 built for MSWin32-x86-multi-thread
答案 0 :(得分:4)
如果要查找数组中与模式匹配的所有元素,Perl中的the grep
builtin是您的朋友。
my @matches = grep { /$stream_s/ } @astreams;
这将尝试将每个元素与模式/$stream_s/
和通过仅匹配包含$stream_s
的模式匹配。那些最终会出现在你的新阵列中。
如果你想要反转这一点并找到@astreams
中与某个模式不匹配的所有元素,你只需取消匹配。
my @not_matched = grep { ! /$stream_s/ } @astreams;
以下是一个完整的例子:
use strict;
use warnings;
use Data::Dumper;
my @astreams = qw(
jatm5_INT jatm5_APPL jatm5_JAVA
jatm5_RLS jatm5_EDAG jatm5_REC
5_ASDF
);
my $stream_s = 'jat';
my @not_matched = grep { !/$stream_s/ } @astreams;
print Dumper \@not_matched;
这将输出
$VAR1 = [
'5_ASDF'
];
如果他们中的任何一个不匹配,只是做某事,但你不在乎哪一个,你可以在grep
内使用if
,返回值将在标量上下文中进行评估。这意味着,if
将查看grep
返回的元素数量。如果不是0,则将其视为 true value ,并且检查通过并输入块。
if ( grep { /$stream_s/ } @astreams ) {
# we found a match, do stuff
} else {
# no match, do something else
}
你当然也可以转过身来。以下所有三种形式都是等同的。
if ( ! grep { /$stream_s/ } @astreams ) {
# no match, do something
}
if ( not grep { /$stream_s/ } @astreams ) {
# no match, do something
}
unless ( grep { /$stream_s/ } @astreams ) {
# no match, do something
}
请注意,您的匹配将检查@stream
中的任何元素是否包含(或不包含)$stream_s
。
my $stream_s = 'a';
my @astreams = qw(
jatm5_INT jatm5_APPL jatm5_JAVA
jatm5_RLS jatm5_EDAG jatm5_REC
5_ASDF 5_ASDF_FOOBAR
);
在上面的例子中,前六个元素在某处包含a
。所有这些都将匹配。
my $stream_s = '5_';
my @astreams = qw(
jatm5_INT jatm5_APPL jatm5_JAVA
jatm5_RLS jatm5_EDAG jatm5_REC
5_ASDF 5_ASDF_FOOBAR
);
在此示例中,所有元素都包含5_
。
my $stream_s = '5_ASDF';
my @astreams = qw(
jatm5_INT jatm5_APPL jatm5_JAVA
jatm5_RLS jatm5_EDAG jatm5_REC
5_ASDF 5_ASDF_FOOBAR
);
现在最后两个将匹配。如果您不想要部分匹配,但想要检查完全该字符串,请不要使用正则表达式匹配。
my $stream_s = 'FOOBAR';
my @astreams = qw(
jatm5_INT jatm5_APPL jatm5_JAVA
jatm5_RLS jatm5_EDAG jatm5_REC
5_ASDF 5_ASDF_FOOBAR
);
unless ( grep { $_ eq $stream_s } @astreams ) {
# only go here if there is no element 'FOOBAR' in @astreams
}
答案 1 :(得分:3)
绑定运算符在标量上下文中解释其左参数,因此在数组上使用它是没有意义的(除非您想匹配元素的数量)。使用循环或等效构造:
#! /usr/bin/perl
use warnings;
use strict;
use List::MoreUtils qw{ any };
my @astreams = qw( jatm5_INT jatm5_APPL jatm5_JAVA
jatm5_RLS jatm5_EDAG jatm5_REC );
my $stream_s = qr/EDA/;
print "Matched\n" if any { /$stream_s/ } @astreams;
答案 2 :(得分:0)
这更多是因为TMTOWTDI比我认为这是一种特别好的方法。
您也可以将数组插入为字符串,并对其进行正则表达式搜索。
file(APPEND ${out_file} NULL)
file(APPEND ${out_file} "\\0")
file(APPEND ${out_file} "\0" HEX)
会匹配您要查找的所有值,因为if ( "@astreams" !~ /$stream_s/ )
会插入"@astreams"
...不幸的是,它也会匹配"jatm5_INTjatm5_APPLjatm5_JAVAjatm5_RLSjatm5_EDAGjatm5_REC"
等字符串。
"EDAGjatm5"
假设if ( join( ' ', @astreams ) !~ /$stream_s/ )
不包含空格,可能做正确的事情。 ...我实际上不会使用这个,因为我希望代码可以运行,而不是可能有效的代码,但我认为考虑更糟糕的做事方式是有益的,为什么呢?不是最好的方式。