5

もしわたしが持っていたら:

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

変数のテキスト 12. の後にテキスト ".." を挿入するにはどうすればよいですか?

4

3 に答える 3

20

Perl では、独自の引用区切り文字を選択できます。補間文字列内で二重引用符 (つまり"") または非補間文字列内で単一引用符 (つまり'') を使用する必要がある場合は、引用演算子を使用して、文字列の区切り文字として機能する別の文字を指定できます。 . 区切り文字には、括弧付きと括弧なしの 2 つの形式があります。角かっこで区切られた区切り文字は、開始文字と終了文字が異なります: []、、、、および. 他のすべての文字は、括弧なしの区切り文字として使用できます。{}()[]<>*

したがって、あなたの例は次のように書くことができます

$foo = qq(12."bar bar bar"|three);

「12」の後にテキストを挿入します。多くの方法で実行できます ( TIMTOWDI )。一般的な解決策は、置き換えたいテキストに一致するように置換を使用することです。

$foo =~ s/^(12[.])/$1../;

^ は文字列の最初に一致することを意味し、()はこのテキストを変数にキャプチャすることを意味し、 は string に一致するだけ$1であり、平均は括弧内の文字のいずれかに一致することを意味します。角かっこが使用されているのは、通常、正規表現では特別な意味を持ちますが、文字クラス ( ) 内では意味がないためです。文字クラスのもう 1 つのオプションは、withの特別な意味をエスケープすることですが、多くの人はそれが文字クラスよりも醜いと感じています。12"12"[].[].\

$foo =~ s/^(12\.)/$1../;

テキストを文字列に挿入するもう 1 つの方法は、値を の呼び出しに代入することsubstrです。これは、Perl の非常にユニークな機能の 1 つを強調しています。その関数の多くは左辺値として機能します。つまり、変数のように扱うことができます。

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 で文字列に二重引用符を使用する場合、主なオプションが 2 つあります。

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

また:

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

最初のオプションは、文字列内の引用符をバックスラッシュでエスケープします。

2 番目のオプションでは、一重引用符を使用します。これは、二重引用符が文字列の一部として扱われることを意味します。ただし、一重引用符ではすべてがリテラルであるため、変数として扱われない$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 に答える