【发布时间】:2015-07-22 15:34:09
【问题描述】:
使用 Perl v5.14.2(由 Debian Wheezy 提供)此代码:
use Encode qw(encode);
no warnings "all";
sub test_encode {
return Encode::encode("utf8", $_[0]);
}
my $a=undef;
my $r=test_encode(substr($a,0,1));
在$r 中生成一个空字符串。我没问题。
使用 Perl 5.18.2 (Ubuntu 14.04),它似乎会产生以下输出:
在@_ 中的列表赋值中使用未初始化的值 /usr/lib/perl/5.18/Encode.pm 第 147 行。
(即使在主范围内禁用了警告,所以显然这不是警告。编辑:根据答案,这绝对是警告):
该列表分配将是,Encode.pm:
146 sub encode($$;$) {
147 my ( $name, $string, $check ) = @_;
148 return undef unless defined $string;
149 $string .= ''; # stringify;
调整代码,如果 undef 被传递给 encode 而不是 $_[0],它不再抱怨。如果传递了临时变量中$_[0] 的副本而不是$_[0],它也不会抱怨。
我的问题是:这些版本之间的 Perl 会发生什么变化来解释新的行为? Perl 在 Encode.pm 第 147 行的 @_ 中究竟看到了什么?
附录:在test_encode的开头从Devel::Peek添加Dump($_[0]);,它输出:
Perl 5.14.2:
SV = PVLV(0x23a2c10) 在 0x2340998 REFCNT = 1 旗帜 = (GMG,SMG) IV = 0 净值 = 0 PV = 0 魔法 = 0x235f950 MG_VIRTUAL = &PL_vtbl_substr MG_TYPE = PERL_MAGIC_substr(x) 类型 = x 关门 = 0 塔格伦 = 0 TARG = 0x235e370 SV = PV(0x233ec20) 在 0x235e370 REFCNT = 2 标志 = (PADMY,POK,pPOK) PV = 0x23576b0 ""\0 CUR = 0 LEN = 16Perl 5.18.2:
SV = PVLV(0x25c07c0) 在 0x2546cb8 REFCNT = 1 旗帜 = (GMG,SMG) IV = 0 净值 = 0 PV = 0 魔法 = 0x2567dd0 MG_VIRTUAL = &PL_vtbl_substr MG_TYPE = PERL_MAGIC_substr(x) 类型 = x 关门 = 0 塔格伦 = 1 TARG = 0x256f328 标志 = 0 SV = NULL(0x0) 在 0x256f328 REFCNT = 2 旗帜 = (PADMY)不知道该怎么想,但末尾的 SV 部分有很大不同,看起来像空字符串与 NULL(0x0)。
【问题讨论】:
-
@toolic: 但 5.14 (wheezy) 中的 Encode.pm 中同样包含
use warnings;
标签: perl