我有这个脚本
#!/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)
在REF内置功能
ref $array eq 'ARRAY'
ref $arrayobj eq 'ARRAY'
ref $object eq 'Some::Object'
ref $overload eq 'Can::Be::Array'
Run Code Online (Sandbox Code Playgroud)在reftype从核心模块功能标量::的Util
reftype $array eq 'ARRAY'
reftype $arrayobj eq 'ARRAY'
reftype $object eq 'ARRAY'
reftype $overload eq 'HASH'
Run Code Online (Sandbox Code Playgroud)blessedScalar :: Util中的函数主要用于确定变量是否包含可以调用方法的对象.
blessed $array eq undef
blessed $arrayobj eq 'ARRAY'
blessed $object eq 'Some::Object'
blessed $overload eq 'Can::Be::Array'
Run Code Online (Sandbox Code Playgroud)捕捉异常
my $x = eval {\@$array } or die $@; # ok
my $x = eval {\@$arrayobj} or die $@; # ok
my $x = eval {\@$object} or die $@; # ok
my $x = eval {\@$overload} or die $@; # also ok, since overloaded
Run Code Online (Sandbox Code Playgroud)在最后一个示例中,该\@对将参数解除引用为ARRAY,然后立即获取对它的引用.这是一个透明操作,如果该值为a,则返回相同的值ARRAY.如果该值被重载,它将返回模块创建的数组引用.但是,如果该值不能被解除引用ARRAY,则perl将抛出异常.