免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3814 | 回复: 5
打印 上一主题 下一主题

正则匹配,遇到 quotemeta 不好使,求解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-06-02 14:06 |只看该作者 |倒序浏览
本帖最后由 david_95 于 2016-06-02 17:00 编辑

我有一批文本,我想用一个哈希来动态匹配,找到匹配的行,为了方便大家调试,我写成以下
    my @lines;
    push @lines,"{table_name:cntech_cx_brands_table,brand_locale_name:\"CN\",brand_gl_id:\"194\",brand_gl_description:\"gl_beauty\",brand_standard_name:\"Hazeline 夏士莲\",brand_scope:\"DEFAULT\",brand_is_valid:true,brand_image_name:\"img16/template/logo/480240/logo_xiashilian_480240\",brand_store_url:\"\",brand_from_country:\"\",brand_rich_content:\"\",brand_priority:0,brand_extra_info:\"\",brand_comments:\"\",brand_is_new:false,brand_sm:\"\",brand_is_ags:0,audit_info:{created_by:anhongli,creation_date:2016-06-01T03:24:39.009-00:00},stage_version:\"cntech_cx_brandsProd1-10\"}";
    push @lines,"{table_name:cntech_cx_brands_table,brand_locale_name:\"CN\",brand_gl_id:\"201\",brand_gl_description:\"gl_beauty\",brand_standard_name:\"Hazeline 夏士莲\",brand_scope:\"DEFAULT\",brand_is_valid:true,brand_image_name:\"img16/template/logo/480240/logo_xiashilian_480240\",brand_store_url:\"\",brand_from_country:\"\",brand_rich_content:\"\",brand_priority:0,brand_extra_info:\"\",brand_comments:\"\",brand_is_new:false,brand_sm:\"\",brand_is_ags:0,audit_info:{created_by:anhongli,creation_date:2016-06-01T03:24:39.009-00:00},stage_version:\"cntech_cx_brandsProd1-10\"}";
    push @lines,"{table_name:cntech_cx_brands_table,brand_locale_name:\"CN\",brand_gl_id:\"194\",brand_gl_description:\"gl_beauty\",brand_standard_name:\"Hazeline 夏士莲\",brand_scope:\"DEFAULT\",brand_is_valid:true,brand_image_name:\"img16/template/logo/480240/logo_xiashilian_480240\",brand_store_url:\"\",brand_from_country:\"\",brand_rich_content:\"\",brand_priority:0,brand_extra_info:\"\",brand_comments:\"\",brand_is_new:false,brand_sm:\"\",brand_is_ags:0,audit_info:{created_by:anhongli,creation_date:2016-06-01T03:24:39.009-00:00},stage_version:\"cntech_cx_brandsProd1-10\"}";
   
  my $hash_filter={brand_gl_id=>"201",brand_standard_name =>"夏士莲"};
  
我要匹配行为包含  brand_gl_id:“201” 并且 brand_standard_name:".*?夏士莲.*?” 的行,也就是第二行,数组@lines中的第二个

我的代码为以下, 无法匹配到:

    while(my ($key,$value)=each %$hash_filter){
        say $key.":".$value;
        my $cond=quotemeta($key).":\".*?".quotemeta($value).".*?\"";
        say $cond;
        @lines=grep {$_=~/quotemeta($cond)/g} @lines;
    }

于是我直接实验,把字符串填进去,就可以匹配到
    @lines=grep {$_=~/brand_gl_id:".*?201.*?"/g}@lines;                       
    @lines=grep {$_=~/brand_standard_name:".*?夏士莲.*?"/g}@lines;  

弄不懂为什么, 打印输出 $cond ,就是我直接填入的字符串啊, 为什么匹配不到呢? 求大神指点


论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
2 [报告]
发表于 2016-06-02 15:44 |只看该作者
回复 1# david_95
能否贴出一部分示例文本, 看的可以更直观点, 谢谢.

   

论坛徽章:
0
3 [报告]
发表于 2016-06-02 16:56 |只看该作者
本帖最后由 david_95 于 2016-06-02 17:04 编辑

{table_name:cntech_cx_brands_table,brand_locale_name:"CN",brand_gl_id:"194",brand_gl_description:"gl_beauty",brand_standard_name:"Hazeline 夏士莲",brand_scope:"DEFAULT",brand_is_valid:true,brand_image_name:"img16/template/logo/480240/logo_xiashilian_480240",brand_store_url:"",brand_from_country:"",brand_rich_content:"",brand_priority:0,brand_extra_info:"",brand_comments:"",brand_is_new:false,brand_sm:"",brand_is_ags:0,audit_info:{created_by:anhongli,creation_date:2016-06-01T03:24:39.009-00:00},stage_version:"cntech_cx_brandsProd1-10"}
{table_name:cntech_cx_brands_table,brand_locale_name:"CN",brand_gl_id:"201",brand_gl_description:"gl_beauty",brand_standard_name:"Hazeline 夏士莲",brand_scope:"DEFAULT",brand_is_valid:true,brand_image_name:"img16/template/logo/480240/logo_xiashilian_480240",brand_store_url:"",brand_from_country:"",brand_rich_content:"",brand_priority:0,brand_extra_info:"",brand_comments:"",brand_is_new:false,brand_sm:"",brand_is_ags:0,audit_info:{created_by:anhongli,creation_date:2016-06-01T03:24:39.009-00:00},stage_version:"cntech_cx_brandsProd1-10"}
{table_name:cntech_cx_brands_table,brand_locale_name:"CN",brand_gl_id:"194",brand_gl_description:"gl_beauty",brand_standard_name:"Hazeline 夏士莲",brand_scope:"DEFAULT",brand_is_valid:true,brand_image_name:"img16/template/logo/480240/logo_xiashilian_480240",brand_store_url:"",brand_from_country:"",brand_rich_content:"",brand_priority:0,brand_extra_info:"",brand_comments:"",brand_is_new:false,brand_sm:"",brand_is_ags:0,audit_info:{created_by:anhongli,creation_date:2016-06-01T03:24:39.009-00:00},stage_version:"cntech_cx_brandsProd1-10"}

文本是这样, 一层是我转成perl 字符串,并存入一个数组中的code

论坛徽章:
0
4 [报告]
发表于 2016-06-02 17:19 |只看该作者
哦,我知道了, quotemeta 是让 .*? 等符号不起作用, 如果需要变量里的.*? 起作用,直接写变量名就行。 我理解错了,我以为quotemeta 是让变量的值作为正则模式。
这个问题,我找到答案了,谢谢 sunzhiguolu

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
5 [报告]
发表于 2016-06-02 18:53 |只看该作者
我还没弄明白咋回事, 你就搞定了, 排错速度太快了! 向您学习!!!

论坛徽章:
0
6 [报告]
发表于 2016-06-02 20:35 |只看该作者
惭愧,本不该犯得错,自己看文档不仔细
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP