2008-10-24 6 views
10

파일을 Perl 해시에로드하려면 어떻게해야합니까?

department=value1 
location=valueA 
location=valueB 
department=value2 

파일을 Perl 해시로로드하려면 다음을 사용하십시오.

use File::Slurp; 
use Data::Dumper; 
my %hash = map { 
    s/#.*//; 
    s/^\s+//; 
    s/\s+$//; 
    m/(.*?)\s*=\s*(.*)/; 
} read_file($file); 
print Dumper(\%hash); 

결과는 다음과 같습니다.

$VAR1 = { 
      'location' => 'valueB', 
      'department' => 'value2' 
     }; 

위의 파일을

$VAR1 = { 
      'location' => 'valueA,valueB', 
      'department' => 'value1,value2' 
     }; 

와 해시에로드 할 수 있습니까?

답변

20

당신은 이동 :

my %hash; 
while (<FILE>) 
{ 
    chomp; 
    my ($key, $val) = split /=/; 
    $hash{$key} .= exists $hash{$key} ? ",$val" : $val; 
} 

이것은 '='기호에 모든 행 분할을 통해 산책 및 중 하나는 항목을 추가 또는 해시 테이블의 기존 항목에 추가합니다.

+0

감사 :

use File::Slurp; use YAML::XS; use Data::Dumper; print Dumper Load scalar read_file(shift); 

는 데이터 구조는 너무 것 같습니다. 방금 삽입 된 chomp ($ val). 매력처럼 작동합니다. :) –

+0

Perl 5.12.1을 사용하여 Windows에서 테스트 할 때 값에 항상 앞의 쉼표가 표시됩니다. 마지막 문을 완전한 if-conditional로 변경해야합니다. –

-1

지도 기능에 해시 항목이 있는지 확인하고 새 값을 추가 할 수있는 코드를 추가 할 수 있습니까?

필자는 Perl을 한동안 사용하지 않았지만 과거에 이와 같은 작업을 수행했을 때 한 줄씩 ($ inputLine = <FILE>) '='을 (를) 사용하여 파일을 읽었습니다. 추가 검사를 통해 해시를로드하여 이미 해시에 해당 키가 있는지 확인하고 항목이 이미있는 경우 추가합니다.

5

데이터 파일을 제어 할 수 있다면 사용자 지정 형식에서 YAML로 전환하는 것이 좋습니다. 이렇게하면 더 많은 사용자 정의 형식을 해킹 할 필요없이 상자에서 많은 힘을 얻을 수 있습니다. 특히 목록을 만드는 여러 개의 키가 명확하지 않습니다. YAML의 방법은 훨씬 명확합니다.

name:  Wally Jones 
department: [foo, bar] 
location: [baz, biff] 

또한 YAML을 사용하면 키/값 쌍을 조각하여 더 쉽게 읽을 수 있도록 정렬 할 수 있습니다.

그리고 코드를 분석하는 코드는 모듈의 YAML::XS이 가장 좋습니다.

$VAR1 = { 
      'department' => [ 
          'foo', 
          'bar' 
          ], 
      'location' => [ 
          'baz', 
          'biff' 
         ], 
      'name' => 'Wally Jones' 
     }; 
+0

코드 재사용은 좋은 일입니다. –

+0

라인 인쇄 Dumper Load 스칼라 read_file (shift); 의심스러운 것으로 보입니다. 누락 된 더블 콜론? – gorn

+0

@gorn 맞습니다. Data :: Dumper의'Dumper()', YAML :: XS의'Load()','scalar'는 File :: Slurp의 빌트인과'read_file()'입니다. 괄호로'print (Dumper (Load (scalar (read_file (shift))))')와 같이 보입니다. 그래서 나는 괄호를 그만 두었습니다. – Schwern

관련 문제