如何通过调用perl中的值来使用哈希值

时间:2011-12-07 06:20:25

标签: perl

我正在编写一个脚本来检查文件是否存在于多个目录中。我正在写哈希并计划为那些需要执行相同子程序的目录分配相同的数字。因此,我将通过值名称来调用。换句话说,那些匹配该值的目录将执行相同的子例程,否则它将被转储到列表中,以便稍后将其打印出来。我正在编写如下脚本,但它似乎无法正常执行,因为mit似乎根本没有捕获值。我可以知道这里出了什么问题吗?注意我想按值调用哈希,但不是键。

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 个答案:

答案 0 :(得分:1)

我认为您不了解如何访问哈希中的元素。当您exists $hashDir{'1'}时,您正在查看'1'是否是哈希中的键。它不是。我想你想做的事:

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

或者因为你已经拥有了这个值,

if ($value == 1) 

答案 1 :(得分:0)

使用有意义的名称而不是$ 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" }