我想写一个脚本,它将解析一个文件,提取它可以找到的所有EC编号(酶分类代码)并打印出一个列表。 EC编号如下所示:EC 0.1.2.3或EC6.7.8.9
到目前为止,我的尝试还没有成功 - 现在它打印出文件的全部内容。
#!/usr/bin/perl
use warnings;
use strict;
use diagnostics;
open (IN,"ec.txt") or die "Can't read words file: $!";
while (<IN>) {
chomp;
$_ =~ /EC?(\d+)\s*/g;
print("$_ \n");
}
答案 0 :(得分:2)
无论匹配是否成功,都打印$_
(整行)。
此外,正则表达式仅匹配EC
或E
之后的数字,您不会处理这些点。将/g
与单个匹配结合使用也很奇怪 - 它通常用于列表上下文或while条件。
#!/usr/bin/perl
use warnings;
use strict;
while (<DATA>) {
print "$1.\n" while /EC?\s*([\d.]+)/g;
}
__DATA__
EC 0.1.2.3
EC6.7.8.9
EC 1.2.3 EC4.56.78
如果C
不可选,请删除问号。
答案 1 :(得分:0)
你应该改变
$_ =~ /EC?(\d+)\s*/g;
print("$_ \n");
到
while (/EC\s*((\d+)([.]\d+)){3}/g) {
print ($1\n);
}
正则表达式允许EC和数字 - 点 - 模式之间的空白字符,然后搜索由三个点分隔的四个数字序列。 while迭代所有匹配并在一行上打印每个匹配,而没有&#34; EC&#34;。
答案 2 :(得分:-3)
不要打印$_
。这就是整条路线。请改为打印$1
。这是parens ()
中的匹配。
试试/EC\s*([0-9.]+)/
。 \d
只是数字,而不是点数。你也在寻找点,所以[0-9.]+
就可以了。