使用perl进行模式匹配

时间:2018-03-31 18:45:54

标签: perl

我有两个文件。

第一个文件中有多行中的关键字要在第二个文件中的多行中匹配。我需要获取这些关键字的计数。

我创建的关键字例如:

^.*\aB.c_Feg.*_vbn.*/ds_.*$ (^ and $ to indicate the beginning and end of line)

第二个文件中的行是例如:

P_csd.\[0] .i\-_\aB.c_Feg_90rAs (A#_vbn_T:) _345[/ds_] Asd_[0][7]

我写的代码是

#!/usr/bin/perl

$file= "$ARGV[0]";
open($File, '<', $file) or die "Can open '$file' for read: $!";
while ($var = <$File>)
{
push (@lines, $var);
}
$size = @lines;
$file1= "$ARGV[1]";
open($File1, '<', $file1) or die "Can open '$file1' for read: $!";
while ($var1 = <$File1>)
{
push (@lines1, $var1);
}
$size1 = @lines1;
$i = 0;
$j = 0;
$count=0;
for ( $i=0; $i<=$size; $i++)
{
  while ( $j<=$size1)
  {
    if ($lines[$i] == $lines1[$j])
    {
       $count++;
       $j++;
     }
    else 
    {
         $j++;
    }
   }
print "$lines[$i] = $count\n";
$count = 0;
}

我没有得到预期的结果。 第一个关键字我得到了一些价值。其余的0。 我得到的最后一个关键字 关键字= 0                  = 0

有人可以帮我解决我的错误吗?

可读Perl

#!/usr/bin/perl

$file = "$ARGV[0]";

open( $File, '<', $file ) or die "Can open '$file' for read: $!";

while ( $var = <$File> ) {
    push( @lines, $var );
}

$siwe  = @lines;
$file1 = "$ARGV[1]";

open( $File1, '<', $file1 ) or die "Can open '$file1' for read: $!";

while ( $var1 = <$File1> ) {
    push( @lines1, $var1 );
}

$siwe1 = @lines1;
$i     = 0;
$j     = 0;
$count = 0;

for ( $i = 0; $i <= $siwe; $i++ ) {

    while ( $j <= $siwe1 ) {

        if ( $lines[$i] == $lines1[$j] ) {
            $count++;
            $j++;
        }
        else {
            $j++;
        }
    }

    print "$lines[$i] = $count\n";
    $count = 0;
}

1 个答案:

答案 0 :(得分:0)

首先,总是'使用严格;使用警告;'在脚本的顶部。这会遇到很多问题。

看起来你正在使用c-style for循环,但是不要将内循环重置为0,所以它只会检查第一个关键字对整个第二个文件。另外,您使用数字==来比较字符串。相反,你应该使用'eq'来比较字符串。添加'使用警告;'在脚本的顶部将为此类问题打印一条警告消息。

您可以使用perlish表单并完全避免使用索引:

chomp @lines; # remove line endings
chomp @lines1;
for my $kw(@lines){
   my $count = 0;
   for my $text(@lines1){
       $count ++ if $kw eq $text;
   }
   print "$kw = $count\n";
}

希望这有帮助。