我需要从数组中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。例如
答案 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_match
为1
。
或者你可以手动滚动并抓住比赛
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重试你所做的一切。如果它仍然无法正常工作,请准确告诉我们您的尝试。