检测混合数组中的元素类型

Ben*_*ing 7 arrays perl scalar ref

我正在使用一些具有子程序的代码,该子程序包含一个数组引用作为参数之一.此传入数组中的元素可以是小数组或字符串.

我想确定每个元素的类型是为了做某些特定的事情(即,如果元素是一个数组,通过索引进一步深入,如果元素是一个字符串,请使用字符串)

我已经尝试使用该ref函数来查询每个数组元素.它似乎适用于ARRAYs的元素,但如果元素是一个字符串,我希望ref返回SCALAR.然而ref()似乎什么也没有回报.我究竟做错了什么?我认为ref()会回归一些东西.

以下是一些示例代码:

my @array = ("string1", 
             ["ele1_arraystr1", "ele1_arraystr2"], 
             "string2", 
             ["ele4_arraystr1", "ele4_arraystr2"], 
             "etc");
my $tmp;
&foobar( 30, 20, \@array);

sub foobar {
    my($var1, $var2, $array_ref) = @_;
    foreach $element (@$array_ref) {
        my $tmp = ref($element);
        print "Array element type: $tmp\n";
        if ($tmp eq 'ARRAY') {
            print "  ARRAY: $element->[1]\n";

        } elsif ($tmp eq 'SCALAR') {
            print "  SCALAR: $element\n";
        } else {
            print "  Unexpected type: $tmp\n";
       }
    }
 }
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

ARRAY element test:
Array element type: 
  Unexpected type: 
Array element type: ARRAY
  ARRAY: ele1_arraystr2
Array element type: 
  Unexpected type: 
Array element type: ARRAY
  ARRAY: ele4_arraystr2
Array element type: 
  Unexpected type: 
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 5

ref回报,如果它的参数是不是一个引用一个空字符串.文件说

如果EXPR是引用,则返回非空字符串,否则返回空字符串.返回的值取决于引用引用的事物的类型.

随后的列表(包括SCALAR)是引用可以使用的类型.

因此,当它有一个字符串时,它返回一个空字符串,其值为false.如果您知道它是ARRAY字符串或字符串,那么您可以这样做

if (ref($element) eq 'ARRAY') {
    # process the arrayref
}
else { 
    # process the string
}
Run Code Online (Sandbox Code Playgroud)

更好地检查字符串(false),就像你一样,以便能够检测任何其他类型

my $ref_type = ref($element);
if ($ref_type eq 'ARRAY') {
    # process arrayref
}
elsif (not $ref_type) {  
    # process string
}
else { print "Got type $ref_type\n" }
Run Code Online (Sandbox Code Playgroud)