2013-06-27 3 views
4

Я пытаюсь обработать ввод символа файла на символ, но есть некоторые 1, с которых я не знаю, откуда они. Рассмотрим следующий пример:Загадочный «1» при обработке строки по-символу

Файл input

First row; 
Second row; 

Third row; 

Файл test.pl

#!/usr/bin/perl 

open FILE, "<input"; 

my @characters = split //, join //, <FILE>; 
for(@characters) { 
    print $_; 
} 

close FILE; 

Я ожидал бы этот сценарий для печати только содержание input (хотя и в довольно сложно - это просто пример). Однако, когда я бегу ./test.pl, я получаю этот выход:

First row; 
1Second row; 
1 
1Third row; 

Теперь мой вопрос: Где эти 1 символы берутся?

+0

Вы пытались запустить это в отладчике Perl? –

+0

Раньше я не знал об отладчике, но теперь это googled. Это не помогло бы мне (если я не пропущу что-то), поскольку я уже знал, в чем проблема. Спасибо хоть! –

ответ

14

join // должно быть join ''.

//, сокращенно $_ =~ m//, является оператором матча. Поскольку он успешно совпадал, он возвращал истинное значение 1.

(split особенного в том, что он рассматривает split /.../, как нечто похожее на split qr/.../.)

Кстати, всегда используйте use strict; use warnings;. Это было бы полезно здесь.

+0

Спасибо! Это было сложно - я почти сошел с ума, пытаясь понять это. И я буду добавлять 'use strict;' и 'использовать предупреждения,' сразу. –

7

Согласно perldoc для join:

Beware that unlike split, join doesn't take a pattern as its first argument.

Смотрите подробнее здесь: http://perldoc.perl.org/functions/join.html

Изменение первого аргумента буквального пустая строка "" работает, как вы ожидаете:

[[email protected] ~]$ cat test.pl 
#!/usr/bin/perl 

open FILE, "<input"; 

my @characters = split //, join "", <FILE>; 
for(@characters) { 
    print $_; 
} 

close FILE; 

[[email protected] ~]$ perl test.pl 
First row; 
Second row; 

Third row; 
+0

Спасибо. Хотел бы я принять два ответа; другой был раньше, но оба хороши по-своему! –