2012-06-21 166 views
0

所以我希望有人能解释为什么当我运行下面的代码时,它会在行的开始和结尾都打印“.link/output”。我试图只在行结束时才打印它。有什么想法吗?为什么在perl中打印两次?

#!/usr/local/bin/perl 

use warnings; 
use strict; 
my $logfiles = $ARGV[0]; #file containing the list of all the log file names 

my @logf =(); 
my $i; 

open (F2, "<", $logfiles); 

while(<F2>){ 
    @logf = $_; 
    foreach $i(@logf){ 
     print $_.".link/output"; 

    } 
} 
close F2; 

因此,举例来说,如果我读的文件是:

cat 
dog 

我想看看:

cat.link/output 
dog.link/output 

但isntead我越来越:

.link/outputcat.link/output 
.link/outputdog.link/output 

有人请向我解释为什么th正在发生和/或如何解决它?谢谢。

+3

我认为你的清单中的空元素。它将“.link/output”连接到一个空字符串。 – PinkElephantsOnParade

+0

你能确认你的'while'和'foreach'循环正在执行预期的次数吗? –

+1

为什么给数组分配一个标量,然后尝试循环数组?它只能包含一个值,所以不需要循环。而在循环中,你甚至不使用循环变量'$ i',反正你使用'$ _'。 '@logf = $ _;对于$ i(@logf){print $ _。 ......“所有这些都是完全多余的。你可能只是写'print“$ _。link/output \ n”,而' – TLP

回答

5

在列表开始处有一个空元素。只需shift @logf

+0

我应该把那条线放在哪里? – user1440061

+0

显然在印刷之前。 – m0skit0

+1

我建议在分配'@ logf'之后。此外,使其成为本地循环,因为良好的编码实践是很好的。 – HaloWebMaster

3

我没有看到@logf做什么。难道你不能这样做:

#!/usr/bin/env perl 

use warnings; 
use strict; 
my $logfiles = $ARGV[0]; #file containing the list of all the log file names 

#open(my $f2, "<", $logfiles); 

# FOR TESTING, use above in your code 
my $f2 = \*DATA; 
# =========== 

while(<$f2>){ 
     chomp; 
     print "$_.link/output\n"; 
} 
__DATA__ 
cat 
dog 
+2

+1虽然你应该说'@ logf是多余的,因为它很明显。 – TLP

+0

这有助于使我的代码更清洁,非常感谢! – user1440061

+0

我可以看到它没有做太多(除了导致问题),但我想让OP有机会说“哦,我需要Y”。 –