Смешивать оператор чтения файлов (< ... >
) с getc
- плохая идея.Он не делает то, что вы думаете.
Попробуйте вставить отладочный вывод в программу, чтобы увидеть, что происходит.Я протестировал программу, запустив ее на себя (./getc getc
).
В начале цикла while
<INPUT>
читает строку из вашего файла и сохраняет ее в $_
.Затем вы используете getc
, чтобы прочитать следующий символ из файла.Это будет первый символ из второй строки вашего файла (вероятно, символ новой строки - который, вероятно, будет единственным символом в этой строке).
В следующий раз при цикле, <INPUT>
читаетследующая строка ввода.Это строка use strict
.getc
читает следующий символ, который является 'u' из use warnings
.
И поэтому он продолжается до конца файла.<INPUT>
читает строку, а затем getc
читает первый символ из следующей строки.
Это совсем не то, что вам нужно.Если вы хотите прочитать символ за раз, тогда вам просто нужно getc
.
#!/usr/bin/perl
use strict;
use warnings;
my $input = shift;
open(my $file, '<', $input);
while (defined(my $c = getc $file)) {
print "$c\n";
}
Другой вариант - просто использовать < ... >
и разбивать каждую строку, когда вы ее читаете.
#!/usr/bin/perl
use strict;
use warnings;
my $input = shift;
open(my $file, '<', $input);
while (<$file>) {
foreach my $c (split //) {
print "$c\n";
}
}
Но смешивание двух подходов никогда не сработает.