문제

다음 파일이 주어지면 :

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'
        };

감사.

도움이 되었습니까?

해결책

여기에 간다 :

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

이렇게하면 '='부호의 모든 라인 분할을 통과하고 해시 테이블의 기존 항목에 항목을 추가하거나 추가됩니다.

다른 팁

데이터 파일을 제어 할 수있는 경우 사용자 정의 형식에서 Yaml과 같은 형식으로 전환하는 것이 좋습니다. 이렇게하면 사용자 정의 형식을 점점 더 해킹하지 않고도 많은 전원이 공급됩니다. 특히, 목록을 만드는 여러 키는 불쾌하지 않습니다. Yaml의 방식은 훨씬 더 명확합니다.

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

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

그리고 구문 분석 코드는 모듈에 의해 수행됩니다. Yaml :: xs 무리의 최고입니다.

use File::Slurp;
use YAML::XS;
use Data::Dumper;

print Dumper Load scalar read_file(shift);

그리고 데이터 구조는 다음과 같습니다.

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

해시 항목의 존재를 확인하고 새 값을 추가하기 위해지도 함수에 코드를 추가 할 수 있습니까?

나는 한동안 Perl을하지 않았지만 과거에 이런 일을했을 때 파일을 한 줄로 읽었습니다 ($ inputline =u003CFILE> ) 및 해시가 이미 해당 키를 가지고 있는지 확인하기 위해 추가 점검을 통해 해시를로드하기 위해 '='에서 분할을 사용했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top