忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12
最近访问板块 发新帖
楼主: myuanzhao

新人求助 面试时 perl正则匹配题 [复制链接]

论坛徽章:
10
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之山东
日期:2017-11-10 14:32:14
发表于 2017-06-27 10:43 |显示全部楼层
本帖最后由 523066680 于 2017-06-27 11:03 编辑

回复 9# myuanzhao

File::Slurp 我大前天刚学的啊,现学现卖,不使用该模块可以这样写:
  1. open my $FH, "<:crlf", "Block.txt";
  2. my $text;

  3. {
  4.     local $/ = undef;
  5.     $text = <$FH>;
  6. }

  7. close $FH;

  8. my $NTR = "NEED TO REBUILD";

  9. $text =~s/(block2\s+LAYER1\s+).*?(\s+LAYER2)/$1$NTR$2/si;
  10. $text =~s/(block2\s+.*?LAYER2\s+).*?(\s+LAYER3)/$1$NTR$2/si;

  11. print $text;
复制代码

又或者是

  1. open my $FH, "<:crlf", "Block.txt";
  2. my $text = join("", (<$FH>));

  3. my $NTR = "NEED TO REBUILD";

  4. $text =~s/(block2\s+LAYER1\s+).*?(\s+LAYER2)/$1$NTR$2/si;
  5. $text =~s/(block2\s+.*?LAYER2\s+).*?(\s+LAYER3)/$1$NTR$2/si;

  6. print $text;
复制代码

看书可以了解很多经典常用的模块还有更好的使用技巧:
Learning Perl, Intermediate Perl 和 Mastering Perl、Effective Perl Programming

最近看到 metacpan.org 上面多了一个链接,好像可以通过这个模块来了解、学习其他模块:
    New to CPAN? Maybe take a look at Task::Kensho!  

论坛徽章:
120
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-06-27 11:09 |显示全部楼层
回复 11# 523066680


也许你的重点在这...
{
    local $/ = undef;
    $text = <$FH>;
}



但小心这里的问题....

$text =~s/(block2\s+LAYER1\s+).*?(\s+LAYER2)/$1$NTR$2/si;
$text =~s/(block2\s+.*?LAYER2\s+).*?(\s+LAYER3)/$1$NTR$2/si;



block1
    ...
block2
    LAYER1
        ...
    LAYERn
        ...
    LAYER2
        ...
block3  
    LAYER1
        ...
    LAYER2
        ...
    LAYER3

论坛徽章:
10
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之山东
日期:2017-11-10 14:32:14
发表于 2017-06-27 11:13 |显示全部楼层
本帖最后由 523066680 于 2017-06-27 11:23 编辑

回复 12# jason680
大意了

改:
$text =~s/(block2\s+LAYER1\s+).*?(\s+LAYER\d+|\s+block\d+|$)/$1$NTR$2/si;
$text =~s/(block2\s+.*?LAYER2\s+).*?(\s+LAYER\d+|\s+block\d+|$)/$1$NTR$2/si;

论坛徽章:
28
酉鸡
日期:2014-05-04 10:03:482015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:09
发表于 2017-06-27 11:22 |显示全部楼层
回复 1# myuanzhao


  1. awk '!s{print $0}$0~"block2"{p=1;s=1}p&&$0~"LAYER(1|2)"{print $0"\n\tNEED TO REBULID";t=0;next}p&&/LAYER3/{r=1;p=0}r' file
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2017-06-27 16:16 |显示全部楼层
我也写了一个:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $flag_b=0;
  5. my $content;

  6. while(<DATA>){
  7. $content .= $_;
  8. }
  9. if($content =~ s/(block2.*LAYER1).*\n(.*LAYER2)/$1\n        NEED TO REBUILD\n$2/gs && $content =~ s/(block2.*LAYER2).*\n(.*LAYER3)/$1\n        NEED TO REBUILD\n$2/gs){
  10.   print "$content\n";
  11. }
  12. __DATA__
  13. block1
  14.     LAYER1
  15.         a0=56, b0=147.345989944561, c0=11.0225098942223
  16.         a1=76, b1=174.434168420681, c1=253.89644118973
  17.         a2=42, b2=117.774925865152, c2=182.422622167185
  18.     LAYER2
  19.         a0=48, b0=164.391521356056, c0=243.612268442083
  20.         a1=56, b1=56.3028265552006, c1=67.3497698774622
  21.         a2=17, b2=182.182082410397, c2=265.689705668802
  22. block2
  23.     LAYER1
  24.         a0=13, b0=98.5005938116799, c0=193.432038047288
  25.         a1=32, b1=173.682215090149, c1=284.746973938173
  26.         a2=80, b2=77.3396633455278, c2=45.913625227217
  27.     LAYER2
  28.         a0=89, b0=6.78883867591011, c0=181.63053325133
  29.         a1=35, b1=51.962410302621, c1=114.479466051294
  30.         a2=57, b2=88.5057901717936, c2=119.906443042102
  31.     LAYER3
  32.         a0=22, b0=135.172781428776, c0=180.32730953417
  33.         a1=89, b1=38.4925211497517, c1=171.120129693275
  34.         a2=53, b2=102.546819074468, c2=235.02212266283
  35.         a3=5, b3=46.5476781394699, c3=69.2620776701364
  36. block3
  37.     LAYER1
  38.         a0=89, b1=38.4925211497517, c1=171.120129693299
  39.         a1=53, b2=102.546819074468, c2=235.02212266299
