为什么`stoutest`不是一个有效的正则表达式?

时间:2015-08-29 22:37:07

标签: regex perl

来自perlop

  

如果“/”是分隔符,则初始m是可选的。使用m,您可以使用任何一对非空白字符作为分隔符。这对于匹配包含“/”的路径名特别有用,以避免LTS(倾斜牙签综合征)。如果“?”是分隔符,然后是“PATTERN”的仅匹配一次规则?适用。如果“'”是分隔符,则不对PATTERN执行插值。当在标识符中使用有效字符时,在m。

之后需要空格

所以我可以把任何一封信作为分隔符。最终这个正则表达式应该没问题:

s/ou/es/

可以改写

$ perl -e '$_ = qw/ou/; stoutest; print'
ou

然而它似乎在Perl中不起作用。为什么呢?

{{1}}

3 个答案:

答案 0 :(得分:12)

因为Perl无法选择运算符s

perldoc perlop说这个

  

任何非空白分隔符都可以替换斜杠。使用标识符中允许的字符后,在s后添加空格。

这个程序运行正常

my $s = 'bout';
$s =~ s toutest;
say $s;

输出

best

答案 1 :(得分:4)

替换运算符以s标识符开头,而您的代码没有。必须使用

s toutest

如果按照您的想法运作,我们就无法拥有以mstrq或{{1开头的任何运营商或子程序因为所有这些都可以跟随任何非空白分隔符。

具有讽刺意味的是,您自己的代码证明了为什么它不能像您想象的那样。如果它按你想象的方式工作

y

不等同于

$_ = qw/ou/; stoutest; print

这相当于

$_ = qw/ou/; s/ou/es/; print

又名

$_ = q'/ou/; stoutest; print

答案 2 :(得分:4)

因为?autoplay=1或任何其他字母数字字符串是Perl解析器眼中的单个标记。否则,我们无法使用以stoutest(或smq开头的任何裸字。

这很有效,但

y