如何创建一个接受所有类型变量的子例程(标量,散列,数组或引用)

Son*_*ire 0 perl perl-data-structures

如何创建一个接受所有类型变量的子例程并确定它是否是(标量,散列,数组或引用)

sub know_var {
    my $this_var = shift;

    if ($this_var eq "array"){
        print "This variable is an array!";
    } elsif ($this_var eq "hash") {
        print "This variable is a hash!";
    } elsif ($this_var eq "hash ref") {
        print "This variable is an hash reference!";
    } so on..

}

my @array = ('foor', 'bar');
my %hash  = (1 => "one", 2 => "two");
my $scalar = 1;
my $scalar_ref = \$scalar;
my $hash_ref = \%hash;
my $arr_ref = \@array;

know_var(@array);
know_var($scalar_ref);
and so on...
Run Code Online (Sandbox Code Playgroud)

我的目标是我想创建一个类似于Data :: Dumper的子程序,我的第一个问题是确定要处理的变量类型.

Сух*_*й27 6

来自perlsub

函数调用和返回值的Perl模型很简单:所有函数都作为参数传递给一个单独的标量列表,所有函数同样返回给调用者一个单独的标量列表.这些调用和返回列表中的任何数组或散列都将崩溃,丢失其身份 - 但您可能始终使用pass-by-reference来避免这种情况.

因此,您可以使用引用并ref()检查引用类型

sub know_var {
  my $this_var = shift;

  if (ref($this_var) eq "ARRAY") { 
    print "This variable is an array reference!";
  }
  elsif (ref($this_var) eq "HASH") { 
    print "This variable is an hash reference!";
  }
  elsif (ref($this_var) eq "SCALAR") { 
    print "This variable is an scalar reference!";
  }
  elsif (!ref($this_var)) { 
    print "This variable is plain scalar!";
  }

}

know_var(\@array);
know_var(\%hash);
know_var(\$scalar);
know_var($scalar);
Run Code Online (Sandbox Code Playgroud)