代码之家  ›  专栏  ›  技术社区  ›  Daniel C. Sobral

如何确定Perl中变量的值是标量还是数组?

  •  7
  • Daniel C. Sobral  · 技术社区  · 15 年前

    假设我有这个:

    my %hash;
    
    $hash{"a"} = "abc";
    $hash{"b"} = [1, 2, 3];
    

    稍后,我如何才能确定存储的内容是否是标量,如 "abc" 或数组,如 [1, 2, 3] ?

    2 回复  |  直到 15 年前
        1
  •  14
  •   zigdon    15 年前

    首先,您的数组引用示例是错误的- $hash{"b"} 最终会得到一个 标量值 :您提供的列表的最后一个元素(在本例中为“c”)。

    也就是说,如果您确实想查看是否有标量或引用,请使用 ref 功能:

    my %hash;
    
    $hash{"a"} = "abc";
    $hash{"b"} = [qw/a b c/];
    
    if (ref $hash{"b"} eq 'ARRAY') {
      print "it's an array reference!";
    }
    

    文档

        2
  •  8
  •   Chas. Owens    15 年前

    首先, $hash{"b"} = qw/a b c/; 将存储 'c' 在里面 $hash{"b"} ,而不是数组,您可能是指 $hash{"b"} = [ qw/a b c/ ]; 将对数组的引用存储到 $hash“b” . 这是关键信息。当分配给标量时,除标量之外的任何内容都必须存储为引用。有一个函数名为 ref 这将告诉您有关引用的信息,但如果引用受到祝福,它将向您提供对象类的名称。很高兴还有一个函数名为 reftype 它总是返回结构的类型 Scalar::Util .

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use Scalar::Util qw/reftype/;
    
    my $rs  = \4;
    my $ra  = [1 .. 5];
    my $rh  = { a => 1 };
    my $obj = bless {}, "UNIVERSAL";
    
    print "ref: ", ref($rs), " reftype: ", reftype($rs), "\n",
        "ref: ", ref($ra), " reftype: ", reftype($ra), "\n",
        "ref: ", ref($rh), " reftype: ", reftype($rh), "\n",
        "ref: ", ref($obj), " reftype: ", reftype($obj), "\n";