免费注册 查看新帖 |

Chinaunix

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

已经解决.结贴 脚本 Perl - 字符匹配计数 (空列表上下文) [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-30 23:20 |只看该作者 |倒序浏览
本帖最后由 sunzhiguolu 于 2015-10-02 15:51 编辑

  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;

  5. my $text = "AADBAB";
  6. my $cnt = () = $text =~ m/A|B/g;
  7. say "Match times : $cnt";
复制代码
在以上的表达式中若没有那对小括号便不能获取到指定字符的匹配数量的总和, 如果您知道 "()" 在此处的含义. 请您给我一个回复, 在此先谢过大家了...

论坛徽章:
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 [报告]
发表于 2015-09-30 23:57 |只看该作者
本帖最后由 sunzhiguolu 于 2015-10-01 00:10 编辑

    不知道在这对小括号中包含什么, 它居然能够求和. 如果大家有什么好方法可以进行测试验证的话, 也行. (另外, 这个东西是不是不属于大众的东西呀? 所以知道的人比较少.)

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2015-10-01 00:37 |只看该作者
这是个很经典的例子,其实很简单他利用的是赋值表达式在 scalar context 的值

perlop#Assignment-Operators

a list assignment in list context produces the list of lvalues assigned to, and a list assignment in scalar context returns the number of elements produced by the expression on the right hand side of the assignment.

my $cnt = ( () = $text =~ m/A|B/g ); # $cnt 右边是个赋值表达式, ()= 是给 $text =~ m/A|B/g 提供 list context 用的,没有的话 $text =~ m/A|B/g 在 scalar context 下的行为是不太一样的。

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 我明白了, 谢谢您.

查看全部评分

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
4 [报告]
发表于 2015-10-01 00:39 |只看该作者
Perl 是上下文敏感的语言,匹配操作在列表上下文中,返回匹配的值的列表。
  1. my @match_strs = 'aabbcc' =~ /a|b/g;
  2. # @match_strs eq ('a','a','b','b')
复制代码
而列表在标量上下文中返回列表的长度:
  1. my $list_length = (1,2,3);
  2. # $list_length == 3
复制代码
而在标量上下文中,匹配返回的是是否匹配:1 or ''
  1. my $if_match = 'abc' =~ /a|b/g;
  2. # $if_match == 1
复制代码
想直接返回匹配次数,可以这样写:
  1. my $str = 'abc';
  2. my $match_times = $str =~ s/(a|b)/$1/g;
  3. # $match_times == 2
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 我明白了, 谢谢您.

查看全部评分

论坛徽章:
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 [报告]
发表于 2015-10-01 01:14 |只看该作者
本帖最后由 sunzhiguolu 于 2015-10-01 01:41 编辑

回复 4# 104359176
感觉 m 操作符 与 ( s 或 tr ) 操作符在匹配成功时返回值确有不同, 前者在未添加 /g 修饰符的前提下返回第一次匹配成功的 "1", 而后两者则是像您举例中那样返回的是匹配并替换或转换的总次数.

  1. my $str = "aabbcc";
  2. my $cnt = $str =~ tr/ab/ab/;
复制代码
方才我做了一些小测试, 测试的结果就像您所说的那样:

  1. my @array = (1, 2, 3);
  2. my $cnt = () = @array;        # $cnt = 3
  3. $cnt = () = (@array, 4..7);   # $cnt = 7
复制代码
向您请教一下, 像这种操作符是不是属于比较小众化的东西. 在应用上不如使用 s 或 tr 那种的比较通用. 如果在以后的使用当中我应该选择那种方式比较好一些?

对了, 差点忘记向您道谢 (光看代码了). 感谢您的帮助.

   

论坛徽章:
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
6 [报告]
发表于 2015-10-01 01:24 |只看该作者
回复 3# zhlong8
我懂了, 谢谢您的帮助.

   

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
7 [报告]
发表于 2015-10-01 12:48 |只看该作者
Perl 语言的哲学是条条大路通罗马,也就是同样的要求,往往有许多不同的实现。至于哪种实现适合你,你自己选择吧。我喜欢简洁的代码,而不同的人的思维模式又让简洁的定义因人而异。

论坛徽章:
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
8 [报告]
发表于 2015-10-02 09:20 |只看该作者
谢谢您, 我懂了...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP