如何将数组值与不同目录中的不同文件进行比较?

时间:2012-11-21 13:00:13

标签: perl

#!/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;
} 

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

2 个答案:

答案 0 :(得分:4)

问:如何访问其他文件?
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断言

然后,您可以将脚本执行为perl script.pl Sample.txtperl script.pl ../another.dir/foo.bar或其他任何内容。

答案 1 :(得分: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;