`
阿尔萨斯
  • 浏览: 4179421 次
社区版块
存档分类
最新评论

[Perl]关于m//g的问题

 
阅读更多
版权声明:可以任意转载,但转载时必须标明原作者charlee、原始链接http://tech.idv2.com/2008/09/05/perl-m-g/以及本声明。


今天讨论一下m//g一个的小问题。m//g表示在字符串中查找所有可能出现的模式匹配。在标量环境下,m//g会依次查找每个出现的匹配。通常的用法是这样的:

while (/(pattern)/g) {
print $1; # 做些操作
}在内部,m//g会保存一个“匹配位置”的变量,表示这次的m//g匹配到了什么位置,以便下次运行时从该处继续开始。(这个位置可以通过pos函数获得,这里就不多说了。)通常,用在while循环里是没有任何问题的,但如果换成if会怎样?

$_ = "abc";
print "a" if /a/g;
print "b" if /b/g;
# 输出结果:ab结果是正确的。如果将语句换个位置呢?

$_ = "abc";
print "b" if /b/g;
print "a" if /a/g;
# 输出结果:b可见,第二次的模式 a 没有匹配。其实可以想到,第一次的m/b/g匹配后,匹配位置已经指向了字符串中的下一个位置c,第二行的m/a/g继续从c开始匹配,当然不会匹配到任何东西。

借用一下《精通正则表达式》第7章对于Match运算符的说明:

匹配类型 尝试开始位置 匹配成功时的pos值 匹配失败时的pos值
m/.../ 字符串起始位置(忽略pos) 重置为undef 重置为undef
m/.../g 字符串的pos位置 匹配结束位置的偏移值 重置为undef
m/.../gc 字符串的pos位置 匹配结束位置的偏移值 不变

话说回来,在if中使用/g选项是毫无意义的。这里只是提个醒,当你遇到诡异的无法匹配的问题时,别忘了是不是在if中使用了m//g。

分享到:
评论

相关推荐

    Using Perl For Web Programming.pdf

    Using Perl for Web Programming David Harlan, et al. CONTENTS Chapter 1 Perl Overview Perl Origins H Borrowings H Cost and Licensing H Distribution H G Perl Programs Invocation H Command-Line ...

    Perl5语言全教程

    1、匹配所有可能的模式(g选项) 2、忽略大小写(i选项)例 3、将字符串看作多行(m选项) 4、只执行一次变量替换例 5、将字符串看作单行例 6、在模式中忽略空格 五、替换操作符 六、翻译操作符 七、扩展模式匹配 1...

    perl 程序开发教程

    1、匹配所有可能的模式(g选项) 2、忽略大小写(i选项)例 3、将字符串看作多行(m选项) 4、只执行一次变量替换例 5、将字符串看作单行例 6、在模式中忽略空格 五、替换操作符 六、翻译操作符 七、扩展模式匹配 1...

    Understand-2.6.556_2

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...

    (Scientific Toolworks Understand)v2.6.556 x86_1

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...

    最新版Understand-Chinese-4.0.922-Linux 中文版

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的 project 也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码 代码语法高亮、代码 代码折叠、交叉...

    EMOT 圖片編輯器

    Hack作者:Roy2 Hack说明:可以直接在管理中心编辑 EMOT 图片(e.g. ),方便不懂 Perl 或是不想手动修改文件的人 参考版本:MX v1.60 修改档案: 1 个(code.cgi) 增加档案:setemoticon.cgi(755) -> cgi-...

    Springer Analyzing Computer Systems Performance with Perl

    Springer Analyzing Computer Systems Performance with Perl Preface ........................................................ vii Part I Theory of System Performance Analysis 1 Time—The Zeroth ...

    Linux(Ubuntu)下Mysql5.6.28安装配置方法图文教程

    /dev/vda1 79G 1.6G 74G 3% / udev 3.9G 8.0K 3.9G 1% /dev tmpfs 799M 252K 799M 1% /run none 5.0M 0 5.0M 0% /run/lock none 3.9G 0 3.9G 0% /run/shm # uname -a Linux nj01 3.16.0-34-generic #47~

    openssl 1.1.1m最新rpm包,可直接升级

    openssl 1.1.1m最新rpm包,可直接升级

    centos 7.5 安装zabbix4.0

    `useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" Zabbix` 启动zabbix server `/data/zabbix/sbin/zabbix_server -c /data/zabbix/etc/zabbix_server.conf` 启动...

    amlvm-snapshot:Amanda的插件,提供LVM快照功能

    例如: install -m 755 -o root -g root amlvm-snapshot /usr/lib/amanda/application/amlvm-snapshot您可能需要在脚本本身的下面一行中编辑Amanda的Perl库的位置。 use lib '/usr/lib/amanda/perl/';配置阿曼达在...

    BB1407openwrt-RG100A_DB120-squashfs-cfe.bin

    发布前我分别在Open-wrt 12.09和CentOS6.5上测试上传和下载了几个G的文件没有任何问题,可稳定运行。下面就开始说主题吧。 首先说下注意事项,主要是针对之前用过bash版的童鞋 1、Perl版的配置文件与bash版的有...

    Windows 64位编译好的Openssl静态库、相关安装包和demo示例

    资源包括:编译好的openssl静态库,openssl-1.0.2m.tar.g压缩包,ActivePerl-5.26.0.2600-MSWin32-x64-403866.exe安装包(Win64),nasm-2.14-installer-x64.exe安装包,附加一个win64下的demo示例

    正则表达式

    m (多行查找) vaScript动态正则表达式问题 请问正则表达式可以动态生成吗? 例如JavaScript中: var str = "strTemp"; 要生成: var re = /strTemp/; 如果是字符连接: var re = "/" + str + "/"即可 但是要...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    * [a-z&&[^m-p]] a through z, and not m through p: [a-lq-z](subtraction) [a-z&&[^m-p]] 从a 到 z, 不包括从 m 到 p: [a-lq-z](子集) * * Predefined character classes 预定义字符序列 * ...

    dotfiles:一个人的住所(-在主目录中〜)是他的城堡

    2B显示键码$ xxd $ cat >/dev/null $ sed -nl $ od -c $ vim -> i -> <Cv><key>显示使用的键映射ack ctrl- | perl -ne 'm/(CTRL-.?)/g; print $1."\n";' | sort| uniq Tmux ###反向shell [在本地主机上的tmux会话中]...

    PHP正则表达式基本函数 修饰符 元字符和需转义字符说明

    '” 注意:perl风格中表达式要求以/开始和结尾,如:/food/ 表匹配字符 food perl修饰符如下: i 完成不区分大小写的搜索 g 查找所有出现(all occurrences,完成全局搜索) m 将一个字符串视为多行(m就表示多...

Global site tag (gtag.js) - Google Analytics