Похоже, вы не используете strict и warnings. Используйте их, особенно если вы не знаете Perl, вы также можете добавить diagnostics в список обязательных прагм.
Вы отслеживаете номер строки ввода в отдельной переменной $i
. Perl имеет различные встроенные переменные, зарегистрированные в perlvar. Некоторые из них, такие как $.
, очень полезны.
Вы используете my($line) = $_;
в корпусе петли while
. Вместо этого избегайте $_
и назначайте $line
непосредственно как в while (my $line = <$input>)
.
Обратите внимание, что дескрипторы дескрипторов, такие как INPUT
, являются глобальными. За исключением файла дескриптора , вам лучше использовать lexical filehandles, чтобы правильно ограничить область действия ваших дескрипторов файлов.
В ваших сообщениях укажите данные примера в разделе __DATA_
, чтобы другие могли копировать, вставлять и запускать код без дальнейшей работы.
С этими комментариями в виду, вы можете напечатать все строки, которые не начинаются с =
с помощью:
#!/usr/bin/perl
use strict; use warnings;
while (my $line = <DATA>) {
my $first_char = substr $line, 0, 1;
if ($first_char ne '=') {
print "$.:$first_char\n";
}
}
__DATA__
=
=
a
=
+
Однако, я был бы склонен писать:
while (my $line = <DATA>) {
# this will skip blank lines
if (my ($first_char) = $line =~ /^(.)/) {
print "$.:$first_char\n" unless $first_char eq '=';
}
}
'использование строгий; использовать предупреждения, 'предупреждал бы вас о таких вещах ... – Zaid
@ Zaid: Я использую strict;' но не предупреждения, так как в моих прошлых опытах они обычно не так полезны. Возможно, механизм предупреждений Perl стал менее шумным и более точным в последнее время ... – cdhowie
Я не понимаю вашу логику: вы говорите, что «предупреждения» не полезны. Тем не менее, он расскажет вам об ошибке, которую вы говорите, что вы совершаете ** ВСЕ ВРЕМЯ **. И нет, различие между 'eq' и' == 'не путает. Вы предпочли бы, чтобы Perl имел 'strcmp',' strncasecmp' и т. Д.? –