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的子程序,我的第一个问题是确定要处理的变量类型.
来自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)