Regex while循环中的正则表达式语句仅匹配和打印多个预期匹配中的一个

Regex while循环中的正则表达式语句仅匹配和打印多个预期匹配中的一个,regex,perl,Regex,Perl,我已经为此挣扎了一段时间,我想知道是否有什么明显的东西我错过了 作为编程学习/实践,我正在尝试编写一个简单的脚本,用于计算限制性内切酶消化混合物的成分。然而,首先我需要得到一份酶存量浓度的列表 我从新英格兰生物实验室中提取了所有单独的页面,我当前的脚本目标是从该公司提取酶的名称和浓度 本例使用EcoRI的本地副本(提交文件底部包含链接) 使用警告; 严格使用; 打开(文件'productR0101.asp'); 我的美元线; 我的美元柜台; 我的$array1; 我的$array2; 我的$ar

我已经为此挣扎了一段时间,我想知道是否有什么明显的东西我错过了

作为编程学习/实践,我正在尝试编写一个简单的脚本,用于计算限制性内切酶消化混合物的成分。然而,首先我需要得到一份酶存量浓度的列表

我从新英格兰生物实验室中提取了所有单独的页面,我当前的脚本目标是从该公司提取酶的名称和浓度

本例使用EcoRI的本地副本(提交文件底部包含链接)

使用警告;
严格使用;
打开(文件'productR0101.asp');
我的美元线;
我的美元柜台;
我的$array1;
我的$array2;
我的$array3;
我的注意力;
我的@array4;
$counter=1;
而($line=){
chomp($line);
如果($counter==6){
$array1=$line;
$counter++;
}
否则{
$counter++;
}
如果($line=~m/{8}units.ml/g){
(@array4)=$line=~m/{8}units.ml/g;
打印@array4;
}
}
打印“\n”。$array1;
出口
每个文件的第六行都有酶的名称,所以我只画了整行。但是,浓度在不同的位置,因此我的方法是一次读取一行文件,并与
units/ml
标记匹配

我的想法是,每次while循环运行时,它都应该打印出每一行的匹配项(如果有匹配项的话),从而有效地生成一个单独的打印语句字符串

这就是我被搞砸的地方。此文件中有六个不同的位置带有
单位/ml
标记:三个用于
20000
,三个用于
100000

我希望打印六个不同的结果,但当我运行此命令时,只返回一个
100000单位/ml
结果

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

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

另外,
$array1
$array2
等的存在是因为我试图准确地跟踪什么被放在哪里;我的目的是在它正常工作后将其清理干净

有人知道我做错了什么吗


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

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

如果你补充你的问题,我会补充这个答案,但现在我需要知道

  • 您的数据是什么样子的

  • 神秘的
    /.{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;
使用严格;
使用警告;

打开我的$file,行的开头是否有
20000单位/ml
?因为在这种情况下,
{8}
将无法匹配-点与换行符不匹配,
20000
只有7个字符。

我无法准确再现您报告的仅获得100000个单位/ml结果中的一个的行为,因为我不确定您的输入数据是什么。但是,我认为问题在于正则表达式没有任何捕获。您应该在正则表达式匹配中希望返回到@array4的部分周围加上括号。因此,与此相反:

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

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

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

我们需要一个数据文件的示例,请查看数据文件是原始文章中EcoRI链接的原始http文档。是的,Chris是正确的。我编辑了我的提交文件以使其更加清晰。我仍然不清楚你是在处理你提供的链接返回的HTML还是其他更简单的东西。这只是HTML。我有一个满是*.asp文件的文件夹,每个文件都是每个酶产品页面的网页。在他们的网站上没有其他地方列出每种溶液的浓度,除了他们各自的产品页面。我的目标是收集所有这些浓度,以便构建一个包含这些信息的表格。对于前四个实例,在20000单位/毫升之前有四个制表符。对于最后两个实例,20000和100000实例都被深埋在一行中,因此字符限制不应成为问题。您好,谢谢你的评论!我使用的原始数据是此页面的源代码:。我使用/{8}/是因为我试图使用“units/ml”短语作为搜索模式的锚,然后检索前面的8个字符,其中包括溶液的浓度。我知道它们是不好的变量名,但我想我忽略了它们是标量的意义。字符串不是定期存储在标量中吗?然而,您修改后的代码却完全给出了我想要的结果。非常感谢!是的,字符串存储在标量中,但是数组是标量的有序集合,我不确定您在这里想要什么。代码可能仍然是错误的。匹配
100000单位/毫升<
@array4 = $line =~ m/.{8}units.ml/g;
@array4 = $line =~ /(.{8})units.ml/;