Re: [問題] hash key的逗號

看板Perl作者 (What?)時間16年前 (2009/09/04 13:04), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #1Ae9_We- (Perl)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1Ae9_We- (Perl)