2008-10-24 28 views
10

Aşağıdaki dosya verildi:Perl hash dosyasına nasıl dosya yüklerim?

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

Dosyayı bir Perl hash dosyasına yüklemek için aşağıdakileri kullanıyorum:

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

Sonuç, ancak şu şekildedir:

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

Yukarıdaki dosyayı xhx50

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

ile bir hashta yükleyebilirim.

cevap

20

gitmek:

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

Bu '=' işareti her satır bölme üzerinden yürür ve ya bir giriş ekler veya hash tablosunda mevcut bir giriş ekler.

+0

teşekkür:

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

Ve veri yapısı öylesine benziyor. Sadece takılı chomp ($ val). ÇALIŞIYOR bir cazibe gibi. :) –

+0

Windows üzerinde Perl 5.12.1 ile test ettiğimde, değerlerin her zaman bir önceki virgülü var .... Son ifadeyi tam bir koşullu olarak değiştirmem gerekiyor. –

-1

Karma girişinin varlığını kontrol etmek ve yeni değeri eklemek için harita işlevinize bir kod ekleyebilir misiniz?

Perl'i bir süredir yapmadım, ama geçmişte böyle bir şey yaptığımda, dosyayı satır satırında okurken ($ inputLine = <DOSYA>) ve '=' için bölme kullanıldı hash zaten bu tuşa sahip olup olmadığını görmek için hash yükünü ek kontrollerle yükleyin.

5

Veri dosyası üzerinde denetiminiz varsa, özel bir biçimden YAML gibi bir şeye geçiş yapmayı düşünün. Bu size özel formatınızı daha fazla kesmek zorunda kalmadan kutudan çok fazla güç sağlar. Özellikle, bir liste oluşturan çoklu tuşlar açık değildir. YAML'ın bunu yapmanın yolu daha net. YAML onlar daha kolay okunması için sıraya böylece anahtar/değer çiftlerini oymak için izin verdiğini de

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

Not.

Ve ayrıştırılacak kod, modülün en iyisi olan bir YAML::XS modülü tarafından yapılır.

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

Kod yeniden kullanmak iyi bir şeydir. –

+0

satır baskısı Damper Yükü skaler read_file (shift); şüpheli görünüyor. Eksik Doublecolon? – gorn

+0

@gorn Doğru. Damper() 'dan Veri :: Damper,' Yük() 'YAML :: XS,' scalar', File :: Slurp dosyasında yerleşik bir 'read_file()' dir. Parens ile baskı (Damper (Load (skaler) (read_file (shift))))) gibi görünüyor, bu yüzden parları bıraktım. – Schwern

İlgili konular