2008-10-24 31 views
10

Với các tập tin sau đây:Làm cách nào để tải tệp vào một hàm băm Perl?

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

tôi sử dụng sau đây để tải các tập tin vào một băm Perl:

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

Kết quả, tuy nhiên được quy định như sau:

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

Làm cách nào tôi có thể tải tệp ở trên vào một băm bằng, ví dụ:

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

Cảm ơn.

Trả lời

20

Ở đây bạn đi:

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

này đi qua từng tách dòng vào dấu '=' và hoặc thêm một mục hoặc gắn thêm một mục nhập hiện có trong bảng băm.

+0

Cảm ơn. Chỉ cần chèn chomp ($ val). Làm việc như một say mê. :) –

+0

Khi tôi thử nghiệm trên Windows với Perl 5.12.1, các giá trị luôn luôn có dấu phẩy trước .... Tôi phải thay đổi câu lệnh cuối thành một điều kiện đầy đủ nếu có điều kiện. –

-1

Bạn có thể thêm một số mã vào chức năng bản đồ của mình để kiểm tra sự tồn tại của mục nhập băm và nối thêm giá trị mới không?

Tôi đã không thực hiện Perl trong một thời gian, nhưng khi tôi đã làm một cái gì đó như thế này trong quá khứ, tôi đọc tệp theo từng dòng (trong khi $ inputLine = <FILE>) và sử dụng chia thành '=' để nạp băm với các kiểm tra bổ sung để xem nếu băm đã có khóa đó, phụ thêm nếu mục nhập đã tồn tại.

5

Nếu bạn có quyền kiểm soát tệp dữ liệu, hãy xem xét chuyển từ định dạng tùy chỉnh thành một dạng như YAML. Điều này mang lại cho bạn rất nhiều sức mạnh ra khỏi hộp mà không cần phải hack định dạng tùy chỉnh của bạn nhiều hơn và nhiều hơn nữa. Đặc biệt, nhiều khóa tạo danh sách không rõ ràng. Cách làm của YAML là rõ ràng hơn nhiều.

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

Cũng lưu ý rằng YAML cho phép bạn vẽ các cặp khóa/giá trị để chúng xếp hàng để dễ đọc hơn.

Và mã để phân tích cú pháp nó được thực hiện bởi một mô-đun, YAML::XS là tốt nhất của nhóm.

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

print Dumper Load scalar read_file(shift); 

Và cấu trúc dữ liệu trông giống như vậy:

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

Sử dụng lại mã là một điều tốt. –

+0

dòng in Dumper Load scalar read_file (shift); có vẻ đáng ngờ. Thiếu doublecolon? – gorn

+0

@gorn Đó là chính xác. 'Dumper()' từ dữ liệu :: Dumper, 'Load()' từ YAML :: XS, 'scalar' được xây dựng và' read_file() 'từ File :: Slurp. Với parens nó trông giống như 'print (Dumper (Load (vô hướng (read_file (shift)))))' đó là lý do tại sao tôi rời khỏi parens. – Schwern

Các vấn đề liên quan