给出的示例代码:
foo(bar=>"test");
foo(bar=>["test"]);
sub foo {
my $args = {@_};
say ref($args->{bar});
say ref(\$args->{bar});
}产出:
{期望空白} 标量 列阵 参考
我想测试的是检查传递的是标量还是数组的最佳方法。类似于:
given( ref($args->{bar}) ){
when "SCALAR" { }
when "ARRAY" { }
}我可以连接这两种引用类型并执行regex-时间,但这是低效的。我也可以像下面这样测试它,但不确定这是否是首选的:
if ( ref(\$args->{bar}) eq "SCALAR" ) { ... }
elsif ( ref( $args->{bar}) eq "ARRAY" ) { ... }
else { return; }发布于 2012-12-05 20:16:24
您没有试图区分标量和数组。两种情况下都有标量。您试图区分非引用和对数组的引用。
if (!ref($x) || ref($x) eq 'ARRAY') {
# Non-ref or ref to array.
...
}或
if (!ref($x)) {
# Non-ref
...
}
elsif (ref($x) eq 'ARRAY') {
# Ref to array.
...
}或
for (ref($x)) {
if (!$_) {
# Non-ref
...
}
elsif ($_ eq 'ARRAY') {
# Ref to array.
...
}
}或
my $ref_type = ref($x);
if (!$ref_type) {
# Non-ref
...
}
elsif ($ref_type eq 'ARRAY') {
# Ref to array.
...
}或者(假设这是仅允许的两种类型的值)
if (ref($x)) {
# Ref to array.
...
} else {
# Non-ref
...
}(请注意,Scalar::Util的reftype实际上获得了ref类型。ref可以返回类名而不是引用类型。)
请注意,在Perl中,根据存储类型来区分值是一个糟糕的设计。因为它破坏了重载的对象,所以它必然会出错。
https://stackoverflow.com/questions/13731346
复制相似问题