Perl从数组中获取

时间:2016-05-09 09:21:55

标签: regex perl

我需要从数组中grep一个值。 例如,我有一个值

@a=('branches/Soft/a.txt', 'branches/Soft/h.cpp', branches/Main/utils.pl');

@Array =('branches / Soft / a.txt','branches / Soft / h.cpp',branches / Main / utils.pl','branches / Soft / B2 / c.tct','branches /Docs/A1/b.txt');

现在,我需要循环@a并找到每个值匹配@Array。例如

4 个答案:

答案 0 :(得分:2)

grep对我有用。除了使用More::ListUtils而不是grep之外,您的操作方式与下面的any示例完全相同。您也可以将其缩短为

 my $got_it  = grep { /$str/ } @paths;
 my @matches = grep { /$str/ } @paths;

默认情况下,/m$_进行测试,依次为列表中的每个元素。 $str@paths与以下相同。

您也可以使用模块More::ListUtils。其函数any返回true / false,具体取决于列中的任何元素是否满足块中的条件,即。在这种情况下是否匹配。

use warnings;   
use strict;

use Most::ListUtils;

my $str = 'branches/Soft/a.txt';

my @paths = ('branches/Soft/a.txt', 'branches/Soft/b.txt',
    'branches/Docs/A1/b.txt', 'branches/Soft/B2/c.tct');

my $got_match = any { $_ =~ m/$str/ } @paths;

根据上面的列表,其中包含$str$got_match1

或者你可以手动滚动并抓住比赛

foreach my $p (@paths) {
    print "Found it: $1\n" if $p =~ m/($str)/;
}

这会打印出比赛。

注意您在示例中显示的字符串包含要匹配的字符串。我把它添加到我的列表中进行测试。如果没有它在列表中,则在任一示例中都找不到匹配项。

使用添加的样本

测试多个字符串
my @strings = ('branches/Soft/a.txt', 'branches/Soft/h.cpp', 'branches/Main/utils.pl');
my @paths = ('branches/Soft/a.txt', 'branches/Soft/h.cpp', 'branches/Main/utils.pl',
     'branches/Soft/B2/c.tct', 'branches/Docs/A1/b.txt');

foreach my $str (@strings) {
    foreach my $p (@paths) {
        print "Found it: $1\n" if $p =~ m/($str)/;
    }
    # Or, instead of the foreach loop above use
    # my $match = grep { /$str/ } @paths;
    # print "Matched for $str\n" if $match;
}

打印

Found it: branches/Soft/a.txt
Found it: branches/Soft/h.cpp
Found it: branches/Main/utils.pl

当取消注释grep的行并注释掉foreach个行时,我会获得相同字符串的相应打印。

答案 1 :(得分:0)

$a中的斜杠点会造成问题,因此您在进行正则表达式匹配或使用简单{{1}时必须转义它们找到匹配项:

eq转发的正则表达式匹配:

$a

简单比较"等于":

my @matches = grep { /\Q$a\E/ } @array;

对于您的示例数据,两者都会给出一个空数组my @matches = grep { $_ eq $a } @array; ,因为没有匹配项。

答案 2 :(得分:0)

这解决了我的问题。感谢所有特别是@zdim的宝贵时间和支持

   my @SVNFILES = ('branches/Soft/a.txt', 'branches/Soft/b.txt');
   my @paths = ('branches/Soft/a.txt', 'branches/Soft/b.txt',
'branches/Docs/A1/b.txt', 'branches/Soft/B2/c.tct');

            foreach my $svn (@SVNFILES)
            {
            chomp ($svn);
            my $m = grep { /$svn/ } (@paths);

                            if ( $m eq '0' ) {
                            print "Files Mismatch\n";
                            exit 1;
                            }

            }

答案 3 :(得分:-1)

你应该逃避像' /'和'。'在任何正则表达式中,当你需要它作为一个角色。

同样:

private void button1_Click(object sender, EventArgs e)
{
int n = int.Parse(textBox7.Text);
int[] numbers = new int[n];
int sum = 0;
float average;

for(int i=0; i<n; i++)
{
numbers[i] = int.Parse(textBox1.Text);
}
Array.Sort(numbers);

for(int i=0; i<n; i++)
{
sum += numbers[i];
}

average = ((float)sum / n);

textBox4.Text = numbers[0].ToString();
textBox5.Text = numbers[-1].ToString();
textBox2.Text = sum.ToString();
textBox3.Text = average.ToString();
}

使用grep或perl重试你所做的一切。如果它仍然无法正常工作,请准确告诉我们您的尝试。