Perl: Как печатать переменные и значения из @EXPORT - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь создать журнал, в котором перечислены все 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 = 

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

1 Ответ

1 голос
/ 14 апреля 2020

Оператор подстановки используется следующим образом:

$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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...