0

我已经为此苦苦挣扎了一段时间,我想知道我是否遗漏了一些明显的东西。

作为编程学习/实践,我正在尝试编写一个简单的脚本来计算限制酶消化混合物的成分。但是,首先我需要获得一份酶储备浓度列表。

我从 New England Biolabs酶页面中提取了所有单独的页面,我使用当前脚本的目标是提取酶的名称和公司提供的浓度。

此示例适用于 EcoRI 的本地副本(链接包含在提交的底部)。

use warnings;
use strict;
open(FILE,'productR0101.asp');
my $line;
my $counter;
my $array1;
my $array2;
my $array3;
my $concentration;
my @array4;
$counter = 1;

while ($line = <FILE>) {
    chomp($line);

    if ($counter == 6 ){
        $array1 = $line;
        $counter++;
    }
    else{
        $counter++;
    }

    if ($line =~ m/.{8}units.ml/g) {
        (@array4) =$line =~ m/.{8}units.ml/g;
        print @array4;
    }
}
print "\n".$array1;
exit;

每个文件在文件的第六行都有酶名称,所以我只拉了整行。但是,浓度在不同的位置,所以我的方法是一次读取一行文件,并匹配units/ml标签。

我的想法是它应该打印出每一行的匹配,如果有的话,每次 while 循环运行时,有效地产生一串单独的打印语句。

这就是我搞砸的地方。该文件中有六个不同的位置带有units/ml标签:三个 for20,000和三个 for 100,000

我期待打印六个不同的结果,但是当我运行它时,只100,000 units/ml返回一个结果。

我已经尝试了各种修复。我尝试连接字符串,尝试将其存储为字符串,尝试将其连接到另一个从未被该(@array4) = $line =~ m/.{8}units.ml/g行触及的数组上,它要么破坏它,要么给出相同的结果。

最后,我为任何奇怪的约定道歉。我还在学习 Perl,我的第一次编程经验是使用 MATLAB。

此外,存在$array1,$array2等是因为我试图准确跟踪放在哪里;我的目的是在我让它正常工作后清理它。

那么有人对我做错了什么有任何想法吗?

编辑:数据源是每个酶页面的源代码。对于此示例,如果您查看页面源代码,您将获得我提供给脚本的完整输入文件。

4

3 回答 3

1

20,000 units/ml在行的开头吗?因为在这种情况下,.{8}将无法匹配 - 点不匹配换行符,并且20,000_只有 7 个字符。

于 2012-08-14T21:15:48.883 回答
0

我们确实需要查看您正在处理的数据,但看起来您只存储了最后一次出现的/units.ml/in,@array4因为您正在逐行读取文件。

如果您补充您的问题,我将添加到此答案中,但现在我需要知道

  • 您的数据是什么样的

  • 神秘/.{8}/是为了什么

  • 您是否知道$array1,$array2$array3, 是标量,并且是非常糟糕的变量名称?

现在,这里是使用惯用 Perl 重写您的代码,以及$.计算为最近读取的文件的行号的变量

use strict;
use warnings;

open my $file, '<', 'productR0101.asp' or die $!;

my $array1;
my @array4;

while (my $line = <$file>) {

  chomp $line;

  $array1 = $line if $. == 6;

  if ($line =~ m/.{8}units.ml/) {
    @array4 = $line =~ m/.{8}units.ml/g;
    print "@array4\n";
  }
}

print "\n".$array1;
于 2012-08-14T21:15:24.940 回答
0

我无法完全重现您报告的仅获得 100,000 单位/毫升结果之一的行为,因为我不确定您的输入数据是什么。但是,我认为问题在于正则表达式没有任何捕获。您应该在要返回给@array4 的正则表达式匹配部分周围加上括号。所以代替这个:

@array4 = $line =~ m/.{8}units.ml/g;

试试这个:

@array4 = $line =~ m/(.{8})units.ml/g;

@array4 = $line =~ /(.{8})units.ml/;

编辑:您也不想使用 m/ 和 /g 修饰符。

于 2012-08-14T21:24:46.793 回答