Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 该变量不受保护_Perl - Fatal编程技术网

Perl 该变量不受保护

Perl 该变量不受保护,perl,Perl,我有这个消息来源 first start.pl use strict; use warnings; use hh; print "Starting...\n"; my $abc={ VAL=>['alfa','beta'], STUDENTS=>{ stud1=>{VAL=>['delta','gama']}, stud2=>{VAL=>['omega','upsilon']},

我有这个消息来源 first start.pl

use strict;
use warnings;

use hh;

print "Starting...\n";

my $abc={
    VAL=>['alfa','beta'],
    STUDENTS=>{
        stud1=>{VAL=>['delta','gama']},
        stud2=>{VAL=>['omega','upsilon']},
            }
    };
my $object=hh->new(catalog=>$abc);
那包裹呢

package hh;
use strict;
use warnings;

sub new {
    my $class=shift;
    my $self={@_};
    bless ($self,$class) ; 
    $self->_initialize("",['BEGIN']);
    return $self ; 
}




sub _initialize {
    my $self=shift;
    my $tab=shift;
    my $carry=shift;
    $tab=$tab."\t|";
    
    if (defined $self->{VAL}){print "$tab Have  val=",join(" ",@{$self->{VAL}}),"\n";push(@{$carry},@{$self->{VAL}})}
    foreach my $k (sort {lc $a cmp lc $b} keys %{$self}){
        print $tab,"carry=",$#{$carry}+1," "," ",$k,"\n";
        if (ref($self->{$k}) eq 'HASH'){print "$tab Running initialize pentru $k\n";_initialize($self->{$k},$tab,$carry)}
    }

return $self;
}

1;
输出如下

Starting...
    |carry=1  catalog
    | Running initialize pentru catalog
    |   | Have  val=alfa beta
    |   |carry=3  STUDENTS
    |   | Running initialize pentru STUDENTS
    |   |   |carry=3  stud1
    |   |   | Running initialize pentru stud1
    |   |   |   | Have  val=delta gama
    |   |   |   |carry=5  VAL
    |   |   |carry=5  stud2
    |   |   | Running initialize pentru stud2
    |   |   |   | Have  val=omega upsilon
    |   |   |   |carry=7  VAL
    |   |carry=7  VAL
不知何故,我想将树顶和walked元素之间的VAL数组收集到一个数组中。第二级的最后一个VAL有7个元素。我只想要2个元素(alfa和beta)

这是预期的输出


如果只想累加当前分支中的值,则必须传递进位数组的副本
[@$carry]
取消对arrayref的引用
$carry
并从元素创建新的arrayref。在函数结束时,我保留了调试打印的原始参考。更自然的方法是编写
$carry=[@$carry]

use strict;
use warnings;

package hh;
use Data::Dumper;
sub new {
    my $class=shift;
    my $self={@_};
    bless ($self,$class) ; 
    $self->_initialize("",['BEGIN']);
    return $self ; 
}




sub _initialize {
    my $self=shift;
    my $tab=shift;
    my $carry=shift;
    $tab=$tab."\t|";
    print "$tab _initialize() called with carry "," [",join(', ',@$carry),"]\n";
    my $new_carry =  [@$carry];
    if (defined $self->{VAL}){
        print "$tab Have found val=",join(" ",@{$self->{VAL}}),"\n";
        print "$tab pushing ",join(" ",@{$self->{VAL}}),"\n";
        push(@{$new_carry},@{$self->{VAL}})
    }
    print $tab," carry=",$#{$new_carry}+1," [",join(', ',@$new_carry),"]\n";

    foreach my $k (sort {lc $a cmp lc $b} keys %{$self}){
        if (ref($self->{$k}) eq 'HASH'){print "$tab Running initialize pentru $k\n";_initialize($self->{$k},$tab, $new_carry)}
    }
    print "$tab returning to previous level. carry was "," [",join(', ',@$carry),"]\n";
    return $self;
}

package main;
print "Starting...\n";

my $abc={
    VAL=>['alfa','beta'],
    STUDENTS=>{
        stud1=>{VAL=>['delta','gama']},
        stud2=>{VAL=>['omega','upsilon']},
            }
    };
my $object=hh->new(catalog=>$abc);
这张照片是:

Starting...
    | _initialized called with carry  [BEGIN]
    | carry=1 [BEGIN]
    | Running initialize pentru catalog
    |   | _initialized called with carry  [BEGIN]
    |   | Have found val=alfa beta
    |   | pushing alfa beta
    |   | carry=3 [BEGIN, alfa, beta]
    |   | Running initialize pentru STUDENTS
    |   |   | _initialized called with carry  [BEGIN, alfa, beta]
    |   |   | carry=3 [BEGIN, alfa, beta]
    |   |   | Running initialize pentru stud1
    |   |   |   | _initialized called with carry  [BEGIN, alfa, beta]
    |   |   |   | Have found val=delta gama
    |   |   |   | pushing delta gama
    |   |   |   | carry=5 [BEGIN, alfa, beta, delta, gama]
    |   |   |   | returning to previous level. carry was  [BEGIN, alfa, beta]
    |   |   | Running initialize pentru stud2
    |   |   |   | _initialized called with carry  [BEGIN, alfa, beta]
    |   |   |   | Have found val=omega upsilon
    |   |   |   | pushing omega upsilon
    |   |   |   | carry=5 [BEGIN, alfa, beta, omega, upsilon]
    |   |   |   | returning to previous level. carry was  [BEGIN, alfa, beta]
    |   |   | returning to previous level. carry was  [BEGIN, alfa, beta]
    |   | returning to previous level. carry was  [BEGIN]
    | returning to previous level. carry was  [BEGIN]

“不知何故,我想从散列的根中收集数组或某物中的VAL数组”因为您将数组引用递归地传递到
\u initialize()
数组正在累积
VAL
条目,最后一次调用它将包含7个元素
BEGIN
alfa
beta
delta
gama
omega
upsilon
请描述该程序试图执行的操作。很难理解您试图实现的目标。我想遍历整个树,在每个分支上,我想知道元素和树顶部之间的所有数组。您能显示预期的输出吗?这将有助于澄清你的问题
Starting...
    | _initialized called with carry  [BEGIN]
    | carry=1 [BEGIN]
    | Running initialize pentru catalog
    |   | _initialized called with carry  [BEGIN]
    |   | Have found val=alfa beta
    |   | pushing alfa beta
    |   | carry=3 [BEGIN, alfa, beta]
    |   | Running initialize pentru STUDENTS
    |   |   | _initialized called with carry  [BEGIN, alfa, beta]
    |   |   | carry=3 [BEGIN, alfa, beta]
    |   |   | Running initialize pentru stud1
    |   |   |   | _initialized called with carry  [BEGIN, alfa, beta]
    |   |   |   | Have found val=delta gama
    |   |   |   | pushing delta gama
    |   |   |   | carry=5 [BEGIN, alfa, beta, delta, gama]
    |   |   |   | returning to previous level. carry was  [BEGIN, alfa, beta]
    |   |   | Running initialize pentru stud2
    |   |   |   | _initialized called with carry  [BEGIN, alfa, beta]
    |   |   |   | Have found val=omega upsilon
    |   |   |   | pushing omega upsilon
    |   |   |   | carry=5 [BEGIN, alfa, beta, omega, upsilon]
    |   |   |   | returning to previous level. carry was  [BEGIN, alfa, beta]
    |   |   | returning to previous level. carry was  [BEGIN, alfa, beta]
    |   | returning to previous level. carry was  [BEGIN]
    | returning to previous level. carry was  [BEGIN]