复制代码

有点丑,还管用。

论坛徽章:
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
发表于 2017-06-27 22:52 |显示全部楼层
或者 这样
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. local $/ = "\nblock";
  5. while(<DATA>){
  6.         chomp;
  7.         s/\A(?:block)?(\d+).*\n//;
  8.         print("block$1\n");
  9.         if($1 == 2){
  10.                 $_ = /^(\s*layer(?![12]\b).*)/mis ? $1 : '';
  11.                 $_ = "    LAYER1\n\tNEED TO REBULID\n    LAYER2\n\tNEED TO REBULID\n$_";
  12.         }
  13.         print("$_\n");
  14. }

  15. __DATA__
  16. block1
  17.     LAYER1
  18.         a0=56, b0=147.345989944561, c0=11.0225098942223
  19.         a1=76, b1=174.434168420681, c1=253.89644118973
  20.         a2=42, b2=117.774925865152, c2=182.422622167185
  21.     LAYER2
  22.         a0=48, b0=164.391521356056, c0=243.612268442083
  23.         a1=56, b1=56.3028265552006, c1=67.3497698774622
  24.         a2=17, b2=182.182082410397, c2=265.689705668802
  25. block2
  26.     LAYER1
  27.         a0=13, b0=98.5005938116799, c0=193.432038047288
  28.         a1=32, b1=173.682215090149, c1=284.746973938173
  29.         a2=80, b2=77.3396633455278, c2=45.913625227217
  30.     LAYER2
  31.         a0=89, b0=6.78883867591011, c0=181.63053325133
  32.         a1=35, b1=51.962410302621, c1=114.479466051294
  33.         a2=57, b2=88.5057901717936, c2=119.906443042102
  34.     LAYER3
  35.         a0=22, b0=135.172781428776, c0=180.32730953417
  36.         a1=89, b1=38.4925211497517, c1=171.120129693275
  37.         a2=53, b2=102.546819074468, c2=235.02212266283
  38.         a3=5, b3=46.5476781394699, c3=69.2620776701364
  39. block3
  40.     LAYER1
  41.         a0=89, b1=38.4925211497517, c1=171.120129693299
  42.         a1=53, b2=102.546819074468, c2=235.02212266299
复制代码

论坛徽章:
0
发表于 2017-06-28 17:34 |显示全部楼层
现在还有公司用perl呢, 我都失业好久了

论坛徽章:
0
发表于 2017-06-29 23:23 |显示全部楼层
回复 11# 523066680

Task::Kenso的内容也要鉴别对待,有些较新的东西没有列在上面,比如Async没有提Mojo::IOLoop,CLI工具没有提Reply,Excel/CSV没有提Spreadsheet::ParseXLSX和Excel::Writer::XLSX,网络爬虫没有提Mojo::UserAgent以及WWW::Mechanize::PhantomJS,等等。

除了Task::Kenso外,也可以看这个按点赞数的排名https://metacpan.org/favorite/leaderboard,有时间的话前几十名都可以点进去了解一下是做什么用的。

另外File::Slurp虽然是以前一个很流行的读写文件的模块,但是它在unicode操作上有隐患。现在很多人包括perlfaq5文档建议用Path::Tiny,它除了文件读写外把本来分散在好几个File::XXX模块中的功能都合并在了一起。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP