有人写了类似下面的代码:
#! /usr/bin/perl
my $myVar = 'somecomplicatedString';
my $someString = 'mySystemvariable=SOMESTR';
if ( $someString =~ /SOMESTR/ ) {
$someSting =~ s{SOMESTR}{$myVar}
}
# $someString now equals 'mySystemvariable=somecomplicatedString'
Run Code Online (Sandbox Code Playgroud)
s///操作员和s{}{}操作员之间有什么区别?
您可以在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.
Run Code Online (Sandbox Code Playgroud)
使用不同分隔符看到的主要优点是,通过使用不同的字符作为分隔符,可以避免在文本中转义分隔符.因此,使用#as分隔符,您不需要/在字符串中转义.
来自perlop doc:
在m//运营商部分:
如果
"/"是分隔符,则初始m是可选的.有了m你可以使用任何对非空格(ASCII)字符作为分隔符的.这对于匹配包含的路径名称特别有用"/",以避免LTS(倾斜牙签综合征).如果"?"是分隔符,则应用仅匹配一次规则,m?PATTERN?如下所述.
在s///运营商部分:
任何非空白分隔符都可以替换斜杠.使用标识符中允许的字符后,在s后添加空格.
它是相同的运算符,但使用不同的分隔符,可用于实现更好的可读性.
{}使用/e修饰符时很方便
$string =~ s{(\d)}{
# ...
$1 + 1;
}e;
Run Code Online (Sandbox Code Playgroud)