2011-10-27 1 views
2

나는이 특정 코드를 사용하여 5.10 (작동과 같은 작동)을 사용하지만 5.8에서 작동하도록해야합니다. 5.8에 이것을 쓰는 또 다른 방법은 무엇입니까? 선호하는 방법/기법?5.8과 함께 사용하기 위해 perl switch-like 문을 코드하는 방법

for my $detail ($Details1, $Details2) { 
    for (keys %$detail) { 
     when ('file') { 
      print " File: $detail->{file}{path}\n"; 
      print "Bytes: $detail->{file}{size}\n"; 
     } 

     when ('directory') { 
      given (ref $result->{directory}) { 
       when ('ARRAY') { 
        for my $entry (@{$detail->{directory}}) { 
         print "Directory: $entry->{path}\n"; 
        } 
       } 
       when ('HASH') { 
        print "Directory: $detail->{directory}{path}\n"; 
       } 
      } 
     } 
    } 
} 

답변

7

는 간단하다.

for my $detail ($Details1, $Details2) { 

    for (keys %$detail) { 

     if ($_ eq 'file') { 

      print " File: $detail->{file}{path}\n"; 
      print "Bytes: $detail->{file}{size}\n"; 
     } 

     elsif ($_ eq 'directory') { 

      if (ref $result->{directory} eq 'ARRAY') { 

       for my $entry (@{$detail->{directory}}) { 
        print "Directory: $entry->{path}\n"; 
       } 
      } 

      if (ref $result->{directory} eq 'HASH') { 
       print "Directory: $detail->{directory}{path}\n"; 
      } 
     } 
    } 
} 

하지만이 경우 익명의 서브 다이얼로 디스패치 테이블로 다시 작성하고 싶습니다.

+0

감사합니다. 반환 할 데이터가없는 경우 빈 문자열에 대해'ref'도 검사 할 수 있습니까? – cjd143SD

+0

'if (! $ result -> {directory}) {...}'또는'if ($ result -> {directory}) eq '') {..}'는 빈 문자열과 일치합니다. – Zaid

3

나는 스위치가있는 코드를 대체하기에 충분할 경우 간단하다고 생각합니다.

CPAN 스위치는 원본 필터이므로 if-elsif와 비슷한 코드가 생성됩니다. 그리고 그것은 eval에서 사용할 때 약간의 제한이 있습니다 : "소스 필터가 Perl에서 작동하는 방식 때문에, 문자열 평가 안에 스위치를 사용할 수 없습니다." 그냥 if/elsif들과 함께 given/when의 교체 http://perldoc.perl.org/5.8.9/Switch.html

+0

감사합니다. 나는 if-elsif로 이것을 시도하고 둥지를 틀었다. if-elsif로 나를 보여줄 수 있습니까? – cjd143SD

+1

@cjd - elsif 시도를 게시하여 잘못된 것을 확인할 수 있도록하십시오. – DVK

2

내 개인적인 취향 for, 정규식을 사용하는 것입니다, 그리고 do 블록 :

for my $detail ($Details1, $Details2) { 
    for (keys %$detail) { 

     /^file$/ && do { 
      print " File: $detail->{file}{path}\n"; 
      print "Bytes: $detail->{file}{size}\n"; 
     }; 

     /^directory$/ && do { 

      for (ref $result->{directory}) { 

       /^ARRAY$/ && do { 
        for my $entry (@{$detail->{directory}}) { 
         print "Directory: $entry->{path}\n"; 
        } 
       }; 

       /^HASH$/ && do { 
        print "Directory: $detail->{directory}{path}\n"; 
       }; 
      } 
     }; 
    } 
} 

do 블록 후 ;을 잊지 마십시오.

편집 : 다음 케이스로 넘어 가고 싶지 않다면 next 또는 last을 사용하는 것을 잊지 마십시오.