加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么$_ =?“正则表达式”在Perl中有效?

发布时间:2020-12-14 06:05:04 所属栏目:百科 来源:网络整理
导读:我知道在Perl中,最常见的有效正则表达式是这样的: $_ =~ m/regular expression/;# and "m" can be omit$_ =~ /regular expression/; 我可以使用qr创建一个正则表达式引用,如下所示: my $regex = qr/regular expression/;$_ =~ m/$regex/;# and "m//" can b
我知道在Perl中,最常见的有效正则表达式是这样的:

$_ =~ m/regular expression/;

# and "m" can be omit
$_ =~ /regular expression/;

我可以使用qr创建一个正则表达式引用,如下所示:

my $regex = qr/regular expression/;
$_ =~ m/$regex/;

# and "m//" can be omit:
$_ =~ $regex;

但我试过这个:

my $str = "regular expression";
$_ =~ $str; # why this is valid?

它没有给我任何错误信息,并且工作正常.我不知道为什么,我认为应该是这样的:

my $str = "regular expression";
$_ =~ m/$str/;

# or
my $str = "regular expression";
my $regex = qr/$str/;
$_ =~ $regex;

谁能解释为什么$_ =?$str在Perl中有效?

解决方法

它说在 “The basics” in perlre下

Patterns that aren’t already stored in some variable must be delimitted,at both ends,by delimitter characters.

(以及错误的tt`)

因此,变量中的模式不需要分隔符.操作符=?在“Binding operators” in perlop讨论过

binds a scalar expression to a pattern match.

(以我为重点)

If the right argument is an expression rather than a search pattern,substitution,or transliteration,it is interpreted as a search pattern at run time.

运算符不关心右侧的分隔符,并且可以在运行时从表达式中形成“正则表达式”.

第“Gory details of parsing quoted constructs” in perlop节除此之外,还有助于解决这个问题.识别出引用的构造并插入包含的文本之后,它将弹出“解析正则表达式”的子弹

After preprocessing described above … the resulting string is passed to the RE engine for compilation.

(我的重点)

这是关于Perl如何处理引用构造和的一般讨论
一旦字符串由引用的构造形成,就不需要(额外的)分隔符. m / RE /(等)在前面的“插值”子弹中讨论过,它显示了一些不能用于模式的普通字符串的东西,但显然不是必须的.

我建议不要这样做;像你期望的那样使用qr.首先,使用字符串(而不是使用qr构建的正则表达式)是有限的.而且,它更容易出现愚蠢的错误.

请注意,虽然对于许多模式,可以使用qr或“”(或其运算符形式qq())来准备模式(或将以这种方式解释的字符串) – 它们不相同.他们的引用规则非常相似,但是qr准备了一个正则表达式,如Regexp Quote-Like Operators所示

… magically differs from a string containing the same characters …

首先,回想一下,使用qr可以使用修饰符.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读