如何恢复在子程序中用作参数的元素名称?

How to recover a element name used as parameter in a subroutine?

我猜是否有可能在标量中恢复或保存用作子例程参数的 "items" 名称。

以下代码更好地解释了我所指的内容

sub test_array{

    print "\n";
    print "TESTING ARRAY ".%%ARRAY_NAME%%."\n";
    print "\n";
    print " \'".join ("\' , \'" , @_)."\'"."\n";
    print "\n";

}

@list= qw/uno dos tres/;

test_array(@list);

所以目标是有一个名为 "test_array" 的子例程,它打印数组的名称和内容作为参数传递给子例程。

我想要打印“%%ARRAY_NAME%%”所在的数组名称。

有什么方法可以使用特殊变量恢复它或将其保存为标量中的字符串吗?

Data::Dumper::Names does this using peek_my (from PadWalker) and refaddr (from Scalar::Util)。但我怀疑它很脆弱,我不会推荐它。

你到底想做什么?

我认为你最好只发送两个参数...数组的 'name' 和数组本身:

sub test_array {
    my ($name, @array) = @_;
    print "array: $name\n";
    print join ', ', @array;
}

然后:

my @colours = qw(orange green);
test_array('colours', @colours);

...

my @cities = qw(toronto edmonton);
test_array('cities', @cities);

甚至:

test_array('animals', qw(cat dog horse));

另一种可能有助于使事情自动化的方法是使用全局哈希将数组的位置存储为键,将其名称作为值,然后将数组引用传递给子:

use warnings;
use strict;

my %arrs;

my @animals = qw(cat dog);

$arrs{\@animals} = 'animals';

my @colours = qw(orange green);

$arrs{\@colours} = 'colours';

test_array(\@animals);
test_array(\@colours);

sub test_array {
    my $array = shift;

    print "$arrs{$array}\n";

    print join ', ', @$array;
    print "\n";
}

输出:

animals
cat, dog
colours
orange, green