-3

如何遍历目录中的文件,根据文件名定位文件并打印文件内容?

请看下面的代码: 目录中的文件:

1234.txt
345.txt
234.txt

代码:

opendir (DIR, "LOCATION")|| die "cant open directory\n";

my @DATA = grep {(!/^\./)} readdir (DIR);
while ( my $file = shift @DATA) {
    open FILE, "LOCATION";
    while (FILE){
        if ($file eq "235") {
            print $_;
        }
    }
}
4

2 回答 2

-1

这应该这样做(未经测试):

opendir( DIR, "/path/to/dir" );
while ( my $entry = readdir( DIR ) ) {
    if ( $entry =~ /^$filenameImLookingFor$/ ) {
        open( FILE, "$entry/$filenameImLookingFor" );
        my @lines = <FILE>;
        close( FILE );
        print( join( '', @lines );
    }
}
closedir( DIR );
于 2013-03-15T14:02:00.477 回答
-1

您问题中的代码:

opendir (DIR, "LOCATION")|| die "cant open directory\n";
my @DATA = grep {(!/^\./)} readdir (DIR);
while ( my $file = shift @DATA) {
    open FILE, "LOCATION";
    while (FILE){
        if ($file eq "235") {
            print $_;
        }
    }
}

会这样做:

首先,它会方便地找到目录“LOCATION”中不以句点开头的所有文件。然后它将在每个文件名上进行一个相当奇怪的循环。这个循环的正常版本是:

for my $file (@DATA)

然后它将尝试再次打开目录“LOCATION”。这可能会失败,因为“LOCATION”是一个目录。由于您不使用 来检查返回值die,因此该错误将保持沉默。

你可能想要的是使用

if ($file eq "235.txt") {
    open my $fh, "<", $file or die $!;
    print <$fh>;
}

这部分:

while (FILE)

实际上不是检查 的返回值readline(),而是检查文件句柄是否返回真值。据我所知,即使open失败,它也会返回一个真值。这当然意味着循环将无限期地运行。你的意思可能是

while (<FILE>)

但是,如前所述,这只会导致错误“readline() on unopened file handle FILE”,因为该open语句无法打开目录。

你的支票

if ($file eq "235")

永远不会是真的,因为你说你的文件名有.txt扩展名。你可能会这样做

if ($file eq "235.txt")

哪个应该工作。

如果你想聪明一点,你可以将你的检查直接包含在 grep 中:

my @files = grep { $_ eq "235.txt" } readdir DIR;

而且由于 perl 可以使用<>菱形运算符来打印数组中列出的文件@ARGV,你甚至可以这样做

@ARGV = grep { $_ eq "235.txt" } @ARGV;
print <>;

假设您使用以下命令调用脚本:

perl script.pl dir/*.txt

当然,这只是做的长版本:

perl -pe0 235.txt

哪个是长版

cat 235.txt

所以,我觉得你正在尝试做一些你的代码所暗示的事情。

于 2013-03-15T14:00:48.897 回答