perl – 无论如何,都会认为字符串重载变量已定义
我的脚本中有以下几行:
my $spec = shift; if (!defined $spec) { return ("Invalid specification",undef); } $spec = "$spec" // ''; 我自然希望这会在传递undef时返回数组中的警告Invalid specification,第二项是undef.相反,检查通过,我得到一个控制台消息警告我在下一行使用未初始化的值$spec in string. $spec是一个带字符串和数字重载的对象,不幸的是这样编写,试图在这个特定的子例程中测试真实性(例如if($spec))会导致深度递归和段错误. 虽然我感兴趣的是,为什么,确切地说,这种情况正在发生,但我更感兴趣的是如何让它停止发生.我想消除控制台警告,最好没有警告qw / uninitialized /.这是可能的,如果是的话,我该怎么做? 解决方法
你说$spec是一个
string overloading的对象.
如果是这种情况,那么在检查它是否被定义之前,您需要将其强制转换为String形式: if (! defined overload::StrVal($spec)) { 每月更正 正如在StrVal中指出的那样,没有强制重载的字符串化:
因此,要实现这一点,请尝试他的另一个建议:
以下演示了这种方法: #!/usr/bin/env perl use strict; use warnings; use Test::More tests => 2; my $obj_str_defined = StringOverloaded->new("has value"); my $obj_str_undef = StringOverloaded->new(undef); ok( is_overloaded_string_defined($obj_str_defined),qq{$obj_str_defined is defined} ); ok( !is_overloaded_string_defined($obj_str_undef),qq{$obj_str_undef is undef} ); sub is_overloaded_string_defined { my $obj = shift; my $is_str_defined = 1; local $SIG{__WARN__} = sub { $is_str_defined = 0 if $_[0] =~ /Use of uninitialized value $obj in string/; }; my $throwaway_var = "$obj"; return $is_str_defined; } { # Object with string overloading package StringOverloaded; use strict; use warnings; use overload ( '""' => sub { my $self = shift; return $$self; # Dereference },fallback => 1 ); sub new { my $pkg = shift; my $val = shift; my $self = bless $val,$pkg; return $self; } } 输出: 1..2 ok 1 - $obj_str_defined is defined ok 2 - $obj_str_undef is undef (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |