在Perl中,s-/--和s-/\Z--是什么意思?

3

我是一个Perl的初学者,我有一个关于模式匹配的问题。 我在Perl中遇到了一行代码,其中写着:

  $variable =~ s-/\Z--;

随着代码的进行,另一个变量被分配了

  $variable1 =~ s-/--;

请问这两行代码的作用是什么?我想知道s-/\Z--s-/--分别代表什么意思。


以下几个答案展示了s-/\Z--的更好版本(也许)。标准分隔符是正斜杠。这里有一个相同替换的版本,但使用标准斜杠分隔符:s/\/\Z//。这样做的优点是其他读者更容易将其视为替换。缺点是那些丑陋的斜杠和反斜杠使它看起来像一只醉鸡在代码上走过。记住Perl的座右铭:总有多种方法可以做到。在这种情况下,除了正斜杠作为分隔符之外,还有很多其他选项。 - David Hammen
4个回答

7
$variable =~ s-/\Z--;

- 在这里被用作分隔符。然而,最佳实践建议您使用/{}作为分隔符。

可以这样重写:

$variable =~ s{/\Z}{};  # remove a / at the end of a string

请考虑:

$variable1 =~ s-/--;

再次,它可以被重新写为:

$variable1 =~ s{/}{};  # remove the first /

6
在Perl中,s/// 运算符是一种替换操作,使用一种称为正则表达式的特殊模式对字符串执行搜索和替换。您可以在随Perl一起提供的man页面中阅读有关正则表达式和Perl模式匹配的更多信息: 如果您的系统上没有这些内容,请尝试在Google上搜索相同的内容。
使用=~运算符对变量应用替换。所以以下代码将在变量$var中替换所有的'foo'为'bar'。
$var =~ s/foo/bar/;

所有Perl运算符都在“perlop”手册页面上有文档记录。
尽管最常见的分隔符是斜杠(因此s///),但您也可以使用任何其他标点符号作为分隔符。因此,在这种情况下,作者决定使用破折号(-)作为分隔符。
以下是使用破折号作为分隔符的相同代码行:
$var =~ s-foo-bar-;

在您的情况下,破折号似乎没有为代码增加任何清晰度,因此最好更新为使用常规斜杠。


1
你也可以使用任何其他标点符号作为分隔符 - 实际上,你几乎可以使用任何字符作为定界符 :-) - Dave Cross

2
s///函数是perl中的搜索和替换功能,可以使用不同的分隔符,这就是本例中所做的。他们用减号-替换了/s-/--从字符串中删除第一个/s-/\Z--匹配并删除行末的斜杠。我认为更好的写法是:s{/$}{}

0
  1. $variable1 =~ s-/--;可以写成

    $variable =~ s{/}{}xms;
    

    或者这样

    $variable =~ s/ \/ //xms;
    

    它的意思是删除字符串中第一个/

  2. 关于s-/\Z--,通常会这样写

    $variable =~ s{/ \Z}{}xms;
    

    或者这样

    $variable =~ s/ \/ \Z //xms;
    

    它的意思是如果/在字符串末尾(\Z),则删除它。


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