5

如果我有:

$foo= "12."bar bar bar"|three";

我将如何在文本 12. 之后在变量中插入文本“..”?

4

3 回答 3

20

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";

*除空白字符(空格、制表符、回车符、换行符、垂直制表符和换页符)之外的所有字符

于 2009-03-15T13:40:18.597 回答
0

如果你想在 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"

您还可以使用大量其他类似引用的运算符

于 2009-03-15T12:06:29.117 回答
0

$foo = "12.\"bar bar bar\"|three";
$foo =~s/12\./12\.\.\./;
print $foo; # results in 12...\"bar bar bar\"|three"
于 2009-03-15T12:18:15.487 回答