0

我在可执行的 .pl 文件中有以下内容:

#!/usr/bin/env perl
$file = 'TfbG_peaks.txt';
open(INFO, $file) or die("Could not open file.");

foreach $line (<INFO>) {
        if ($line =~ m/[^_]*(?=_)/){
                #print $line; #this prints lines, which means there are matches
                print $1; #but this prints nothing
        }
}

根据我在http://goo.gl/YlEN7http://goo.gl/VlwKe上的阅读,print $1;应该打印每行中的第一个匹配项,但事实并非如此。帮助!

4

2 回答 2

2

不,$1应该打印由所谓的捕获组(由括号构造 - 创建( ... ))保存的字符串。例如:

if ($line =~ m/([^_]*)(?=_)/){
   print $1; 
   # now this will print something, 
   # unless string begins from an underscore 
   # (which still matches the pattern, as * is read as 'zero or more instances')
   # are you sure you don't need `+` here?
}

原始代码中的模式没有任何捕获组,这就是为什么那里$1是空的(undef准确地说是 )。并(?=...)没有计算在内,因为这些用于添加前瞻子表达式。

于 2013-05-31T23:51:01.827 回答
0

$1打印(...)模式中第一个捕获 ( ) 捕获的内容。

也许你在想

print $& if $line =~ /[^_]*(?=_)/;    # BAD

或者

print ${^MATCH} if $line =~ /[^_]*(?=_)/p;   # 5.10+

但以下会更简单(并且在 5.10 之前工作):

print $1 if $line =~ /([^_]*)_/;

^注意:如果您添加前导或(?:^|_)(以适当的为准),则当模式不匹配时,您将获得性能提升。

print $1 if $line =~ /^([^_]*)_/;
于 2013-06-01T00:37:51.397 回答