Re: [問題] hash key的逗號
※ 引述《abliou (把青春freeze)》之銘言:
: 原本的目標是想做hash sliding..
: 但做key的時候想到一個問題..如果在key中有包含逗號會怎麼處理?
: ========
: use 5.010 ;
: $a{te,we}="gg" ;
: $a{te}="Wert";
: $a{we}="ah" ;
: say for keys%a ;
: ==輸出==
: tewe
: te
: we
: ========
: 原本以為在key中有逗號perl會自動處理掉...但..
: ========
: use 5.010 ;
: $a{te,we}="gg" ;
: $a{te}="Wert";
: $a{we}="ah" ;
: say for @a{'tewe',we,te} ;
: ==輸出==
: ah
: Wert
: ========
: 所以直接用去除逗號的字串當key..還是無法對應到原本的值...所以我又試了加上逗號
: ========
: use 5.010 ;
: $a{te,we}="gg" ;
: $a{te}="Wert";
: $a{we}="ah" ;
: say for @a{'te,we',we,te} ;
: ==輸出==
: ah
: Wert
: ========
: 所以到這邊我就困擾了...究竟perl在處理key中有逗號的字串是怎樣的?
: 而我用在hash sliding又該如何使用?
請參考 http://perldoc.perl.org/perlvar.html 中關於
$; 這個變數的介紹 ($SUBSCRIPT_SEPARATOR)
簡單來說
$a{te,we}="gg";
會被 Perl 解釋為
$a{join($;,'te','we')}="gg";
也就是說這個 $a{te,tw} 的 key (te,tw) 是用來模擬多維的陣列
它的值其實是 join($;, 'te', 'we')
跟陣列沒有任何關係
$; 的預設值為 "\034"
所以當你執行 say for keys %a; 其輸出結果其實是
te\034we
te
we
但是因為 \034 事實上是一 control code
所沒有顯示在 terminal 上
(你如果將輸出結果 redirect 到檔案就可以看到該字元)
如果將程式改為
say for @a{join($;, 'te', 'we'), 'te', 'we'};
即可得到預期的輸出結果:
gg
Wert
ah
所以如果你使用的 key 有包含 $; 這個字元的話就要特別注意
以免產生非預期的結果
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.109.73.151
推
09/04 15:06, , 1F
09/04 15:06, 1F
討論串 (同標題文章)
Perl 近期熱門文章
PTT數位生活區 即時熱門文章