Perl, если знак равенства - PullRequest
1 голос
/ 19 ноября 2010

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

$i=0;

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

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

    print OUTPUT $output;
    $i++;
}

Ответы [ 3 ]

10 голосов
/ 19 ноября 2010

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

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

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

8 голосов
/ 19 ноября 2010

Используйте $findChar eq "=".В Perl:

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

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

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

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

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

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

  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 '=';
    }
}
...