2016-11-15 2 views
0

Я предполагаю, что можно восстановить или сохранить внутри скаляра имена элементов, используемые в качестве параметров для подпрограммы.Как восстановить имя элемента, используемое в качестве параметра в подпрограмме?

Следующий код объясняет лучше, что я имею в виду

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 %%» есть.

Есть ли способ восстановить это с помощью специальных переменных или сохранить это как строку внутри скаляра?

+3

Что вы пытаетесь достичь здесь? Потому что короткий ответ «нет», но могут быть способы достижения аналогичной цели. – Sobrique

+2

Зачем нужна подпрограмма об именах переменных, которые передаются ей? –

+0

Я хочу сделать это, потому что мне нужно увидеть в принтах имя проверяемого массива и то, как оно развивается, принимая во внимание, что я буду называть эту подпрограмму несколько раз и используя несколько массивов в качестве параметра, это могло бы помочь мне много. –

ответ

1

Я думаю, вы бы гораздо лучше просто послать по двум параметрам ... «имя» массива, а сам массив:

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 
+1

Спасибо stevieb, это может быть самое полезное, что я мог бы сделать, поскольку, похоже, нет никакого способа делать то, о чем я просил, или, по крайней мере, не так просто. –

0

Data::Dumper::Names делает это с помощью peek_my (от PadWalker) и refaddr (от Scalar::Util). Но я подозреваю, что он хрупкий, и я бы не рекомендовал его.

Что вы на самом деле пытаетесь сделать?

+0

Спасибо, я собираюсь попробовать этот модуль и посмотреть, что происходит. То, что я пытаюсь назвать этой подпрограммой в нескольких строках программы и знать, что массив тестирует в определенный момент и как массивы «эволюционируют» –

+0

@ shayk_87: Я не говорю, что Data :: Dumper: : Имена решат вашу проблему. Я говорю, что вы можете посмотреть исходный код и использовать аналогичный подход. –

Смежные вопросы