让我开始说我很久没用Perl编程了。
当前试图使一些旧的代码能够工作,这些代码依赖于带有数组的defined
。
代码(节略):
# defined outside the file-reading block
my %refPRE;
# line from a file
@c = split();
if (defined @{$refPRE{$c[0]}})
{
# do stuff
}
现在由于以下错误,它不会像这样运行:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?)
很好,但是如果我删除了defined
,则会出现以下错误:
Can't use an undefined value as an ARRAY reference
。
我可以看到它正在尝试做的事情(如果$c[0]
在$refPRE
中,然后执行此操作,否则执行其他操作),但是我对Perl不够熟悉,无法确定正确的方法使它工作的方法是。希望这对于某人来说是微不足道的。
答案 0 :(得分:2)
显然,这里是我需要的所有催化剂...
将if (defined @{$refPRE{$c[0]}})
切换为if ($refPRE{$c[0]})
就足够了!希望这对搜索此(特定)问题的其他人有所帮助...
答案 1 :(得分:2)
不能使用未定义的值作为ARRAY引用。
这就是说$refPRE{ $c[0] }
返回undef
,并且您不能取消引用undef
作为数组。
@{ undef } # will error
您根本不需要取消引用。如果返回undef
,则为 false 。如果返回任何其他内容,则(可能)为 true 。
if ( $refPRE{$c[0]} )
{
my $foo = @{ $refPRE{$c[0]} };
# do stuff
}
答案 2 :(得分:2)
看着第二个错误$refPRE{$c[0]}
可能是不确定的,因此@{ ... }
失败了。您可以像这样使用 undef或运算符//
来解决此问题。
if (@{ $refPRE{$c[0]} // [] }) { ... }
这将检查是否定义了$refPRE{$c[0]}
,如果没有,则返回一个空的匿名数组。在if
语句中,空数组为false。