一个看似简单的匹配,使用quotemeta后,就是匹配不出来
把数组filea中含有数组fileb中的后缀的元素全删除,由于有字符@及*,使用了quotemeta后,就是匹配不上,请高人出手.
@filea=("chiqker@.139.com","504508013@.163.COM","abcd@OK.com","abcd@al*.com");
@fileb=("@.139.com","@.163.COM","@al*.COM");
@filea=map {quotemeta $_}@filea;
@fileb=map {quotemeta $_}@fileb;
foreach my $tmp(@filea)
{
foreach my $tmp1(@fileb)
{
if($tmp=~/$tmp1/gi)
{
print "$tmp\n";
}
}
}
焦急等待中,请大神出手 回复 1# sandy_amao
0. warings
use strict;
use warnings;
A. " change to '
"chiqker@.139.com"
'chiqker@.139.com'
B. using q(...) function
@xxx = ("chiqker@.139.com","...");
@xxx = q(chiqker@.139.com ...);
本帖最后由 sunzhiguolu 于 2017-10-27 15:45 编辑
回复 3# jason680
问题可能是我描述复杂了:即一个句子中有 @*.等这种字符,我们使用quotemeta后,软件会把它变为\@\*\. ,这种带斜杆的字符出现在句子中后,我后面的变量也包含这种字符时如何匹配?
如$a="abc@*" ; quotemeta $a后则为$a=abc\@\*
我现我一个变量为$b="c@".
这个$b如可在$a中匹配呢?
$b=quotemeta $b;
使用下面的匹配好象不行。
$a=~/$b/gi
这时要匹配的话如何才行?
#!/bin/perl -w
@filea=("chiqker@.139.com","504508013@.163.COM",'abcd@OK.com','abcd@al*.com');
@fileb=("@.139.com","@.163.COM","@al*.COM");
#@filea=map {quotemeta $_}@filea;
#@fileb=map {quotemeta $_}@fileb;
foreach my $tmp(@filea)
{
foreach my $tmp1(@fileb)
{
if($tmp=~/\Q$tmp1\E/i)
{
print "$tmp\n";
}
}
}
记得@filea里面的字符串一定要是单引号。 还有@fileb里面也是如此,即要是单引号。 多谢各位大神,你们太棒了,搞定 回复 3# jason680
@xxx = q(chiqker@.139.com ...);q or qw ~~ :shock:
页:
[1]