【问题标题】:Print whole line that begins with specific pattern打印以特定图案开头的整行
【发布时间】:2018-05-03 05:57:31
【问题描述】:

我有一个类似 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;    
  } 
}

这行可能肯定有问题 **if (my @ids =~ my @IDS){。

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

最好的

【问题讨论】:

标签: perl


【解决方案1】:

在长长的 cmets 列表之后,开始吧!这个 sn-p 适用于您的两种情况!

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 );

【讨论】:

    【解决方案2】:

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

      if (my @ids =~ my @IDS){    
    

    因为my 声明了一个新变量,它“隐藏”了父作用域中的那个。当源和目标都是数组时应用正则表达式匹配也会以一种奇怪的方式表现 - 你一次迭代 @ids 一个元素,但你只是匹配整个事物。而且您正在与另一个数组匹配,该数组...实际上有效,但这只是因为您依赖于将数组转换为字符串并再次返回。

    使用相同名称的大写和小写变量也是一种非常糟糕的风格,并且您使用@ids@IDSIDS 这样做了3 次。

    我也真的不确定my @IDS = "ID"; 是否正在做你认为它正在做的事情,也不是一开始就试图将@IDS 视为一种模式。

    另外 - 将文件读入数组然后迭代它的效率低于仅逐行迭代文件。

    您的代码可以简化为:

    open ( my $input, '<', 'example.txt' ) or die $!; 
    while ( <$input> ) { 
       print if m/ID/;
    }
    close ( $input ); 
    

    【讨论】:

    • 亲爱的 Sobrique,感谢您抽出宝贵的时间。我以前从未使用过 Perl,也没有使用过其他编程语言,所以我没有任何经验。我不明白一件事。我的 $input 应该是一个文件处理程序;当我输入例如 id 时,这个简单脚本的输出不是我要搜索的,它不会只打印以模式 /ID/ 开头的行。我要做的是从一个看起来像我附加的链接的文件中打印出仅以 ID 开头的行(整行)和以 AC 开头的行(但不是整行,只有第一列)。谢谢!
    • 那将是一个不同的问题。我建议你这样问。
    • 是的,我会这样做的。再次感谢您!
    • @sergio:您问了第二个问题,但您在这个问题中包含了您的原始(非常损坏!)代码。让我们先解决这个问题,只有在您理解了这段代码后才能进入下一个阶段。你不明白什么?
    • @Dave Cross:谢谢戴夫。我同意。所以,正如我之前所说,我不明白的是文件句柄我的$input的作用。通过阅读不同的示例,我看到它是一个文件句柄,并且通过写入“”)。我知道文件句柄只是提到了我希望读取文件的方式(一个未定义的标量变量),所以我可以在那里放任何东西(也许我不太理解)。我使用了这个脚本并将 $input 更改为 $ids。因此,显然我在理解这个文件句柄方面存在问题。
    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多