Perlの文字列にテキストを挿入するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/647685

  •  22-07-2019
  •  | 
  •  

質問

持っていた場合:

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

テキストに挿入する方法<!> quot; .. <!> quot;変数のテキスト12.の後?

役に立ちましたか?

解決

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

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

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

<!> quot; 12。<!> quot;の後にテキストを挿入します。多くの方法で行うことができます( TIMTOWDI )。一般的な解決策は、置換を使用してテキストを一致させることです置き換えたい。

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

^は文字列の先頭で一致することを意味し、12はこのテキストを変数"12"にキャプチャすることを意味します。.は文字列\に一致し、substrはいずれかに一致することを意味します括弧内の文字の。 "12."は一般的な正規表現では特別な意味を持ちますが、文字クラス(index)内ではないため、括弧が使用されています。文字クラスのもう1つのオプションは、lengthの特別な意味を<=>でエスケープすることですが、多くの人は文字クラスよりもいことに気づきます。

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

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

substr($foo, 3, 0) = "..";

<=>が文字列のどこに存在するかまだわからない場合は、 <=>を使用できます。 で開始位置を確認し、 <=> で期間を確認します< !> quot; 12。<!> quot;であり、その情報を<=>で使用します。

これは、上記のコードを含む完全に機能する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の文字列で二重引用符を使用する場合、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"

他にも多数の引用のような演算子代わりに使用できます。


$foo = "12.\"bar bar bar\"|three";
$foo =~s/12\./12\.\.\./;
print $foo; # results in 12...\"bar bar bar\"|three"
scroll top