Perl语法(替换'defined(@array')

时间:2019-02-26 15:23:44

标签: perl

让我开始说我很久没用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不够熟悉,无法确定正确的方法使它工作的方法是。希望这对于某人来说是微不足道的。

3 个答案:

答案 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。