2011-12-07 2 views
-1

현재 파일의 존재 여부를 확인하는 스크립트를 여러 디렉토리에 저장하고 있습니다. 해시로 작성 중이며 동일한 서브 루틴을 수행해야하는 디렉토리에 동일한 숫자를 지정하려고합니다. 그래서 저는 값의 이름으로 부를 것입니다. 다른 말로하면, 이들 디렉토리가 값과 일치하면 같은 서브 루틴을 수행 할 것입니다. 그렇지 않으면리스트에 덤프되므로 요약에서 나중에 출력됩니다. 나는 아래 스크립트를 쓰고 있지만 mit는 값을 전혀 포착하지 못하기 때문에 올바르게 실행되지 않는 것 같습니다. 여기서 어디서 잘못 됐는지 알아? 참고 키 값이 아니라 해시 값을 호출하려고합니다.perl의 값을 호출하여 해시를 사용하는 방법

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" ; 
    } 
} 
+0

들여 쓰기도 수정했습니다. – Dan

+0

$ basedir에는 어떤 가치가 있습니까? $ buf에 어디에서 값을 할당합니까? – tadmc

답변

1

해시 요소에 액세스하는 방법을 알지 못합니다. exists $hashDir{'1'}을 수행하면 '1'이 해시의 키인지 확인하려고합니다. 그렇지 않습니다.

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

을하거나 이미 값이 있기 때문에,

if ($value == 1) 
+0

예, Perl의 초보자입니다. 아마도 if ($ hashDir {$ key} == 1)를 사용해야합니다. 나는 "exist"를 사용하여 dir을 검사하여 요약에서 해시가 아닌 것을 필터링하고 서브 루틴을 식별하는 데 키를 사용할 수 있는지 생각했습니다. 해쉬로 할 올바른 방법을 선택하고 있습니까? 감사. – Grace

+0

음, 처음에는 해시에있는 것만 가져옵니다. 그 동안 (... 각각 ...) 해시에 없으면 가져올 수 없습니다. – Dan

+0

하지만 할 일 거기에 두 번째 키를 사용하면 이미 $ value = $ hashDir {$ key}를 while (...)에 설정하고 있으므로 해시에 다시 액세스하지 않아도되므로 $ value 만 사용하면됩니다. – Dan

0

를 사용하여 의미있는 이름보다는 $ 키/$ 값 : 나는 당신이 원하는 생각합니다.

"디스패치 테이블"을 사용하여 어떤 서브 루틴을 호출할지 결정하십시오.

#!/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" } 
관련 문제