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 ループの 2 番目の部分は、次のような条件である必要があります。

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 に答える