作者frank1983 (What?)
看板Perl
标题Re: [问题] hash key的逗号
时间Fri Sep 4 13:04:31 2009
※ 引述《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
1F:推 abliou:感恩感恩! 09/04 15:06