【问题标题】:Perl - search a word and print rest of line into variablesPerl - 搜索一个单词并将其余行打印到变量中
【发布时间】:2013-05-03 05:34:56
【问题描述】:

我有一个简单的问题。如何让 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;

【问题讨论】:

    标签: perl variables search matching


    【解决方案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 可能是更好的选择。

    【讨论】:

    • 由于 smartmatch 的持续问题,它将在 5.18 中标记为实验性,这可能会导致在未来的 Perl 版本中被删除。我不会用它写新代码:-/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多