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;
} 

在这里,我从一个文件中读取内容并与数组值进行比较,如果文件内容与数组值匹配,我只显示文件。以同样的方式,我如何从不同的目录访问不同的文件并将数组值与相同的值进行比较?

4

2 回答 2

4

问:如何访问不同的文件?
答:通过指定不同的文件名。


顺便说一句:如果您在 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断言

perl script.pl Sample.txt然后,您可以以或或其他方式执行脚本perl script.pl ../another.dir/foo.bar

于 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 回答