0
#!/usr/bin/perl
use strict;
use warnings;
use warnings;
use 5.010;

my @names = ("RD", "HD", "MP");
my $flag = 0;
my $filename = 'Sample.txt';

if (open(my $fh, '<', $filename))
{
    while (my $row = <$fh>) 
    {
        foreach my $i (0 .. $#names) 
        {
            if( scalar $row =~ / \G (.*?) ($names[$i]) /xg )
            {
                $flag=1;
            }
        }

    }

    if( $flag ==1)
    {
       say $filename;
    }

    $flag=0;
} 

ここでは、1 つのファイルからコンテンツを読み取り、配列値と比較します。ファイルの内容が配列値と一致する場合は、ファイルを表示するだけです。同様に、別のディレクトリから別のファイルにアクセスし、配列の値を同じものと比較するにはどうすればよいですか?

4

2 に答える 2

4

Q:別のファイルにアクセスするにはどうすればよいですか?
A:別のファイル名を指定します。


ところで、Perl でループ制御にフラグを使用している場合は、何か問題があります。これがlastループの反復であったこと (C: breakで)、またはnext反復を開始することを指定できます。ループにラベルを付けて、一度に好きなだけループから抜けることができます。

#!/usr/bin/perl
use 5.010; use warnings;

my @names = qw(RD HD MP);

# unpack command line arguments
my ($filename) = @ARGV;

open my $fh, "<", $filename or die "Oh noes, $filename is bad: $!";

LINE:
while (my $line = <$fh>) {
    NAME:
    foreach my $name (@names) {
        if ($line =~ /\Q$name\E/) { # \QUOT\E the $name to escape everything
            say "$filename contains $name";
            last LINE;
        }
    }
}

その他のハイライト:

  • foreach意図したとおりにループを使用し、
  • (このコンテキストでは)無意味な\Gアサーションを削除する

その後、スクリプトを as perl script.pl Sample.txtor perl script.pl ../another.dir/foo.baror anything として実行できます。

于 2012-11-21T13:26:32.847 に答える
0

~~ 演算子は Perl 5.10 で使用できます。末尾の空白を切り刻むことを忘れないでください。

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

my @names = ('RD', 'HD', 'MP');

my $other_dir = '/tmp';
my $filename  = 'Sample.txt';

if ( open( my $fh, '<', "$other_dir/$filename" ) ) {

    ROW:
    while ( my $row = <$fh> ) {

        chomp $row; # remove trailing \n

        if ( $row ~~ @names ) {

            say $filename;
            last ROW;
        }
    }
}

close $fh;
于 2012-11-22T21:07:03.953 に答える