0

嗨,朋友们现在正在使用 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";   

    }
}
4

3 回答 3

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;
于 2013-03-21T10:47:17.927 回答
0

这一行:

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

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

for(my $t=0;$t < @all_files;$t++){
于 2013-03-21T10:47:24.460 回答
0

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

于 2013-03-21T11:45:34.903 回答