2

有人写了类似下面的代码:

#! /usr/bin/perl
my $myVar = 'somecomplicatedString'; 
my $someString = 'mySystemvariable=SOMESTR';
if ( $someString =~ /SOMESTR/ ) {
        $someSting =~ s{SOMESTR}{$myVar}
}
# $someString now equals 'mySystemvariable=somecomplicatedString'

s///运营商和运营商有什么区别s{}{}

4

2 回答 2

7

您可以在 Perl 匹配运算符 -m//或替换运算符 -中使用任何一组分隔符s///

其他示例:

s#oldTest#newTest#
s/oldTest/newTest/
s!oldTest!newTest!
s~oldTest~newTest~
s{oldTest}{newTest}   # Here we use appropriate opening and closing braces.

m/someText/
m!someText!
/someText/   # You can omit the `m` when `/` is delimiter
!someText!   # This is Wrong. You can't omit `m` in other delimiter.

您看到的使用不同分隔符的主要优点是,您可以通过使用不同的字符作为分隔符来避免在文本中转义分隔符。因此,使用#作为分隔符,您不需要/在字符串中转义。

来自perlop 文档

m//运营商部分:

如果"/"是分隔符,则首字母m是可选的。使用 ,m您可以使用任何一对非空白 (ASCII) 字符作为分隔符。这对于匹配包含"/", 以避免 LTS(倾斜牙签综合症)的路径名特别有用。如果"?" 是分隔符,则应用只匹配一次的规则,m?PATTERN?如下所述。

s///运营商部分:

任何非空白分隔符都可以替换斜杠。使用标识符中允许的字符时,在 s 后添加空格。

于 2013-08-21T10:16:02.657 回答
5

它是相同的运算符,但使用不同的分隔符可用于实现更好的可读性。 {}使用/e修饰符时很方便,

$string =~ s{(\d)}{
  # ...
  $1 + 1;
}e;
于 2013-08-21T10:16:40.477 回答