s {SOMESTR} {$ myvar}在perl中的含义是什么?

时间:2013-08-21 10:12:58

标签: regex perl

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

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

s///运算符和s{}{}运算符之间有什么区别?

2 个答案:

答案 0 :(得分: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 doc

m//运营商部分:

  

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

s///运营商部分:

  

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

答案 1 :(得分:5)

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

时,/e非常方便
$string =~ s{(\d)}{
  # ...
  $1 + 1;
}e;