Perl:如何从@EXPORT 打印变量和值
Perl: How to print variables and values from @EXPORT
我正在尝试创建一个日志,列出我从包中导出的所有 perlvar,以用于调试目的。我无法从 @EXPORT 中取消引用。
我有一个看起来像这样的包裹:
package my_lib;
use strict;
no strict 'refs';
use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
our @ISA qw(Exporter);
our @EXPORT = qw();
use Exporter;
our $var1 = 1;
our $var2 = 5;
our $var3 = $var1 + $var2;
our @vars = [$var1, $var2];
my @my_exported = qw(
$var1
$var2
$var3
@vars
);
sub dump_vars {
foreach my $entry (@my_exported) {
# my $value =~ s/($\w+)//eeg;
my $value =~ s/$(\w+)/${}/g;
print "$entry = $value\n";
}
}
push(@EXPORT, @my_exported);
push(@EXPORT_OK, qw(&dump_vars));
1;
- 我已经尝试了两个版本来取消引用 $value,但每次都会得到一个空字符串
然后我有 perl 脚本来生成包含包中所有值的日志:
#!/usr/bin/perl
use my_lib qw(dump_vars);
#dump_vars();
eval dump_vars();
- 我尝试了两种调用子程序的版本
我这样使用这个脚本:
gen_vars_lib_log.pl > vars_lib.log
我希望日志看起来像这样:
$var1 = 1
$var2 = 5
$var3 = 6
@vars = [1, 5]
但是,我得到的是:
$var1 =
$var2 =
$var3 =
@vars =
有人可以帮我看看我错过了什么吗?我已经阅读了很多关于评估字符串中嵌入的变量的页面,但我无法让它工作。
替换运算符使用如下:
$var_to_modify =~ s/.../.../
所以下面尝试修改新创建变量的值$value
。
my $value =~ s/$(\w+)/${}/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(${ $ });
}
elsif ($entry =~ /^\@(\w+)\z/) {
$value = Dumper(\@);
$value =~ s/^\[/(/;
$value =~ s/\]\z/)/;
}
elsif ($entry =~ /^\%(\w+)\z/) {
$value = Dumper(\%);
$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)
我正在尝试创建一个日志,列出我从包中导出的所有 perlvar,以用于调试目的。我无法从 @EXPORT 中取消引用。
我有一个看起来像这样的包裹:
package my_lib;
use strict;
no strict 'refs';
use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
our @ISA qw(Exporter);
our @EXPORT = qw();
use Exporter;
our $var1 = 1;
our $var2 = 5;
our $var3 = $var1 + $var2;
our @vars = [$var1, $var2];
my @my_exported = qw(
$var1
$var2
$var3
@vars
);
sub dump_vars {
foreach my $entry (@my_exported) {
# my $value =~ s/($\w+)//eeg;
my $value =~ s/$(\w+)/${}/g;
print "$entry = $value\n";
}
}
push(@EXPORT, @my_exported);
push(@EXPORT_OK, qw(&dump_vars));
1;
- 我已经尝试了两个版本来取消引用 $value,但每次都会得到一个空字符串
然后我有 perl 脚本来生成包含包中所有值的日志:
#!/usr/bin/perl
use my_lib qw(dump_vars);
#dump_vars();
eval dump_vars();
- 我尝试了两种调用子程序的版本
我这样使用这个脚本:
gen_vars_lib_log.pl > vars_lib.log
我希望日志看起来像这样:
$var1 = 1
$var2 = 5
$var3 = 6
@vars = [1, 5]
但是,我得到的是:
$var1 =
$var2 =
$var3 =
@vars =
有人可以帮我看看我错过了什么吗?我已经阅读了很多关于评估字符串中嵌入的变量的页面,但我无法让它工作。
替换运算符使用如下:
$var_to_modify =~ s/.../.../
所以下面尝试修改新创建变量的值$value
。
my $value =~ s/$(\w+)/${}/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(${ $ });
}
elsif ($entry =~ /^\@(\w+)\z/) {
$value = Dumper(\@);
$value =~ s/^\[/(/;
$value =~ s/\]\z/)/;
}
elsif ($entry =~ /^\%(\w+)\z/) {
$value = Dumper(\%);
$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)