Perl Array在中搜索字符串

时间:2017-01-06 08:26:17

标签: perl

我有一个数组@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

3 个答案:

答案 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/ ) 不包含空格,可能做正确的事情。 ...我实际上不会使用这个,因为我希望代码可以运行,而不是可能有效的代码,但我认为考虑更糟糕的做事方式是有益的,为什么呢?不是最好的方式。