문제
다음 파일이 주어지면 :
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> ) 및 해시가 이미 해당 키를 가지고 있는지 확인하기 위해 추가 점검을 통해 해시를로드하기 위해 '='에서 분할을 사용했습니다.
제휴하지 않습니다 StackOverflow