2010-11-19 3 views
1

Мне нужно определить, является ли первый символ в файле равным знаком (=) и отображает номер строки. Как написать заявление if?Perl if equals sign

$i=0; 

while (<INPUT>) { 
    my($line) = $_; 
    chomp($line); 
    $findChar = substr $_, 0, 1;  

    if($findChar == "=") 
    $output = "$i\n"; 

    print OUTPUT $output; 
    $i++; 
} 

ответ

8

$findChar eq "=". In Perl:

  • == и != - числовые сравнения. Они преобразуют оба операнда в число.
  • eq и ne - сравнение строк. Они преобразуют оба операнда в строку.

Да, это сбивает с толку. Да, я все еще пишу ==, когда имею в виду eqВСЕ ВРЕМЯ. Да, я всегда нахожусь на моей ошибке.

+4

'использование строгий; использовать предупреждения, 'предупреждал бы вас о таких вещах ... – Zaid

+0

@ Zaid: Я использую strict;' но не предупреждения, так как в моих прошлых опытах они обычно не так полезны. Возможно, механизм предупреждений Perl стал менее шумным и более точным в последнее время ... – cdhowie

+7

Я не понимаю вашу логику: вы говорите, что «предупреждения» не полезны. Тем не менее, он расскажет вам об ошибке, которую вы говорите, что вы совершаете ** ВСЕ ВРЕМЯ **. И нет, различие между 'eq' и' == 'не путает. Вы предпочли бы, чтобы Perl имел 'strcmp',' strncasecmp' и т. Д.? –

10

Идиоматические Perl будет использовать регулярное выражение (^ означает начало строки) плюс один из страшных встроенных переменных, которые, случается, означает «строку в файле»:

while (<INPUT>) { 
    print "$.\n" if /^=/; 
} 

Смотрите также perldoc -v '$.'

1
  1. Похоже, вы не используете strict и warnings. Используйте их, особенно если вы не знаете Perl, вы также можете добавить diagnostics в список обязательных прагм.

  2. Вы отслеживаете номер строки ввода в отдельной переменной $i. Perl имеет различные встроенные переменные, зарегистрированные в perlvar. Некоторые из них, такие как $., очень полезны.

  3. Вы используете my($line) = $_; в корпусе петли while. Вместо этого избегайте $_ и назначайте $line непосредственно как в while (my $line = <$input>).

  4. Обратите внимание, что дескрипторы дескрипторов, такие как INPUT, являются глобальными. За исключением файла дескриптора , вам лучше использовать lexical filehandles, чтобы правильно ограничить область действия ваших дескрипторов файлов.

  5. В ваших сообщениях укажите данные примера в разделе __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 '='; 
    } 
}