Мне нужно было построить структуру данных хэша переменной глубины в perl.В конце концов я нашел этот кусок кода:
#!/usr/bin/perl -w
use strict;
my %hash;
my $value = "foo";
my @cats = qw(a b c d);
my $p = \%hash;
foreach my $item (@cats) {
$p->{$item} = {} unless exists($p->{$item});
$p = $p->{$item};
}
Мой вопрос: как и почему это работает.Я думал, что знаю, как работает Perl.Ни в одной точке этого кода я не вижу сбрасываемого значения хеша \%, и кажется, что $ p (это локальная переменная) сбрасывается в каждом цикле.Я мог даже увидеть это с помощью дампера данных: Running:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
my %hash;
my $value = "foo";
my @cats = qw(a b c d);
my $p = \%hash;
foreach my $item (@cats) {
print "BEFORE:\n";
print Dumper(\%hash);
#print Dumper($p);
$p->{$item} = {} unless exists($p->{$item});
$p = $p->{$item};
print "AFTER:\n";
print Dumper(\%hash);
#print Dumper($p);
}
И затем раскомментирование строки с
#print Dumper($p)
CLEARLY показывает, что $ p является новой переменной каждый раз.хэш получает сборку, если $ p каждый раз сбрасывается?