sandy_amao 发表于 2017-10-27 14:54

一个看似简单的匹配,使用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";
   }
}
}

sandy_amao 发表于 2017-10-27 15:12

焦急等待中,请大神出手

jason680 发表于 2017-10-27 15:35

回复 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:44

本帖最后由 sunzhiguolu 于 2017-10-27 15:45 编辑


sandy_amao 发表于 2017-10-27 15:52

回复 3# jason680

问题可能是我描述复杂了:即一个句子中有 @*.等这种字符,我们使用quotemeta后,软件会把它变为\@\*\. ,这种带斜杆的字符出现在句子中后,我后面的变量也包含这种字符时如何匹配?

如$a="abc@*"   ; quotemeta $a后则为$a=abc\@\*
我现我一个变量为$b="c@".
这个$b如可在$a中匹配呢?
$b=quotemeta $b;
使用下面的匹配好象不行。
$a=~/$b/gi

这时要匹配的话如何才行?

sohusina 发表于 2017-10-27 16:12

#!/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里面的字符串一定要是单引号。

sohusina 发表于 2017-10-27 16:19

还有@fileb里面也是如此,即要是单引号。

sandy_amao 发表于 2017-10-27 16:57

多谢各位大神,你们太棒了,搞定

rubyish 发表于 2017-10-28 02:31

回复 3# jason680

@xxx = q(chiqker@.139.com ...);q or qw ~~ :shock:
页: [1]
查看完整版本: 一个看似简单的匹配,使用quotemeta后,就是匹配不出来