Оператор подстановки используется следующим образом:
$var_to_modify =~ s/.../.../
Таким образом, следующее пытается изменить значение только что созданной переменной $value
.
my $value =~ s/\$(\w+)/${$1}/g;
Всегда использовать use strict; use warnings;
!! Эта ошибка была бы обнаружена.
(Да, я понимаю, что вам нужно использовать no strict 'refs';
здесь, хотя вы должны ограничить его область действия частями кода, где это необходимо.)
Вторая проблема в том, что вы даже пытаетесь обрабатывать массивы. Но прежде чем вы сможете попытаться сделать это, вы должны понять, что следующее создает массив с одним элементом:
@vars = [ $var1, $var2 ]; # Assign 1 scalar, a reference to an array to @vars
Предположительно, вы хотели
@vars = ( $var1, $var2 ); # Assign 2 scalars to @vars
Я собираюсь использовать Data :: Dumper для вывода значений.
package my_lib;
use strict;
use warnings;
use Data::Dumper qw( Dumper );
use Exporter qw( import );
our $var1 = 1;
our $var2 = 5;
our $var3 = $var1 + $var2;
our @vars = ( $var1, $var2 );
our @EXPORT = qw(
$var1
$var2
$var3
@vars
);
our @EXPORT_OK = qw( dump_vars );
sub dump_vars {
no strict qw( refs );
local $Data::Dumper::Indent = 0;
local $Data::Dumper::Terse = 1;
for my $entry (@EXPORT) {
my $value;
if ($entry =~ /^\$(\w+)\z/) {
$value = Dumper(${ \$$1 });
}
elsif ($entry =~ /^\@(\w+)\z/) {
$value = Dumper(\@$1);
$value =~ s/^\[/(/;
$value =~ s/\]\z/)/;
}
elsif ($entry =~ /^\%(\w+)\z/) {
$value = Dumper(\%$1);
$value =~ s/^\{/(/;
$value =~ s/\}\z/)/;
}
else {
next;
}
print "$entry = $value\n";
}
}
1;
Вывод:
$ perl -I. -e'use my_lib qw( dump_vars ); dump_vars()'
$var1 = 1
$var2 = 5
$var3 = 6
@vars = (1,5)