2011-11-24 65 views
1

與/ A序列我有一個序列,看起來像這樣:拆分在Perl

my $seq = "D\IKLR\LK/Q"; 

我想要做的就是打破序列成單個的字母。

所以我希望得到:

my $var = ['D', '\', 'I', 'K', 'L', 'R', '\', 'L', 'K','/' ,'Q']; 

但爲什麼這一點兒也不做:

my @chars = split(//,$seq); 
print Dumper \@chars; 

它給了這個:

my $var = ['D', '\\', 'I', 'K', 'L', 'R', '\\', 'L', 'K', 'Q']; 

什麼是正確的方式去做吧?

+1

如果在賦值'$ seq'時使用雙引號,perl會認爲'\ I'和'\ L'是轉義符,並將它們視爲單個字符。既然你沒有發生,我認爲這些數據來自一個文件句柄。還有,你是否從你的數據轉儲中排除了'/'? – TLP

+1

如果你寫'my $ seq =「D \ IKLR \ LK/Q」;'那麼'$ seq'將*不包含反斜槓字符。解釋雙引號字符串中的反斜槓。 「\ I」沒有明確的含義,但它似乎只是簡單的「I」字母。你爲'$ seq'顯示的字符串有一個反斜槓和一個正斜槓,但你的'@ chars'數組有兩個反斜槓。我不認爲你向我們展示了你的實際代碼。 –

回答

6

你所得到的正是你想要的。

代表單個\'\\',而不是'\'您預期的那樣,因爲在'\'\轉義第二'使字符串不完整,但Data::Dumper返回值總是可以eval版,因爲它是Perl代碼的方式。

但通過循環打印數組的各個元素將打印\

+3

值得澄清的是'Data :: Dumper'將數據結構打印爲Perl代碼,可以''eval'ed來反序列化結構。如果您直接在'@ chars'中打印值,則會看到您期望的單個'\'。 (Heheh--我必須輸入'\\\''才能顯示出來,然後我必須鍵入'\\\\\''來獲得* that *以顯示...) – friedo

+0

@friedo : 謝啦。沒有這個觀點,答案就會不完整。 – codaddict

+0

friedo,使用雙反引號來逃避,比傾斜牙籤更容易,參見[Markdown語法](http://daringfireball.net/projects/markdown/syntax#code)。這與多個角度類似於POD分隔符:'C << method->調用>>'。 – daxim