打印以特定模式开头的整行

时间:2017-11-20 03:50:46

标签: perl

我有一个类似于http://www.uniprot.org/uniprot/?sort=score&desc=&compress=no&query=id:P01375%20OR%20id:P04626%20OR%20id:P08238%20OR%20id:P06213&format=txt

的文本文件

我必须只打印文本文件中以特定模式(ID)开头的行。

我试过这种方式,但它没有工作:

open (IDS, 'example.txt') or die "Cannot open";    
my @ids = <IDS>;    
close IDS;    
my @IDS= "ID";    
foreach my $ids (@ids) {    
  if (my @ids =~ my @IDS){    
    print $ids;    
  } 
}

这行可能一定有问题**如果(我的@ids =〜我的@IDS){。

如果有人可以帮助我,我会非常感激。

最佳

2 个答案:

答案 0 :(得分:2)

你的问题几乎可以肯定是这一行:

var viewModel = function() {
  var self = this;

  self.nValue = ko.observable(100);

  self.increment = function() {
    self.nValue(self.nValue() + 1);
  }

  self.focusOut = function() {
    alert("Focus Out");
  }
};

ko.applyBindings(new viewModel());

因为<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script> <input type="text" id="txt" data-bind="value: nValue, event: { focusout: focusOut }" /> <input type="button" id="btn" value="increment" data-bind="click: increment" />声明了一个新变量,因此隐藏了&#39;父范围中的那个。当源和目标都是数组时应用正则表达式匹配也会以一种奇怪的方式表现 - 你一次只迭代 if (my @ids =~ my @IDS){ 一个元素,但是你只是匹配了整件事情。并且你正在与另一个数组匹配,这实际上是有效的,但这只是因为你依赖于将数组转换为字符串并再次返回。

使用相同名称的大写和小写变量也是非常糟糕的风格,并且您使用my@ids和{进行了3次这样做{1}}。

我也不确定@ids正在按照您的想法行事,而且也没有尝试将@IDS视为一种模式。

此外 - 将文件读入数组然后迭代它只是逐行迭代文件效率较低。

您的代码可能简化为:

IDS

答案 1 :(得分:-1)

经过长长的评论列表,你走了!此代码段适用于您的两种情况!

use strict;
use warnings;

open ( my $input, '<', 'printLinesStartingWithID.txt' ) or die $!; 
while ( <$input> ) { 
   if(/^ID/)
   {
        print "Matched line starting with ID: $_";
   }
   if(/^AC/)
   {
        my ($secondCol) = $_ =~ /^AC...(.*?)\;/;    #The three dots is to chop off the three empty spaces followed by 'AC'.
        print "Matched line starting with AC. The second column of the line is: $secondCol \n";
   }
}
close ( $input );