Perl интерпретирует следующее объявление переменной

Привет всем, у меня есть простой вопрос о новичках на perl. Я смотрю на код пользователя perl, и у него есть некоторые объявления переменных следующим образом:

my $OutputFiles=[];
$OutputFiles = 
[
 { FID => 789133, TAGE => "BRWSGF_05K", nfiles => 1, Suffix => 'jpg' },
 { FID => 789134, TAGE => "BRWSGF_W05K", nfiles => 1, Suffix => 'jpg' }, 
 { FID => 789135, TAGE => "BRWSGF_E05K", nfiles => 1, Suffix => 'jpg' },
];

Кажется, что это какой-то массив хэша, но объявление переменной $OutputFiles не похоже на объявление массива, поэтому я запутался. Пожалуйста, дайте мне знать, какова переменная $OutputFiles должна быть, и как можно манипулировать такой переменной. Снова признаюсь, что я новичок в Perl.

3 ответа

[] создает ссылку на массив, которая является скаляром.

my $foo = [1, 2, 3];

Дает то же значение $foo что и:

my @bar = (1, 2, 3);
my $foo = \@bar;

Подробнее см. Perldoc perlref.


Как уже упоминалось в Quentin, это ссылка на массив, содержащая хеши, я добавляю некоторые мелочи, как вы можете их разузнать и получить доступ к определенному ключу, поскольку он содержит хеши.

use strict;
use warnings;
use Data::Dumper;

my $OutputFiles=[];
$OutputFiles =
[
 { FID => 789133, TAGE => "BRWSGF_05K", nfiles => 1, Suffix => 'jpg' },
 { FID => 789134, TAGE => "BRWSGF_W05K", nfiles => 1, Suffix => 'jpg' },
 { FID => 789135, TAGE => "BRWSGF_E05K", nfiles => 1, Suffix => 'jpg' },
];

my @output = @{$OutputFiles}; #dereference the array ref
print Dumper(@output );

print Dumper(@{$OutputFiles}[0]->{FID}); # accessing the specific key


$ OutputFiles - это ссылка на массив, как объяснил ответ Квентина. Вы также правы, что это массив хешей, но вы также можете думать об этом как о массиве хеш-ссылок. Здесь вы можете получить доступ к данным:

#!/bin/perl

use strict;
use warnings;


my $OutputFiles=[];
$OutputFiles = [
 { FID => 789133, TAGE => "BRWSGF_05K", nfiles => 1, Suffix => 'jpg' },
 { FID => 789134, TAGE => "BRWSGF_W05K", nfiles => 1, Suffix => 'jpg' },
 { FID => 789135, TAGE => "BRWSGF_E05K", nfiles => 1, Suffix => 'jpg' },
 ];
my ($FID, $TAGE, $nfiles, $Suffix);

for my $hash_ref ( @$OutputFiles ) {
 $FID = $hash_ref->{FID};
 $TAGE = $hash_ref->{TAGE};
 $nfiles = $hash_ref->{nfiles};
 $Suffix = $hash_ref->{Suffix};
 print "FID: $FID TAGE: $TAGE nfiles: $nfiles: Suffix: $Suffix\n";
}

licensed under cc by-sa 3.0 with attribution.