我最近看到了一个不熟悉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.这是为什么?我希望这是一个语法错误.
我希望这是一个语法错误.
引用的文档=~中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//.