regex - 为什么 `$str1 =~ "foo "` recognized as ` $str1 =~ m/foo/`(而不是语法错误)?

标签 regex perl

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

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

另一个片段是
if ( $str1 =~ "foo" ) {
    print "string equals 'foo'\n";
}

当然,它应该简单地读为 $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

我翻阅了docs ,但据我了解
情况如下:
  • 一般语法是 m/pattern/ .
  • 要么使用 m和您选择的分隔符而不是 / (但请注意 '? 具有特殊含义)
  • 离开 m但是分隔符必须是 / .

  • 但显然 Perl 理解 $str1 =~ "foo"$str1 =~ m/foo/虽然没有 m存在。这是为什么?我原以为这是一个语法错误。

    最佳答案

    I'd expected that to be a syntax error.



    引用 =~ 的文档在 perlop ,

    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.



    But apparently Perl understands $str1 =~ "foo" as $str1 =~ m/foo/ although no m is present. Why is that?



    为什么不?我想不出不拥有的理由 =~如果其 RHS 上没有匹配、替换或音译运算符,则暗示匹配运算符。我会用
    $s =~ /foo/
    

    超过
    $s =~ "foo"
    

    但我用过
    $s =~ $re
    

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

    关于regex - 为什么 `$str1 =~ "foo "` recognized as ` $str1 =~ m/foo/`(而不是语法错误)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39498206/

    相关文章:

    regex - sizzle 选择器可以评估正则表达式吗?

    perl - log4perl:分组消息

    multithreading - 尝试处理 100 个 URL 请求。我应该使用 perl CPAN HTTP::Async 吗?魔力?

    perl - 如何在Nginx上使用FastCGI运行Perl脚本?

    perl - 如何确定数组中是否存在元素(perl)

    javascript - 如何防止在输入字段中输入无效字符

    php - 如何在php中替换两个字符串之间的特定字符串

    perl - 如何获取草莓perl中最后执行的命令的值

    Ruby 正则表达式选择没有 [

    Python 正则表达式 - 匹配仅包含 A、B 或 C 的单词