Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 打印以特定图案开始的整行_Perl - Fatal编程技术网

Perl 打印以特定图案开始的整行

Perl 打印以特定图案开始的整行,perl,Perl,我有一个像这样的文本文件 我必须只打印文本文件中以特定图案(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; }

我有一个像这样的文本文件

我必须只打印文本文件中以特定图案(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;    
  } 
}
open(id,'example.txt')或die“无法打开”;
我的@ids=;
关闭ID;
我的@IDS=“ID”;
foreach my$ids(@ids){
如果(my@ids=~my@ids){
打印$id;
} 
}
如果(my@ids=~my@ids){,这一行中可能会有问题

如果有人能帮助我,我将非常感激


最好的

您的问题几乎肯定是这一行:

  if (my @ids =~ my @IDS){    
因为
my
声明了一个新变量,它“隐藏”了父范围中的变量。当源和目标都是数组时应用正则表达式匹配也会以一种奇怪的方式运行-你一次迭代
@ids
一个元素,但你只是在匹配整个元素。你在匹配另一个元素数组,它…实际上是有效的,但这仅仅是因为您依赖于将数组转换为字符串,然后再转换回来

使用相同名称的大写和小写变量也是一种非常糟糕的样式,并且使用
@ids
@ids
ids
执行了3次

我还真的不确定
my@IDS=“ID”
是否在做你认为它在做的事情,也不确定它们是否试图首先将
@IDS
视为一种模式

另外,将一个文件读入数组,然后进行迭代,这比逐行迭代文件效率要低

您的代码可以简化为:

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

open(my$input),在一长串注释之后,开始吧!这段代码适用于您的两种情况

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 );
使用严格;
使用警告;

打开(我的$input,'非常感谢您的回答,但是我必须用Perl编写一个脚本,而不是在终端中使用命令。您能看到我编写的脚本有什么问题吗?亲爱的Sobrique,感谢您花费您的时间。我以前从未使用过Perl,niether或其他编程语言,因此我没有任何经验。我不明白有一件事。我的$input应该是一个filehendler;当我键入,例如id时,这个简单脚本的输出不是我要搜索的,它不会打印以模式/id/开头的所有行。我要做的是从一个看起来像我附加到只打印行(整行)的链接的文件中打印出来以ID开头的行和以AC开头的行(但不是整行,只有第一列)。谢谢!这将是一个不同的问题。我建议你这样问。是的,我会这样做。再次感谢你!@sergio:你问了第二个问题,但包括了你的原始问题(非常糟糕!)从这个问题开始编写代码。让我们先解决这个问题,只有当你理解了这个代码后才能进入下一个阶段。你还不理解什么?@Dave Cross:谢谢Dave。我同意。所以,正如我之前所说,我不理解的是文件句柄我的$input的作用。通过阅读不同的示例,我看到它是一个文件句柄,而通过编写“”)。我知道文件句柄只是指我希望读取文件的方式(未定义的标量变量),因此我可以将任何内容放在那里(可能我不太理解)。我使用了此脚本并将$input更改为$ids。因此,显然我在理解此文件句柄时遇到了问题。