在给出字符串中找到特定字符串的出现次数?

时间:2013-03-21 10:34:04

标签: regex perl

嗨朋友们现在正在使用perl我需要使用perl检查一组数组中的字符串出现!我试过很多但是我不能有人吗?

open FILE, "<", "tab_name.txt" or die $!;
my @tabName=<FILE>;
my @all_files= <*>;
foreach my $tab(@tabName){

    $_=$tab;
    my $pgr="PGR Usage";
    if(m/$pgr/)
    {

        for(my $t=0;scalar @all_files;$t++){
            my $file_name='PGR.csv';            
            $_=$all_files[$t];          
            if(m\$file_name\)
            {

                print $file_name;           
            }           
        }

        print "\n$tab\n";   

    }
}

3 个答案:

答案 0 :(得分:1)

这是一个问题:

for(my $t=0;scalar @all_files;$t++){

for循环的第二部分需要是一个条件,例如:

for(my $t=0;$t < @all_files;$t++){

您编写的代码永远不会结束。

然而,这要好得多:

foreach (@all_files){

此外,你的正则表达式有问题。正则表达式中的变量被视为正则表达式。 .是一个匹配任何内容的特殊字符。因此,您的代码将匹配PGR.csv,还会匹配PGRacsv等。它还会匹配名称中的文件名,例如FOO_PGR.csvblah。要解决这个问题:

  • 使用引号文字(\Q...\E)确保文字名称按字面意思处理。
  • 使用锚点匹配字符串的开头和结尾(^$)。

此外,反斜杠有效,但它们是一个奇怪的角色可供使用。

更正的正则表达式如下所示:

   m/^\Q$file_name\E$/

此外,您应该将它放在您编写的每个脚本的顶部:

use warnings;
use strict;

答案 1 :(得分:0)

这一行:

for(my $t=0;scalar @all_files;$t++){

产生无限循环,你最好使用:

for(my $t=0;$t < @all_files;$t++){

答案 2 :(得分:0)

除了您通过数组遇到的问题外,您还在寻找substr吗?