这个 Perl 语句是什么意思?

3

我正在尝试将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中进行了一些二进制OR操作的搜索/字符串匹配,但结果没有被存储。
我想知道它是否有任何不太明显的副作用,例如它会自动存储在$_中吗?
从我所读到的内容来看,当调用子例程、启动循环或类似操作时,默认变量会自动设置,但对于使用运算符时没有任何说明。
我真的很感激任何帮助或适当文档的指针。
1个回答

8

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

s/pattern/replacement/替换操作符

查找字符串中的模式,如果找到,则用替换文本替换该模式并返回所做的替换次数。否则返回false(具体来说,是空字符串)。

| 不是“二进制或” - 它是一个分隔符。在 s 中,您可以使用任何分隔符,特别是为了更容易阅读。

来自 perlop 正则表达式引用操作符

任何非空白分隔符都可以替换斜杠。在使用标识符中允许的字符时,在 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文档,我无法自己解决这个问题感到非常尴尬。鉴于“帮助中心>提问”文章的内容,我现在有点不确定是否应该删除这个问题,毕竟它只是关于琐碎语法的问题。谢谢。 - Wololo
2
@Magnus,不需要删除。 - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接