1

ファイルの最初の文字が等号 ( =) であるかどうかを検出し、行番号を表示する必要があります。陳述書はどのように書けばよいifですか?

$i=0;

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

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

    print OUTPUT $output;
    $i++;
}
4

3 に答える 3

10

慣用的なperlは、正規表現(^行の先頭を意味する)に加えて、「ファイル内の行」を意味する恐ろしい組み込み変数の1つを使用します。

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

perldoc-v'$'も参照してください。

于 2010-11-19T17:35:08.503 に答える
8

を使用し$findChar eq "="ます。Perlの場合:

  • ==!=は数値比較です。それらは両方のオペランドを数値に変換します。
  • eqneは文字列の比較です。両方のオペランドを文字列に変換します。

はい、これは紛らわしいです。==はい、私はいつもという意味でeq まだ書いています。はい、私の間違いを見つけるのにも永遠にかかります。

于 2010-11-19T17:34:30.017 に答える
1
  1. strictwarningsを使用していないようです。特に Perl を知らないので、必ず使用するプラグマのリストに診断を追加することもできます。

  2. 別の variable で入力行番号を追跡しています$i。Perl には、perlvarに記載されているさまざまな組み込み変数があります。これらのいくつかは、$.非常に便利です。

  3. ループmy($line) = $_;の本体で使用しています。while代わりに、のように直接に$_割り当てを避けてください。$linewhile ( 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 '=';
    }
}
于 2010-11-19T18:37:17.137 に答える