2012-10-16 20 views
-1

我有以下文件:如何僅在while循環內的文件的一行中訪問值?

10001;02/07/98;;PI;M^12/12/59^F^^SP^09/12/55 
;;;;;M1|F1|SP1;11;10;12;10;12;11;1.82;D16S539 
;;;;;M1|F1|SP1;8;8;8;8;10;8;3.45;D7S820 
;;;;;M1|F1|SP1;14;12;12;11;14;11;1.57;D13S317 
;;;;;M1|F1|SP1;12;12;13;12;13;8;3.27;D5S818 
;;;;;M1|F1|SP1;12;12;12;12;12;8;1.51;CSF1PO 
. 
. 
. 

當我運行下面的代碼,我得到印$indiv[0]一個價值爲我的文件的每一行(在這種情況下:M1M1M1M1M1M1...)。我只是想使用這些值中的一個,它可能是第一個,最後一個等等。我知道我可以在循環外部使用print $indiv[0]並獲得最後一個值,但情況並非如此,print這裏只是一個示例,我需要將該值用於循環內的其他計算。

那麼,我怎樣才能訪問只有一個值(只有一行),保持在while循環?

在此先感謝!

#!usr/bin/perl 
use warnings; 
use strict; 

my @indiv =(); 

open FILE, $ARGV[0] or die $!; 

while (<FILE>) { 
chomp; 
my @field = split /;/; 
    if ($field[0] eq '') {@indiv = split /\|/, $field[5]; 
    print $indiv[0]; 
    } 
} 
+0

太模糊了一個問題。請描述你正在努力做的更清楚! – Jean

+0

我編輯的問題,使其更清晰!謝謝。 – vitor

回答

2

只是拋出一個常用的習慣用於過濾出重複。

#!/usr/bin/perl 
use warnings; 
use strict; 

my %seen; 
while (<>) { 
    chomp; 
    my @field = split /;/; 
    if ($field[0] eq '') { 
     my ($foo) = split /\|/, $field[5]; 
     if (!$seen{$foo}++) { 
      print "$foo\n"; 
     } 
    } 
} 
+1

正如你所看到的,沒有必要明確地打開'$ ARGV [0]'! – ikegami

+0

+1那麼,直到現在我已經成爲你的粉絲:) –

+0

太棒了!但是,如果您查看示例文件,則在「$ field [5]」中,我也有「F1」和「SP1」的術語。它也可以訪問它們嗎?非常感謝你! – vitor