为什么第二个正则表达式“ grep(/ keyword /,@ array”)在Perl中不能使用?

里昂

我写了一个Perl程序来分析我的研究数据。
我的Perl脚本的一个功能是用来计算不同组中的原子数(我使用了两个数组@former_lists@modifier_lists标识了两个组)。

如果原子名称在group1(@former_lists)中,则变量$cnt_former_intf++;
如果在group2(@modifier_lists)中,则为变量$cnt_modf_intf++;
如果是氧原子,则$cnt_oxyg_intf++
其他{ $cnt_other_intf++}。

以下是我的代码部分。

......
my $flg_interface;
my @former_lists;
my $cnt_former_intf=0;
my $cnt_former_exbox=0;
my $cnt_modf_intf=0;
my $cnt_modf_exbox=0;
my $cnt_oxyg_intf=0;
my $cnt_oxyg_exbox=0;
my $cnt_other_intf=0;
my $cnt_other_exbox=0;
$former_lists[0]='SI';$former_lists[1]='AL';
my @modifier_lists;
$modifier_lists[0]='CA';$modifier_lists[1]='NA';
my $hash_key;
my %hash_type_spc;
$hash_type_spc{1}='SI';
$hash_type_spc{2}='AL';
$hash_type_spc{3}='CA';
$hash_type_spc{4}='O';
$hash_type_spc{5}='H';
$hash_type_spc{6}='NA';
my @atom_type;
$atom_type[1]=1;
$atom_type[2]=2;
$atom_type[3]=3;
$atom_type[4]=4;
$atom_type[5]=5;
$atom_type[6]=6;
my $atom_id;

for($atom_id=1;$atom_id<=17587;$atom_id++)
{  $hash_key=$atom_type[$atom_id];
  $_=uc($hash_type_spc{$hash_key});chomp($_);
  if ($flg_interface ==1)   #atom is in interface box
  {
    if($_ eq 'O'){$cnt_oxyg_intf++;}
    elsif($_ eq 'H'){$cnt_hydg_intf++;}
    elsif(grep(/$_/,@former_lists)  eq 1){$cnt_former_intf++;}
    #elsif(grep(/$_/,@modifier_lists) == 1){$cnt_modf_intf++;}
    elsif(grep(/$_/,@modifier_lists) eq 1){$cnt_modf_intf++;}
    else{$cnt_other_intf++;}
  }
  else                      #atom is in extended box
  {
    if($_ eq "O"){$cnt_oxyg_exbox++;}
    elsif($_ eq "H"){$cnt_hydg_exbox++;}
    elsif(grep(/$_/,@former_lists) eq 1){$cnt_former_exbox++;}
    elsif(grep(/$_/,@modifier_lists) eq 1){$cnt_modf_exbox++;}
    else{$cnt_other_exbox++;}
  }
}#end for
print "1021 $_$atom_id \t\$flg_interface=$flg_interface \t\$cnt_former_intf=$cnt_former_intf \t\$cnt_modf_intf=$cnt_modf_intf \t\$cnt_modf_intf=$cnt_modf_intf\t\$cnt_former_exbox=$cnt_former_exbox\t\$cnt_modf_exbox=$cnt_modf_exbox\n";
$tmp=<STDIN>; 

....

结果如下所示。

1021 SI6090 $flg_interface=0    $cnt_former_intf=0  $cnt_modf_intf=0    $cnt_former_exbox=0 $cnt_modf_exbox=1
1021 AL7235 $flg_interface=0    $cnt_former_intf=0  $cnt_modf_intf=0    $cnt_former_exbox=0 $cnt_modf_exbox=2
1021 CA8029 $flg_interface=0    $cnt_former_intf=0  $cnt_modf_intf=0    $cnt_former_exbox=0 $cnt_modf_exbox=3

其中1021是标签。这里,

第一输出SI6090应该具有$cnt_former_exbox=1而不是0;
第二个输出AL7235应该$cnt_former_exbox=2代替0;
第三个输出CA8029应该具有$cnt_modf_exbox=1而不是3

任何建议和帮助将不胜感激。
如果您可以分享更有效的方式,我将非常感激。

注意:我的数据是重数据。我必须考虑运行效率。

里昂

感谢大家的时间和帮助。

在线搜索后,我发现正则表达式不正确。如果我想搜索数组是否包含元素,则需要使用

            $tmp=uc($hash_type_spc{$hash_key});chomp($tmp);
            if($tmp eq 'O'){$cnt_oxyg_intf++;}
            elsif($tmp eq 'H'){$cnt_hydg_intf++;}
            #elsif($tmp eq "CA"){$cnt_modf_intf++;}
            elsif(grep { $tmp eq $_ } @former_lists){$cnt_former_intf++;}
            elsif(grep { $tmp eq $_ } @modifer_lists){$cnt_modf_intf++;}
            else{$cnt_other_intf++;}

在这里,我将$ _ = uc($ hash_type_spc {$ hash_key}); chomp($ _)修改为$ tmp = ...

如果将regex表达式更改为上述表达式,则可以得到正确的结果。但是,我不完全了解此正则表达式。任何解释将不胜感激。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

正则表达式搜索并grep字符串中第一个关键字和第二个关键字的第二次出现之间的所有内容 - Python

Perl使用正则表达式解析第二个实例

如何使用 awk 在第二个文件中输出正则表达式

为什么在Visual Studio中带有正向后视的正则表达式会导致每隔第二个匹配被替换?

正则表达式中互斥或(XOR)的第二个条件

正则表达式捕获捕获组中的第二个单词

使用正则表达式和第二个文件过滤.txt文件

使用正则表达式抓取标记后的第二个div

使用正则表达式提取找到第二个匹配项

使用正则表达式查找第二个可能的搜索组

为什么grep在使用'$'的正则表达式中需要一个点?

GNU grep&find -regex:为什么。正则表达式中需要的,为什么我不能使用POSIX字符类?

使用Perl正则表达式获取URI的第二个字符串

Java匹配正则表达式然后使用第二个正则表达式格式化字符串

使用正则表达式仅过滤Windows事件日志中的第二个帐户名

使用正则表达式查找并替换字符串中的第二个反引号

如果以非贪婪的方式使用,python 中正则表达式中的量词 {m,n} 中的第二个限制有什么用?

正则表达式中第二个捕获组的一部分

正则表达式在第二个斜杠后提取字符串并在Java中=

正则表达式更改字符串中的第二个匹配项

第二个管道运算符不适用于python中的正则表达式

如何使用正则表达式提取第二个字符串(在空格后)?

使用正则表达式获取第二个数字及其后面的单词

使用正则表达式从第二个句点到字符串结尾

如何使用正则表达式删除第二个子字符串?

grep中的正则表达式

使用grep的正则表达式

为什么此正则表达式在grep中不起作用?

正则表达式仅匹配 HTML 表中的第一个结果或第二个结果