2015-09-05 47 views
1

閱讀時,我是新來的Perl。我已經編寫了以下代碼,以與輸入相反的順序讀取文件,並將這些值輸出到命令行。

#! /usr/bin/perl 

use warnings; 
if(@ARGV == 0) 
{ 
     die "No file name given \n"; 
} 
my @argarr; 
while(@ARGV != 0) 
{ 
     my $tmp = pop @ARGV; 
     push @argarr, $tmp; 
} 
foreach(@argarr) 
{ 
     #print $_; 
     #print "\n"; 
     if (! open my $fh , "< $_") 
     { 
      print "unable to open $_\n"; 
     } 
     while(<$fh>) 
     { 
       chomp; 
       print "$_\n"; 
     } 
} 

但是它沒有按預期工作。而不是打印文件到STDOUT它顯示下面的錯誤:

Use of uninitialized value $fh in <HANDLE> at ./mtac.pl line 23. 
readline() on unopened filehandle at ./mtac.pl line 23. 

請幫助。

+0

在頂部添加'use strict;',你會得到一個關於哪裏出錯的非常清晰的提示。 –

+1

那卡萊逃避來,你會加入後'strict'編譯,是告訴你,你有一個範圍的問題之後,會顯示錯誤消息。 '$ fh'在錯誤的範圍內聲明。 –

+0

好吧,我得到了問題。我在if塊中聲明瞭$ fh,所以它在while循環中不可用。由於卡萊 –

回答

1

正如評論說,你應該總是在腳本的頂部使用use strict。它會給你提示,如果在你的腳本中變量的範圍不正確 。

這將做的工作:

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

if(@ARGV == 0) 
{ 
     die "No file name given \n"; 
} 
my @argarr = reverse @ARGV; 
foreach(@argarr) 
{ 
     my $fh; 
     unless(open $fh, '<', $_){ 
      warn "unable to open file $_ : $! \n"; 
      next; 
     } 
     while(<$fh>) 
     { 
       chomp; 
       print "$_\n"; 
     } 
close($fh); 
} 
+2

正確的地方把'我$ fh'是'foreach'循環中。這也將關閉每個新文件名的句柄。你也可以用'for(reverse @ARGV)'''擺脫'@ argarr'。 – TLP

+1

您應該解釋您認爲在您的版本中已修復的OP代碼錯誤。當他們離開的人(其他人誰到這裏來有類似問題的幫助,以及爲OP)無法爲自己做任何超出複製粘貼代碼只有代碼的解決方案從來都不是非常有用的。這是極不可能的,這將成爲很多情況下插入式規範,有的敘事作品,解釋你有固定的哪些問題,以及如何你的代碼工作是相當多的*德rigeur * – Borodin

2

$fh標量只有內部if分支

if (! open my $fh , "< $_") { .. } 

lexicaly作用域和可見您可以

open my $fh , "<", $_ or print("$! $_"), next; 

解決此210
my $ok = open my $fh , "<", $_; 
    if (!$ok) { print("$! $_"); next; } 
0

這是因爲$fh的範圍僅限於在那裏的初始化的塊。以下是我將如何重寫你的代碼:

use strict; 
use warnings; 
use v5.10; 

die "No file names given\n" unless @ARGV; 

for my $file (reverse(@ARGV)) { 
    next unless -f $file; 
    open(my $fh, '<', $file) or die "Can't open file [$file]: $!\n"; 

    while (<$fh>) { 
     chomp; 
     say; 
    } 

    close($fh); 
} 
+1

哈哈。這個答案是如何得到低估的? –