perl学习笔记-----------------------(9)

来源:互联网 发布:李昌钰有多厉害知乎 编辑:程序博客网 时间:2024/06/08 05:29
m//(模式匹配)的一种简写。同qw//操作一样,可以使用任何成对的分隔符。因此,可以使用m(fred), m<fred>, m{fred}, m[fred],或者m,fred,, m!fred!, m^fred^,其它非成对的分隔符也可以。
如果使用正斜线(/)作为分隔符,则可以省略掉前面的m。由于Perler 喜欢少输入字符,因此大多数模式使用的是正斜线,如/fred/
如果想写一个匹配web URL 开头部分的模式,你可能使用/http:\/\//来匹配http://。但如果使用m%http://%将更易于阅读,书写,维护,以及调试。使用花括号({})作为分隔符也是很平常的。如果你使用的是专为程序员设计的文本编辑器,由于它能自动从开花括号跳到闭花括号,这对于维护代码将非常有用。
记住,正斜线不是元字符,如果它不是分隔符,则不需在前面使用反斜线。
不区分大小写:/i。要创建一个大小写无关的模式,如匹配FRED 时,也能匹配上fred, Fred,可以使用修饰符/i:
         
           print “Would you like to play a game?”;           chomp($_ = <STDIN>);           if(/yes/i) {#大小写无关                  print “In that case, I recommend that you go bowling.\n”;             }       

匹配任何字符:/s。默认情况下,点(.)不匹配换行符,这对于“单行中查找”的问题能很好解决。如果你的字符串中有换行符,并希望点(.)能匹
配它们,那可以使用/s 这个修饰符。
$_ = “I saw Barney\ndown at the bowing alley\nwith Fred\nlast night.\n”;if(/Barney.*Fred/s){print “That string mentions Fred after Barney!\n”;}

如果不使用/s,那么上述模式将不能被匹配上,因为这两个字符不在同一行中。
/x 修饰符,允许你在模式中加入任何数量的空白。Perl 中,注释可以被作为空白,因此使用/x,可以在模式中加上注释:
/-? #可选的负号\d+ #小数点前一个或多个十进制数字\.? #可选的小数点\d* #小数点后一些可选的十进制数字/x #模式结束

井号(#)表示后面是注释,如果需要匹配井号,可以使用\#或[#]。注意不要在注释中使用闭分隔符,否则将结束此模式匹配。如果在一个模式中需使用不止一个修饰符,可以一个接着一个。其顺序是不重要的:
if(/barney.*fred/is/){ # /i 和/sprint “That string mentions Fred after Barney!\n”;}


下面是包含注释的版本:
if (m{barney #小个子小伙.* #可以包含任何字符fred #嗓门大的小伙}six) { #修饰符包括包括/s, /i, /xprint “That string mentions Fred after Barney!\n”;}

注意这里的分隔符:花括号,它允许那些专为程序员设计的文本编辑器可以从正表达式的开端跳到末端。默认情况下,如果模式在字符串开头没能匹配上,它会顺着字符串下去,直到匹配上为止。如果使用了锚定(anchors)则可以要求模式在特定的位置进行匹配。符号^表示在字符串的开头进行匹配,而符号$则表示在结尾。。因此,模式/^fred/只匹配字符串的开头部分;它不会匹配上manfred man。而/rock$/只在结尾处匹配;其不会匹配上knute rockne。锚定不仅仅针对字符串的两头。词界锚定,\b,是针对单词使用的。如/\bfred\b/可以匹配上单词fred
非词界锚定为\B。它将在任何非\b 匹配的点上进行匹配。因此,模式/\bsearch\B/将匹配searches, searching, searched, 但不能匹配search,或者researching。绑定操作符,=~:告诉Perl 将右边的模式在左边的字符串上进行匹配,而非对$_匹配。
my $some_other = “I dream of betty rubble.”;if($some_other =~ /\brub/){print “Aye, there’s the rub.\n”;}
第一次见到绑定操作符(binding operator:=~),可能觉得它有些像赋值操作符,但它不是。其含义是:“这个模式默认将对$_进行匹配,但此时将对左边的字符串进行匹配”。如果没有绑定操作符,则此表达式将对$_匹配。由于绑定操作有非常高的优先级,因此,模式测试部分的括号不是必需的,下面的代码和上面代码的含义是一样的。它将
测试部分的结果(而非行输入)返回给变量$likes_perl:
my $likes_perl = <STDIN> =~ /\byes\b/i;
正则表达式可以被内插,如同双引号字符串一样。。这允许我们快速地写出类似grep 的程序:
#! /usr/bin/perl –wmy $what = “larry”;while(<>){if(/^($what)/){ #在字符串前面进行匹配print “We saw $what in beginning of $_;”;}
当程序运行时,模式将被$what 的值代替。在本例中,它同使用/^(larry)/是一样的,在行的开头处查找larry。如果没有在程序中具体指出$what 的值,也可以在命令行中输入,然后使用参数@ARGV:
my $what = shift @ARGV;
可以使用eval 块来捕捉错误,或者使用quotemea(或者其等价形式:\Q)将内插部分引用起来,使之不会被当作正则表达式来处理。变量个数同模式中括号对数的个数是相同的。
$_ = “Hello there, neighbor”;if(/\s(\w+),/){ #空格和逗号之间的词print “the word was $1\n”; #the word was there}
也可以一次使用多个:
$_ = “Hello there, neighbor”;if(/(\S+) (\S+), (\S+)/){print “words were $1 $2 $3”;}




0 0
原创粉丝点击