2012-06-21 4 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 

Не могли бы вы объяснить, почему происходит и/или как его исправить? Спасибо.

+3

Пустой элемент в вашем списке, я думаю. Он объединяет «.link/output» в пустую строку. – PinkElephantsOnParade

+0

Можете ли вы подтвердить, что ваши циклы 'while' и' foreach' выполняют ожидаемое количество раз? –

+1

Почему вы назначаете скаляр массиву, а затем пытаетесь выполнить цикл над массивом? Он может только когда-либо содержать ОДНО значение, поэтому никакой цикл в буквальном смысле не нужен. И в цикле вы даже не используете переменную цикла '$ i', вы все равно используете' $ _'. '@logf = $ _; для $ i (@logf) {print $ _. ...} 'Все это полностью избыточно. Вы могли бы просто написать 'print '$ _. Link/output \ n" while ' – 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». –

Смежные вопросы