Почему второе регулярное выражение "grep (/ keyword /, @ array" не работает при использовании в Perl? - PullRequest
0 голосов
/ 14 января 2019

Я написал программу на Perl для анализа моих исследований.
Одна функция моих Perl-скриптов используется для подсчета числа атомов в разных группах (я использовал два массива @former_lists и @modifier_lists для идентификации двух групп).

Если имя атома находится в group1 (@former_lists), то переменная $cnt_former_intf++;
если он находится в группе 2 (@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 - метка. Здесь

1-й выход SI6090 должен иметь $cnt_former_exbox=1 вместо 0;
2-й выход AL7235 должен иметь $cnt_former_exbox=2 вместо 0;
3-й выход CA8029 должен иметь $cnt_modf_exbox=1 вместо 3.

Любые предложения и помощь будут высоко оценены.
Я высоко ценю, если вы можете поделиться более эффективным способом.

ПРИМЕЧАНИЕ. Мои данные - тяжелые данные. Я должен рассмотреть эффективность бега.

1 Ответ

0 голосов
/ 14 января 2019

Спасибо всем за время и помощь.

После поиска в Интернете я обнаружил, что выражение регулярного выражения неверно. Если я хочу узнать, есть ли в массиве элемент, мне нужно использовать

            $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 = ...

Если выражение регулярного выражения изменено на выше, я могу получить правильный результат. Однако я не совсем понимаю это выражение регулярного выражения. Любое объяснение будет высоко оценено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...