首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl:快速检查hashref的适当方法?

Perl:快速检查hashref的适当方法?
EN

Stack Overflow用户
提问于 2012-12-05 19:57:38
回答 1查看 104关注 0票数 1

给出的示例代码:

代码语言:javascript
复制
foo(bar=>"test");
foo(bar=>["test"]);

sub foo {
   my $args = {@_};

   say ref($args->{bar});
   say ref(\$args->{bar});
}

产出:

{期望空白} 标量 列阵 参考

我想测试的是检查传递的是标量还是数组的最佳方法。类似于:

代码语言:javascript
复制
given( ref($args->{bar}) ){
   when "SCALAR" { }
   when "ARRAY"  { }
}

我可以连接这两种引用类型并执行regex-时间,但这是低效的。我也可以像下面这样测试它,但不确定这是否是首选的:

代码语言:javascript
复制
if    ( ref(\$args->{bar}) eq "SCALAR" ) { ... }
elsif ( ref( $args->{bar}) eq "ARRAY"  ) { ... }
else  { return; }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-05 20:16:24

您没有试图区分标量和数组。两种情况下都有标量。您试图区分非引用和对数组的引用。

代码语言:javascript
复制
if (!ref($x) || ref($x) eq 'ARRAY') {
   # Non-ref or ref to array.
   ...
}

代码语言:javascript
复制
if (!ref($x)) {
   # Non-ref
   ...
}
elsif (ref($x) eq 'ARRAY') {
   # Ref to array.
   ...
}

代码语言:javascript
复制
for (ref($x)) {
   if (!$_) {
      # Non-ref
      ...
   }
   elsif ($_ eq 'ARRAY') {
      # Ref to array.
      ...
   }
}

代码语言:javascript
复制
my $ref_type = ref($x);
if (!$ref_type) {
   # Non-ref
   ...
}
elsif ($ref_type eq 'ARRAY') {
   # Ref to array.
   ...
}

或者(假设这是仅允许的两种类型的值)

代码语言:javascript
复制
if (ref($x)) {
   # Ref to array.
   ...
} else {
   # Non-ref
   ...
}

(请注意,Scalar::Util的reftype实际上获得了ref类型。ref可以返回类名而不是引用类型。)

请注意,在Perl中,根据存储类型来区分值是一个糟糕的设计。因为它破坏了重载的对象,所以它必然会出错。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13731346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档