как использовать хеши, вызывая значение в Perl - PullRequest
0 голосов
/ 07 декабря 2011

В настоящее время я пишу скрипт для проверки наличия файлов, находящихся в нескольких каталогах.Я пишу в хэш и планирую назначить один и тот же числовой номер для тех каталогов, которые должны выполнять те же подпрограммы.И поэтому я буду называть по именам значений.Другими словами, эти каталоги, соответствующие значению, будут выполнять ту же подпрограмму, в противном случае они будут выгружены в список, чтобы позже они были распечатаны в кратком изложении.Я пишу сценарий, как показано ниже, но он, кажется, не работает должным образом, так как кажется, что значение вообще не захватывает значение.Могу я узнать, что здесь не так?Примечание. Я хочу вызывать хеш по значению, но не по ключу.

my %hashDir = (dirA => 1, dirB => 2, dirC =>3 , dirD => 1, dirE =>2, dirF =>1);
my $key = "";
my $value = "" ;
my $buf ;
my $d = "$basedir/$buf";

while (($key, $value) = each (%hashDir)) {
    if (exists $hashDir{'1'}) {
        print "test1\n" ;
        subroutine1() ;
    } elsif (exists $hashDir{'2'}) {
        print "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ;
        subroutine2() ;
    } else {
        $missingdir .= "\"$buf\" " ;
        print "test3\n" ;
    }
}

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Не думаю, что вы понимаете, как получить доступ к элементам в хэше.Когда вы делаете exists $hashDir{'1'}, вы проверяете, является ли '1' ключом в хэше.Это не.Я думаю, что вы хотите сделать:

if ($hashDir{$key} == 1)

или поскольку у вас уже есть значение,

if ($value == 1) 
0 голосов
/ 07 декабря 2011

Используйте значимые имена вместо $ key / $ value.

Используйте "таблицу диспетчеризации", чтобы решить, какую подпрограмму вызывать.

#!/usr/bin/perl
use warnings;
use strict;

print "Enter path to top-level directory: ";
chomp(my $basedir = <STDIN>);
chdir $basedir or die "could not cd to '$basedir' $!";

my %hashDir = (
    dirA => 1,
    dirB => 2,
    dirC => 3,
    dirD => 1,
    dirE => 2,
    dirF => 1,
);

my %dispatch = (
    1 => \&subroutine1,
    2 => \&subroutine2,
    3 => \&subroutine3,
);

my @missing;
while ( my($dir, $group) = each (%hashDir) ){
    if (-d $dir) {
        $dispatch{$group}->($dir);
    }
    else {
        push @missing, $dir;
    }
}

print 'Missing dirs: ', join(', ', @missing), "\n" if @missing;

sub subroutine1 { warn "subroutine1() got called for $_[0] directory\n" }
sub subroutine2 { warn "subroutine2() got called for $_[0] directory\n" }
sub subroutine3 { warn "subroutine3() got called for $_[0] directory\n" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...