如果我有:
$foo= "12."bar bar bar"|three";
我将如何在文本 12. 之后在变量中插入文本“..”?
Perl 允许您选择自己的引号分隔符。如果您发现需要在插值字符串 (ie ) 内使用双引号""
或在非插值字符串 (ie ''
) 内使用单引号,您可以使用引号运算符指定不同的字符作为字符串的分隔符. 分隔符有两种形式:带括号的和不带括号的。括号定界符有不同的开始和结束字符:[]
, {}
, ()
, []
, 和<>
. 所有其他字符*
都可用作不带括号的分隔符。
所以你的例子可以写成
$foo = qq(12."bar bar bar"|three);
在“12”之后插入文本。可以通过多种方式完成(TIMTOWDI)。一种常见的解决方案是使用替换来匹配要替换的文本。
$foo =~ s/^(12[.])/$1../;
^ 表示匹配字符串的开头,()
表示将此文本捕获到变量$1
中,12
仅匹配字符串"12"
,[]
表示匹配括号内的任何一个字符。使用括号是因为.
通常在正则表达式中具有特殊含义,但在字符类([]
)中没有。字符类的另一种选择是逃避.
with的特殊含义\
,但很多人发现它比字符类更丑陋。
$foo =~ s/^(12\.)/$1../;
将文本插入字符串的另一种方法是将值分配给对substr
. 这突出了 Perl 相当独特的特性之一:它的许多函数都可以作为左值。也就是说,它们可以被视为变量。
substr($foo, 3, 0) = "..";
如果您还不知道"12."
字符串中存在的位置,您可以使用index
它来查找它的开始位置,length
以找出“12”的长度。是,然后将该信息与substr
.
这是一个包含上述代码的全功能 Perl 脚本。
#!/usr/bin/perl
use strict;
use warnings;
my $foo = my $bar = qq(12."bar bar bar"|three);
$foo =~ s/(12[.])/$1../;
my $i = index($bar, "12.") + length "12.";
substr($bar, $i, 0) = "..";
print "foo is $foo\nbar is $bar\n";
*
除空白字符(空格、制表符、回车符、换行符、垂直制表符和换页符)之外的所有字符
如果你想在 Perl 的字符串中使用双引号,你有两个主要选择:
$foo = "12.\"bar bar bar\"|three";
或者:
$foo = '12."bar bar bar"|three';
第一个选项使用反斜杠转义字符串内的引号。
第二个选项使用单引号。这意味着双引号被视为字符串的一部分。但是,在单引号中,所有内容都是文字,因此$var
或@array
不被视为变量。例如:
$myvar = 123;
$mystring = '"$myvar"';
print $mystring;
> "$myvar"
但:
$myvar = 123;
$mystring = "\"$myvar\"";
print $mystring;
> "123"
您还可以使用大量其他类似引用的运算符。
$foo = "12.\"bar bar bar\"|three";
$foo =~s/12\./12\.\.\./;
print $foo; # results in 12...\"bar bar bar\"|three"