【问题标题】:Can Perl detect arrays?Perl 可以检测数组吗?
【发布时间】:2011-07-10 18:03:42
【问题描述】:

我有这个脚本

#!/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";
}

哪个输出

e
ARRAY(0x2603fa0)

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

可以修改p 来执行此操作吗?

【问题讨论】:

  • => 我鼓励您使用更长的变量和字段名称,这对可读性有很大帮助(尤其是当您回到之前编写的一些代码时)。 @Claudiu => 没有人欣赏你向这个问题发送垃圾邮件;喜欢python真是太好了,留给python问题吧

标签: arrays perl


【解决方案1】:

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

if (ref($var) eq 'ARRAY') {
   # Do stuff
}

this perlmonks discussion 中查看更多信息。

【讨论】:

    【解决方案2】:

    在 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}}  
    }
    
    • ref 内置函数

      ref $array    eq 'ARRAY'
      ref $arrayobj eq 'ARRAY'
      ref $object   eq 'Some::Object'
      ref $overload eq 'Can::Be::Array'
      
    • 核心模块Scalar::Util中的reftype函数

      reftype $array    eq 'ARRAY'
      reftype $arrayobj eq 'ARRAY'
      reftype $object   eq 'ARRAY'
      reftype $overload eq 'HASH'
      
    • Scalar::Util 中的blessed 函数主要用于确定变量是否包含可以调用方法的对象。

      blessed $array    eq undef
      blessed $arrayobj eq 'ARRAY'
      blessed $object   eq 'Some::Object'
      blessed $overload eq 'Can::Be::Array'
      
    • 捕获异常

      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
      

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

    【讨论】:

      【解决方案3】:

      如果您需要动态回答,请使用ref 函数。

      【讨论】:

        【解决方案4】:

        如果您只想漂亮地打印一个变量,请将您的 print ... 替换为 print Dumper ...

        $Data::Dumper::Indent = 0;
        print Dumper($x);
        

        您的示例的输出将是:

        $VAR1 = {'a' => 'e'};
        $VAR1 = {'a' => ['b','c']};
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-14
          • 2019-03-11
          • 1970-01-01
          • 2012-02-24
          相关资源
          最近更新 更多