Perl可以检测数组吗?

San*_*ing 18 arrays perl

我有这个脚本

#!/usr/bin/perl

use warnings;
use strict;
use Data::Dumper;

my %x1 = ();
$x1{"a"} = "e";

my %x2 = ();
$x2{"a"} = ["b","c"];

p(\%x1);
p(\%x2);

sub p {
    my $x = shift @_;
    print $x->{a};
    print "\n";
}
Run Code Online (Sandbox Code Playgroud)

哪个输出

e
ARRAY(0x2603fa0)
Run Code Online (Sandbox Code Playgroud)

问题是我不知道输入是数组还是标量,当它是数组时我也想打印这些值.

可以p修改这样做吗?

jus*_*tkt 41

是的,perl可以检测变量的类型.使用ref()函数.例如:

if(ref($var) eq 'ARRAY') {
   # Do stuff
}
Run Code Online (Sandbox Code Playgroud)

perlmonks讨论中查看更多内容.


Eri*_*rom 15

有几种方法可以在Perl中检测数组,每种方法都有不同的功能.

给出以下变量:

my $array    = [1, 2, 3];
my $arrayobj = bless [1, 2, 3] => 'ARRAY';
my $object   = bless [1, 2, 3] => 'Some::Object';
my $overload = bless {array => [1, 2, 3]} => 'Can::Be::Array';
{package Can::Be::Array;
    use overload fallback => 1, '@{}' => sub {$_[0]{array}}  
}
Run Code Online (Sandbox Code Playgroud)

在最后一个示例中,该\@对将参数解除引用为ARRAY,然后立即获取对它的引用.这是一个透明操作,如果该值为a,则返回相同的值ARRAY.如果该值被重载,它将返回模块创建的数组引用.但是,如果该值不能被解除引用ARRAY,则perl将抛出异常.