设为首页 收藏本站
查看: 816|回复: 0

[经验分享] Perl 中的 s/// 操作符

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-26 09:24:09 | 显示全部楼层 |阅读模式
我们先来看一下 Perl 中的 s/// 操作符的用法:


    $var [=|!]~ s/pattern/replacement/[option] ;
  

程序1:


#!/bin/perl -w
use 5.010 ;

$s1 = '\n' ;
$s2 = "\n" ;
$s3 = "\\n" ;
say '$s1 = '."'\\n'" ;
say '$s2 = '.'"\n"' ;
say '$s3 = '.'"\\n"' ;
say '$_ = "123\nabc"' ;
say '********' ;
$_ = "123\nabc" ;
say 's/$s1/-/x' ;    # 1: 匹配
say s/$s1/-/x ;      # '\n' 直接被传递给了正则引擎,
                         # 正则引擎将 \n 解释为换行, 因此得到正确匹配
say ;                # 1230abc
say '--------' ;

$_ = "123\nabc" ;
say 's/$s2/-/x' ;    # 1: 匹配
say s/$s2/-/x ;      # "\n" 被 Perl 转义为一个换行符,
                         # 在选项 x 作用下被忽略为空,
                         # 因此匹配了字符串开头的空字符,
                         # 所以在字符串开头多了一个 0.
say ;                # 0123
say '--------' ;     # abc

$_ = "123\nabc" ;
say 's/$s3/-/x' ;    # 1: 匹配
say s/$s3/-/x ;      # "\\n" 被 Perl 转义为字符串 '\n' 并
                         # 传递给正则引擎, 正则引擎识别 \n 并解释为
                         # 换行, 因此得到正确匹配
say ;                # 1230abc
say '********' ;

DSC0000.png


  总结来说, 凡是使用变量作为 pattern 的时候, 都会经过 Perl 的转义.
  松散模式指的是, 在正则表达式中, 所有的空白符或者换行符都会被忽略, 但是变量中的不会.
程序2:



#!/bin/perl -w
use 5.010 ;

$s1 = '\n' ;
$s2 = "\n" ;
$s3 = "\\n" ;
say '$s1 = '."'\\n'" ;
say '$s2 = '.'"\n"' ;
say '$s3 = '.'"\\n"' ;
say '$_ = "123\nabc"' ;
say '********' ;
# pattern 为 \n 的情况下, 一定能够匹配
    # $_ 中的换行符, 因此, 我们
    # 只讨论 replacement 中的各种情况
$_ = "123\nabc" ;
say 's/\n/\n/x' ;   
say s/\n/\n/x ;        # 操作符直接看到 replacement 中的 \n,
                           # 不经过转义直接传递给正则引擎,
                           # 正则引擎识别 \n 为换行符并执行替换.
say ;                  # 123<Enter>
                       # abc
say '--------' ;   

$_ = "123\nabc" ;
say 's/\n/\\\\n/x' ;   
say s/\n/\\n/x ;       # 操作符直接看到 replacement 中的 \\n,
                           # 不经过转义直接传递给正则引擎,
                           # 引擎将 \\n 识别为.
                           # 一个反斜杠和一个字母 n
say ;                  # 123\nabc
say '--------' ;

$_ = "123\nabc" ;
say 's/\n/$s1/x' ;   
say s/\n/$s1/x ;       # '\n' 不被 Perl 转义, 作为两个字母传递给正则引擎,
                           # 正则引擎将这两个字母用于用 replacement.
say ;                  # 123<Enter>
                       # abc
say '--------' ;   

$_ = "123\nabc" ;
say 's/\n/$s2/x' ;   
say s/\n/+$s2+/x ;     # "\n" 被 Perl 转义为换行符并传递给正
                           # 正则引擎将转义后的换行符作用于
                           # 引擎的 replacement.
                           # 可见, x 选项不能作用于 replacement.
say ;                  # 123<Enter>
                       # abc        
say '--------' ;

$_ = "123\nabc" ;
say 's/\n/$s3/x' ;     # "\\n" 被 Perl 转义为一个反斜杠和一个字母 n,
                           # 并传递给正则引擎的 replacement,
                           # 引擎将 replacement 看到的两个字母
                           # 用于替换匹配的换行符.
say s/\n/$s3/x ;       # 123\nabc
say ;            
say '********' ;

DSC0001.png


  我认为, replacement 是没有经过 Perl 的变量转义, 直接在正则引擎替换了. 对于 x 选项, 我还有如下程序
  程序3:



#!/bin/perl -w
use 5.010 ;

$_ = "123\nabc" ;
say 's/\n/+<Enter>
+/' ;
say s/\n/+   
+/ ;          # 这说明 x 对 replacement 无效.     
                  # 但是依然将 replacement 中的换行符作用于替换中了,      
                             # 这说明 x 对 replacement 无效.   
say ;         # 123+<Enter>
                      # +abc

DSC0002.png



  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156422-1-1.html 上篇帖子: perl 函数参数传递与返回值(一) 下篇帖子: perl FAQ(zz)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表