Давайте попробуем немного по-другому.
Во-первых, есть хороший синтаксис с использованием ->
для ссылочных массивов и хешей. Здесь я собираюсь создать множество людей. Я сделаю хэш %person
, который содержит всю информацию этого человека:
my %person;
my $person{NAME} = "Bob";
my $person{JOB} = "Programmer";
my $person{PHONE} = "555-1234";
Теперь я положу его в массив:
my @array
my $array[0] = \%person;
Я мог бы сослаться на человека в массиве этот путь :
print ${$array[0]}{NAME} . "\n"; #Prints Bob
print ${$array[0]}{JOB} . "\n"; #Prints Porgrammer
Но, Perl дает мне хороший чистый способ сделать это:
print $array[0]->{NAME} . "\n"; #Prints Bob
print $array[0]->{JOB} . "\n"; #Prints Progammer
Фактически, я мог бы пропустить хэш все вместе. Здесь я добавляю Джил к моему массиву:
$array[1]->{NAME} = "Jill";
$array[1]->{JOB} = "DBA";
$array[1]->{PHONE} = "555-5555";
Вы можете видеть, что это гораздо более простой способ использовать ссылки. Легче видеть, что происходит, и занимает меньше строк кода.
Вы можете обратиться к массиву массива, как это:
$myarray[1]->[3] = 42;
Или есть хэш, который хранит массив. В этот день и возраст, который имеет только один телефонный номер ?:
$person[1]->{PHONE}->[0] = "555-4567";
$person[1]->{PHONE}->[1] = "555-4444";
Или, чтобы сделать его еще более сложным, мы могли бы иметь хэш хэш массива:
$person[1]->{PHONE}->{CELL}->[0] = "555-1111";
$person[1]->{PHONE}->{CELL}->[1] = "555-2222";
$person[1]->{PHONE}->{HOME}->[0] = "555-3333";
$person[1]->{PHONE}->{JOB}->[0] = "555-4444";
$person[1]->{PHONE}->{JOB}->[1] = "555-5555";
Использование этот синтаксис действительно поможет очистить много вашего кода. Вам не нужно хранить информацию в отдельных структурах, которые затем используются только для создания ссылок. Вместо этого вы можете просто настроить свою структуру так, как хотите, без промежуточных шагов.
Теперь к вашей проблеме: Вы пытаетесь сохранить кучу информации о файлах в ряд массивов. Что вы надеетесь, так это то, что $array_mode[1]
идет с $array_file[1]
, и вам нужно сохранить все эти массивы синхронно. Это боль, и это сложно.
Вся цель использования ссылок заключается в устранении этой необходимости для нескольких переменных. Если вы собираетесь использовать ссылки, почему бы просто не сохранить всю вашу файловую структуру в один массив.
Что вы действительно хотите получить, это массив хеш-ссылок. И эта хеш-ссылка будет зависеть от вашего файла атрибутов. Вот ваш код, реструктурированный в использование массива хеш-ссылок. Я даже не потрудился проверить остальную часть. Например, я не знаю, как будет работать ваше местное время:
use strict;
use warnings;
use feature qw(say);
use File::stat;
my @files;
for my $file (@ARGV) {
my $info = stat($file);
my $file = {}; #This will be a reference to a hash
$file->{NAME} = $file;
$file->{SIZE} = $info->size;
$file->{RET_MODE} = $info->mode & 0777;
$file->{LAST_MOD} = localtime $info->mtime; #Does this work?
push @files, $file #Pushes the hash reference onto the array
}
Это путь короче и чище. Кроме того, вы знаете, что $files[0]->{NAME}
идет с $files[1]->{SIZE}
, и если вы удаляете $files[0]
из своего массива или переносите его на другую переменную, все атрибуты этого файла идут вместе.
Вот как вы бы распечатать его:
for my $file (@files) {
say "File Name: " . $file->{NAME};
say "File Size: " . $file->{SIZE};
say "Last Modified: " . $file->{LAST_MOD};
say "File Mode: " . $file->{RET_MODE};
}
Простой и легко сделать.
Однако, я бы сказал, что вы действительно хотите это хэш из хэшей. Пусть ваше имя файла быть ключом к вашему основному хэшу, и пусть {SIZE}
, {LAST_MOD}
и {RET_MODE}
быть ключи к вашему югу хэшу:
my %files = {}; #This is a hash of hashes
for my $file_name (@ARGV) {
my $info = stat($file);
$files{$file_name}->{SIZE} = $info->size;
$files{$file_name}->{RET_MODE} = $info->mode & 0777;
$files{$file_name}->{LAST_MOD} = localtime $info->mtime; #Does this work?
}
Теперь, если кто-то спрашивает, «Когда foo.txt
Последнего изменения? ", вы можете сказать:
say "File 'foo.txt' was last modified on " . $file{foo.txt}->{LAST_MOD};
И распечатать всю вашу структуру:
for my $file_name (sort keys %files) {
say "File: $file_name";
for my attribute (sort keys %{ $file_name }) {
say " $attribute: " . $files{$file_name}->{$attribute};
}
}
Следующий шаг, чтобы узнать о Object Oriented Perl! Объектно-ориентированный Perl использует эти типы ссылок, но значительно упростит обработку этих ссылок, поэтому вы будете делать меньше ошибок программирования.
Отъезд perlLOL - официальные документы в [списки списков в perl] (http://perldoc.perl.org/perllol.html) –