Perl:如何从@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+)/$1/eeg;
        my $value =~ s/\$(\w+)/${$1}/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+)/${$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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章