我是一个Perl的初学者,我有一个关于模式匹配的问题。 我在Perl中遇到了一行代码,其中写着:
$variable =~ s-/\Z--;
随着代码的进行,另一个变量被分配了
$variable1 =~ s-/--;
请问这两行代码的作用是什么?我想知道s-/\Z--
和s-/--
分别代表什么意思。
$variable =~ s-/\Z--;
-
在这里被用作分隔符。然而,最佳实践建议您使用/
或{}
作为分隔符。
可以这样重写:
$variable =~ s{/\Z}{}; # remove a / at the end of a string
请考虑:
$variable1 =~ s-/--;
再次,它可以被重新写为:
$variable1 =~ s{/}{}; # remove the first /
s///
运算符是一种替换操作,使用一种称为正则表达式的特殊模式对字符串执行搜索和替换。您可以在随Perl一起提供的man页面中阅读有关正则表达式和Perl模式匹配的更多信息:
如果您的系统上没有这些内容,请尝试在Google上搜索相同的内容。=~
运算符对变量应用替换。所以以下代码将在变量$var
中替换所有的'foo'为'bar'。$var =~ s/foo/bar/;
$var =~ s-foo-bar-;
在您的情况下,破折号似乎没有为代码增加任何清晰度,因此最好更新为使用常规斜杠。
s///
函数是perl中的搜索和替换功能,可以使用不同的分隔符,这就是本例中所做的。他们用减号-
替换了/
。
s-/--
从字符串中删除第一个/
。
s-/\Z--
匹配并删除行末的斜杠。我认为更好的写法是:s{/$}{}
。$variable1 =~ s-/--;
可以写成
$variable =~ s{/}{}xms;
或者这样
$variable =~ s/ \/ //xms;
它的意思是删除字符串中第一个/
。
关于s-/\Z--
,通常会这样写
$variable =~ s{/ \Z}{}xms;
或者这样
$variable =~ s/ \/ \Z //xms;
它的意思是如果/
在字符串末尾(\Z
),则删除它。
s-/\Z--
的更好版本(也许)。标准分隔符是正斜杠。这里有一个相同替换的版本,但使用标准斜杠分隔符:s/\/\Z//
。这样做的优点是其他读者更容易将其视为替换。缺点是那些丑陋的斜杠和反斜杠使它看起来像一只醉鸡在代码上走过。记住Perl的座右铭:总有多种方法可以做到。在这种情况下,除了正斜杠作为分隔符之外,还有很多其他选项。 - David Hammen