2013-03-15 81 views
-3

我如何循环目录中的文件,根据文件名找到文件并打印文件内容?Perl循环通过目录中的文本文件,根据文件名和打印内容找到文件

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

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 $_; 
     } 
    } 
} 
+1

请发问 – 2013-03-15 13:58:05

+3

堆栈溢出有助于规划问题阅读之前,人http://stackoverflow.com/faq。你应该自己尝试过这个,并且遇到了一个你无法解决的编程问题。我们不能期望为您免费编写代码。 – Borodin 2013-03-15 14:01:45

回答

-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>) 

然而,如前所述,这只会导致自open语句无法打开一个目录错误“上未开封的文件处理文件的ReadLine()”。

你的检查

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 

那么长的版本,给我的感觉你正在尝试做的比其他的东西是什么你的代码暗示。

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