2016-04-14 11 views
-3

alınırken, bir karma ve bölünme dosyayı okuma:Perl: Böyle veri içeren bir dosya var bilgi

1  unknown state 3204563 3207049 . - . name "gosford"; school_name "gosford"; pupil_id "P15240"; transcript_id "NM_001011874.1"; tss_id "TSS13146"; 

Bir karma içine satır satır okumak istiyorum ve sonra düzenli ile bölmek ifade. . Ben karma ayrılır ettik değerleri nasıl alabilirim

my$schools; 
open (SCHOOLS, <"$schools) or die (Cannot open $schools"); 
while <SCHOOLS> { 
chomp; 
my ($val, $key) = split /(^\d)\s+\w+\s+\W+\s+\d+\s+\d+\s+\d+\.\s+\+\s+\.\s+.. and so on); 
} 

ve sonra onları çok temel bazı istatistikleri üretmek manipüle i okulların sayısını böylece]

şimdiye kadar sahip olduğum ?

+0

Beklenen çıktınız nedir? – toolic

+0

Terminalde gösterilen okul sayısını sayma. – SaltedPork

+0

'split' öğesini kaldır. Buradaki maçı kullanıyorsun, bölme değil. Bundan sonra '()' ile ilgilendiğiniz grupları edinin. –

cevap

1

Neyin peşinde olduğunuz belli değil, ama sunacağım - çizgiyi eşleştirmek için uzun bir regex kullanarak işleri zor yoldan yapıyorsunuz. Ayrıca, 'diğer şeyler' için aklında ne olduğunu tam olarak söylemek çok zor. Ama grep sizin arkadaşınızdır, arama terimlerini belirtmenize izin verir.

Böyle bir şey işe yaramaz. Belirli bir ölçütle eşleşen girdileri saymak için basit bir örnek kullandım. - bu açık 3 arg ile sözcük filehandles kullanmak çok daha iyi form

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Data::Dumper; 

my @entries; 
my @keys = qw (id thing state firstnum secondnum); 

while (<DATA>) { 
    my %attributes = m/(\w+) "(\w+)"/g; 
    @attributes{@keys} = split;  
    push @entries, \%attributes; 
} 

print Dumper \@entries; 

print "count of things: ", scalar @entries, "\n"; 
print "There are ", (scalar grep { $_ -> {state} eq "state" } @entries), " things with a state of 'state'\n"; 

__DATA__ 
1  unknown state 3204563 3207049 . - . name "gosford"; school_name "gosford"; pupil_id "P15240"; transcript_id "NM_001011874.1"; tss_id "TSS13146"; 

Ben de işaret edeceğiz: Eğer sadece bize bir satır verdik Elbette verilen bu bir tahmin bir parçasıdır. Örneğin.

open (my $schools, '<', 'schools.txt') or die $!; 
while (<$schools>) { 
    #etc. 
} 

Ben gösterim amaçlı özel dosya tanıtıcısından __DATA__ kullanıyorum.

İlgili konular