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

时间:2016-11-15 11:58:30

标签: perl parameters subroutine

我猜测是否有可能在标量中恢复或保存用作子程序参数的“项目”名称。

以下代码更好地解释了我所指的是什么

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 %%”所在的数组名称。

有没有办法使用特殊变量恢复它或将其保存为标量内的字符串?

2 个答案:

答案 0 :(得分:1)

我认为只要发送两个参数...数组的'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));

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

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

答案 1 :(得分:0)

Data::Dumper::Names使用peek_my(来自PadWalker)和refaddr(来自Scalar::Util)来完成此操作。但我怀疑它很脆弱,我不推荐它。

你究竟想做什么?