2013-05-08 50 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

相关问题