Perl从文件中获取模式

时间:2014-02-13 23:42:07

标签: perl

我想从文件info.log中提取值,并将它们与$upper中的字符串进行比较。

这是我试过的

my $upper = "S14";

open(my $file,  "<",  "info.log")  or die "Can't open info.log: $!";

my $string = $upper;

while (<$file>)  {
  if ( ! -e $string) {
    print " print here $string\n";
  }
}

我的文件看起来像这样

ss1
ss2
ss3
ss4
ss5
ss6
ss7
ss8

程序输出文件的所有内容。它应该没有打印ss4,但确实如此?

3 个答案:

答案 0 :(得分:1)

执行此操作的正确方法是:

open (FILE, "< info.log") or die "error msg";
while (<FILE>)  
{
    if (/$upper/) {
        MATCH CASE
    }
}

基本上你循环遍历文件并检查每一行。因为您正在读取文件,所以不需要变量(隐含了$ _)。在检查案件上。

答案 1 :(得分:1)

首先,您必须始终使用use strictuse warnings启动每个 Perl计划。

正如其他人所说,-e运算符表示该名称的文件是否存在。它不会检查一个字符串是否出现在另一个字符串中。

有几种方法可以做到这一点。我会使用正则表达式,但不知道你正在处理什么类型的数据,并且为了避免让你感到困惑,我已经使用index function编写了一个解决方案,如果第二个字符串出现则返回零或更多在第一个。

use strict;
use warnings

my $file = 'info.log';

my $upper = 'S14';

open my $fh, '<', $file  or die "Can't open '$file': $!";

my $string = $upper;

while (<$fh>)  {
  if (index($_, $string) >= 0) {
    print "This file contains '$string'\n";
    last;
  }
}

答案 2 :(得分:-1)

如果您只想搜索匹配项,请更快地使用grep。否则用foreach迭代。

my $upper="S14";
open(my $file,  "<",  "info.log")  or die "Can't open info.log: $!";
my $string = $upper;
my @lines = <$file>;

my @matches grep { $_ =~ /$string/ } @lines; #searching *faster

foreach (@lines) { #iterating
   chomp; #new line stuff
   if($_ =~ /^$string$/is){
      #stuff
   }
}