2011-07-20 4 views
1

私は次のように印刷され配列から読み取ったときに#のエスケープが消えるのはなぜですか?

$element=~s/#/\\#/g; 

、私が使用して#をエスケープ文字列、

my $element="abc#$def" 

を持っています。完璧である、abc\#$def

push(@arr,$element); 
foreach $val (@arr) 
{ 
print $val; 
} 

そしてforeachループ内に印刷される値である:コードの

次の部分であるabc#$def

ここで#がエスケープされないのはなぜですか?そして、どうやってエスケープすることができますか?あなたが期待するよう

このコードは、私のマシン上で動作\

編集をエスケープする必要が

$element=~s/#/\\#/g; 

:このようなもので

答えて

2

あなたは終わらない私たちにすべてを示すe。主張された結果を得るために、変数$defを以下のように初期化する必要がありました。しかし、私がそれをすると、あなたが期待した結果が得られます。結果は表示されません。

$ cat xx.pl 
use strict; 
use warnings; 

my $def = '$def'; 
my $element = "abc#$def"; 

$element =~ s/#/\\#/g; 

print "$element\n"; 

my @arr; 

push(@arr, $element); 
foreach my $val (@arr) 
{ 
    print $val; 
    print "\n"; 
} 

$ perl xx.pl 
abc\#$def 
abc\#$def 
$ 

あなたが更新することができ、これは、MacOS Xの10.6.8にはPerl 5.14.1でテストされましたが、私は行動が、この与えられたのPerl 5の他のバージョン

によって変わるとは思いませんあなたの質問に似たようなスクリプトを表示する(特に、use strict;use warnings;)が表示されますが、どのような結果が得られますか?

+0

おかげでジョナサンの他の部分からあなたに副作用を与えているwarnings' '使用strict'と'使用の欠如を考えて、私はそれが理由だった場合には、不思議を「厳格な使用」見逃していました。必要に応じて作業する。 :) – Mini

0

use strict; 
use warnings; 
use Data::Dumper; 

my $element='abc#$def'; 
my @arr; 
$element=~s/#/\\#/g; 

print $element."\n"; 

push(@arr,$element); 
foreach my $val (@arr) 
{ 
print $val; 
} 
+0

あなたは$ element =〜s /#/ \\\#/ gを意味します。右?これでも同じ動作を示します。 – Mini

+0

うーん...いいえ、私はあなたの置き換え表現 –

+0

[OK]を...それはエスケープ取得しないで、単一の '' \\文字を持っていたように、最初はそれが見えたので、また、あなたのコード内で正確に何を意味しました。しかし、私が説明したように、配列から読み込んだときの動作は変わります。 – Mini

関連する問題