Создание хэша в Perl - PullRequest
       1

Создание хэша в Perl

3 голосов
/ 24 сентября 2011

Как создать хеш в Perl, который использует имя каталога в качестве ключа, а затем сохраняет как количество файлов в каталоге, так и имена каждого из файлов? Возможно ли использовать хэш хэшей или хэш массивов?

Буду признателен за любые указатели.

Ответы [ 3 ]

4 голосов
/ 24 сентября 2011

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

$data{$dir} = {
   file_count => 0+@files,
   files      => \@files,
};

Обратите внимание, что количество файлов избыточно. 0+@{ $data{$dir}{files} } может быть использовано для подсчета файлов. Если вы решите избавиться от этой избыточности, вы можете использовать

$files{$dir} = \@files;

Количество файлов доступно как

0+@{ $files{$dir} }

и файлы доступны как

@{ $files{$dir} }

(0+ может быть опущено в скалярном контексте.)

2 голосов
/ 24 сентября 2011

Лично почти всегда я использую хеш-ссылки вместо perl-хешей (и arrayrefs вместо perl-массивов тоже).Пример:

my $dirs = {
     '/home/user' => [ '.profile', '.bashrc', 'My_pic.png' ],
     '/root'      => [ '.profile', '.zshrc' ]
};

my $var = { (...) } делает ссылку на хеш, => - это просто синоним запятой ,, но позволяет различать ключи и значения хеша.[ (...) ] делает ссылку на анонимный массив, который назначается в качестве значения хеш-функции.

Вам не нужно хранить избыточную информацию, такую ​​как количество файлов, вы можете просто оценить массив в скалярном контексте:

my $root_files = $dirs->{'/root'};
$size = scalar @{$root_files};

Вы можете узнать больше о хешах здесь и здесь .

2 голосов
/ 24 сентября 2011

Если я правильно вас понимаю, это похоже на хитрость (печать хеша с помощью Dumper () в конце просто показывает вам, что содержит хешреф):

#!/usr/bin/perl -w

use strict;
use Data::Dumper;

my $dir = $ENV{PWD};
opendir( DIR, $dir ) or die $!;
my @files = grep { -f "$dir/$_" } readdir( DIR );
my $hash = {
    $dir => {
        count => scalar( @files ),
        files => \@files,
    }
};

print Dumper( $hash ), "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...