2011-07-20 22 views
1

我有一個字符串,爲什麼從數組中讀取#時會消失?

my $element="abc#$def" 

我逃使用#,

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

打印出來的:abc\#$def,這是完美的。代碼的

接着的部分是:

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

而foreach循環內打印的值是:abc#$def

爲什麼#不能在這裏逃脫?我該如何保留逃跑?

回答

2

你沒有放棄向我們展示了一切。要獲得您的聲明結果,我必須創建如下所示初始化的變量$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 
$ 

這是用Perl 5.14.1在MacOS X 10.6.8測試過,但我不認爲行爲將與任何其他版本的Perl 5

鑑於這種變化,可以更新你的問題顯示一個類似於我的腳本(特別是use strict;use warnings;),但是會產生你顯示的結果?

+0

謝謝Jonathan,我錯過了「嚴格使用」,不知道這是否是原因。按需要工作。 :) – Mini

0

像這樣的東西:

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

你必須逃離\

編輯

此代碼的工作在我的機器上,你希望:

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

好吧..它確實得到了逃脫。但是,正如我已經解釋的那樣,從數組讀取行爲時會發生變化。 – Mini

相關問題