为什么`$ str1 =〜"foo"`被识别为`$ str1 = ~m/foo /`(而不是语法错误)?

Per*_*uck 7 regex perl

我最近看到了一个不熟悉Perl的人的代码.他想比较两个字符串的相等性,但不知道eq运算符,所以他这样使用=~:

my $str1 = 'foobar';
my $str2 = 'bar';
if ( $str1 =~ $str2 ) {
    print "strings are equal\n";
}
Run Code Online (Sandbox Code Playgroud)

另一个片段是

if ( $str1 =~ "foo" ) {
    print "string equals 'foo'\n";
}
Run Code Online (Sandbox Code Playgroud)

当然,它应该只是阅读$str1 eq $str2$str1 eq "foo"避免误报.

我运行代码Deparse,它表示一切正常:

$ perl -MO=Deparse -e 'use strict; 
                       use warnings; 
                       my $str1="foobar"; 
                       my $str2="bar"; 
                       $str1 =~ $str2; 
                       $str1 =~ "bar";'
use warnings;
use strict;
my $str1 = 'foobar';
my $str2 = 'bar';
$str1 =~ /$str2/;
$str1 =~ /bar/;
-e syntax OK
Run Code Online (Sandbox Code Playgroud)

我查看了文档,但根据我的理解,情况如下:

  • 一般语法是m/pattern/.
  • 无论是使用m和您所选择的,而不是分隔符/(但要知道,'?有特殊意义)
  • 或者离开,m必须是分隔符/.

但显然Perl理解$str1 =~ "foo"$str1 =~ m/foo/尽管没有m.这是为什么?我希望这是一个语法错误.

ike*_*ami 5

我希望这是一个语法错误.

引用的文档=~perlop中,

如果右参数是表达式而不是搜索模式,替换或音译,则在运行时将其解释为搜索模式.


但显然Perl理解$str1 =~ "foo"$str1 =~ m/foo/尽管没有m.这是为什么?

为什么不?=~如果在其RHS上没有匹配,替换或音译操作符,我想不出有什么理由不暗示匹配运算符.我用了

$s =~ /foo/
Run Code Online (Sandbox Code Playgroud)

过度

$s =~ "foo"
Run Code Online (Sandbox Code Playgroud)

但我用过

$s =~ $re
Run Code Online (Sandbox Code Playgroud)

特别是当值$re是由编译的模式时qr//.