【问题标题】:What does this Perl statement mean?这个 Perl 语句是什么意思?
【发布时间】:2017-04-03 19:24:59
【问题描述】:

我正在尝试将 Perl 脚本解析为 Python。我几乎没有使用 Perl 的经验,但它仍然非常顺利。 Perl 文档庞大而令人印象深刻。但是,有时我真的无法弄清楚一些非常神秘的语法,并且我无法与脚本的作者交流。下面的内容让我头疼了好久:

sub someSubroutine
{
    my ($var1, $var2, $var3) = @_;

    # some Perl code

    $var2 =~ s|/|\\|g;

    # and then some more code ..
}

我真的不明白这一特别而孤独的台词

$dst =~ s|/|\\|g;

我很清楚它在$var2 中使用一些二进制或运算进行搜索/字符串匹配,但结果未存储。

不知道是不是有什么不那么明显的副作用,比如自动存入$_

根据我的阅读,默认变量是在调用子例程、启动循环或类似情况时自动设置的,但在使用运算符时则没有。

非常感谢任何帮助或指向适当文档的指针。

【问题讨论】:

    标签: perl operators


    【解决方案1】:

    $var2 =~ s|/|\\|g;
    

    s/pattern/replacement/substitution operator

    在字符串中搜索模式,如果找到,则替换该模式 带有替换文本并返回替换的数量 制成。否则返回 false(特别是空字符串)。

    | 不是“二进制或”——它是一个分隔符。在s 中,您可以使用任何分隔符,尤其是为了便于阅读。

    来自perlopRegexp Quote-Like Operators

    任何非空白分隔符都可以替换斜杠。后面加空格 使用标识符中允许的字符时的 s。如果单引号 被使用,没有对替换字符串进行解释(/e 但是,修饰符会覆盖它)。请注意,Perl 将反引号视为 普通分隔符;替换文本不会作为命令进行评估。 如果 PATTERN 由括号括起来的引号分隔,则 REPLACEMENT 具有 它自己的一对引号,可能是也可能不是括号引号,用于 例如,s(foo)(bar) 或 s/bar/。

    以上内容将$var2 中的每个/ 替换为\。 (\ 是转义字符,所以需要使用\\)。

    my $v='/a/b/c';
    $v =~ s|/|\\|g;
    print "$v\n";
    # \a\b\c
    

    还有,

    如果没有通过 =~ 或 !~ 运算符指定字符串,则 $_ 变量 被搜索和修改。

    $_ = $v;     # assign the $_
    s{\\}{/}g;   # substitution on the $_ using bracketed delimiters
    print;       # without args prints the $_
    # /a/b/c
    

    【讨论】:

    • 谢谢。考虑一下我花在阅读 Perl 文档上的所有时间,这让我无法弄清楚自己非常尴尬。考虑到 Help Center > Asking 文章,我现在有点不确定是否应该删除这个问题,毕竟这只是简单的语法。
    • @Magnus,无需删除。
    猜你喜欢
    • 1970-01-01
    • 2012-01-05
    • 2021-12-25
    • 2014-03-30
    • 1970-01-01
    • 2022-01-12
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多