2013-05-08 51 views
0

我有一個簡單的問題。我如何讓perl讀取文件,搜索特定的單詞,然後如果找到匹配項,我想將行的其餘部分打印到單個變量中。Perl - 搜索一個單詞並將剩餘行打印到變量中

ASCII文件(稱爲 「region_list」 我希望搜索包含有3條線:

夏威夷40 5 -140 -180

薩摩亞-5 -25 -165 165

太平洋70 -65 290 110

這裏是我到目前爲止的代碼,但它似乎並不奏效:

#!/usr/bin/perl -w 
# 
# Required Libraries 
use Date::Calc qw(:all); 
use Date::Manip; 
use Math::Trig; 
use warnings; 
use Time::Local; 
use POSIX 'strftime'; 
use lib '/usr/bin'; 
use Cwd qw(); 

my @region = ("hawaii", "samoa", "pacific"); 

open my $listreg1, "$BIN_DIR/region_list" or die "Could not open: $!"; 

    ($reg2,$max_lat, $min_lat, $max_lon, $min_lon) = split(" ",$listreg1); 


    if ($region eq $reg2) { 
      print "LUCREG $region $reg2 $max_lat, $min_lat, $max_lon, $min_lon \n"; 
    } 



close $listreg1; 

回答

1

用Perl 5.10或更高,我們可以使用智能匹配(~~)運算符的值的存在匹配到一個數組

open my $listreg1, '<', "$BIN_DIR/region_list" or die "Could not open: $!"; 

while(my $line = <$listreg1>) { 
    chomp $line; 
    ($reg2, $max_lat, $min_lat, $max_lon, $min_lon) = split/ +/, $line; 

    if($reg2 ~~ \@region) { 
      print "LUCREG $region $reg2 $max_lat, $min_lat, $max_lon, $min_lon\n"; 
    } 
} 

close $listreg1; 

筆記,如@Joel說,該操作者smartmatch將被標記的實驗在5.18中,所以使用像List::MoreUtils這樣的CPAN模塊或簡單的grep可能是一個更好的選擇。

+1

由於smartmatch問題仍然存在,它將在5.18中標記爲實驗,這可能會導致未來的Perl版本被刪除。我不會用它寫新代碼: - / – 2013-05-09 19:53:14

相關問題