【问题标题】:Perl: How to print variables and values from @EXPORTPerl:如何从@EXPORT 打印变量和值
【发布时间】:2020-07-26 17:21:06
【问题描述】:

我正在尝试创建一个日志,其中列出了我从包中导出的所有 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 = 

有人可以帮我看看我缺少什么吗?我已经阅读了很多关于评估嵌入在字符串中的变量的页面,但我无法让它工作。

【问题讨论】:

    标签: perl debugging scripting package dereference


    【解决方案1】:

    替换运算符的用法如下:

    $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)
    

    【讨论】:

    • 谢谢池上!这正是我需要并且正在工作的。我为缺少 $value 感到愚蠢,我的意思是:$value = $entry =~ s/\$(\w+)/${$1}/g;但是你的 @ 和 % 是有意义的,我还没有做到。 @vars 是来自更复杂版本的换位问题。真实版本使用push,而不是[]或();再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2023-04-09
    • 2021-09-01
    相关资源
    最近更新 更多