1

このコードを見てみましょう

1
5
9

シーケンス番号 1 から 9 をチェックする perl が必要です。番号が存在する場合はその番号を出力し、そうでない場合は「存在しない番号」を出力します。for ループ内の if else の一種です。出力は次のようになります。

1
2
3
4
5
6
7
8
9

これが私の一時的なコードです

#! /usr/bin/perl -w
use strict;
while (<>){
  my ($ID) = split;
  for ($index=1; $index<=9; $index++)
  {
    if ($index == $ID)
    {
      print $ID;
      printf("\n");
    }
    elsif ($index != $ID)
    {
      print $index;
    }
    else
    {
      printf ("\n");
    }
  }
}

しかし、私の出力は

1
234567891234
56789123456789

何か案が?

4

4 に答える 4

1

内部の for ループがあるため、これらの結果が得られます。内側のループは、入力の各行の最初から実行されます。コードを少し変更しました。

use strict;
use warnings;

my $index = 1;
while ($index < 10) {
  my $ID = <DATA>;
  $ID = 10 if not defined $ID;
  chomp $ID;
  if ($ID > $index) {
    while ($index < $ID) {
      printf ("Not Found: %d\n", $index++); 
    }   
  }
  if ($index == $ID)
  {
    print "$ID\n" if $ID < 10;
  }
  $index++;
}

__DATA__
1
5
6

元のコードは次の行を読み取ります。

while (<>){
  my ($ID) = split;

次に、ループを開始します。

  for ($index=1; $index<=9; $index++)
  {

の新しい値までの数値が不足していると考えられます$ID

于 2013-01-11T05:05:29.923 に答える
0

これを行うためのより簡潔な方法を次に示します。

while (<>) {
  print "$i\n" while ++$i < $_;
  print;
}

入力が本当に増加する整数のシーケンスであるかどうかを確認する必要はないと思います。それが真実でない場合は、何をすべきかを決定する必要があります-dieまたは、重複を排除するか、警告を出力するか、その他何でも。

于 2013-01-25T03:13:18.783 に答える
0

2 つのループが必要です。最初に入力ファイルを調べて、見つかった数字をいくつかの配列でマークします。次に、マークを調べて印刷します

# mark the numbers
my @found = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
while (<>) {
    my ($ID) = split;
    $found[$ID] = 1;
}

# print the numbers
for (my $index=1; $index<=9; $index++)
{
    if ($found[$index])
    {
        print "$index\n";
    }
    else
    {
        print "$index does not exist\n";
    }
}
于 2013-01-11T09:24:36.323 に答える
0

あなたのコードでは、$ID に一致するとキャリッジ リターンが出力され、それ以外の場合は数字が出力されます。よくわかりませんが、printf が印刷前にキャリッジ リターンを出力している可能性があります。印刷と二重引用符を使用して変数を解釈します。

スクリプトの主な問題は、一致する ID をチェックするためのロジックです。インデックスに一致する場合は $ID を出力し、インデックスに一致しない場合は $index を出力しますが、これら 2 つの条件では、if ステートメントの else 部分に到達する方法がわかりません。 $ID が $index および $index と等しくない場合を除きます (これは起こりそうにありません)。if を次のように変更します。

  if ( $ID == $index ) {
    print "$ID\n";
  }
  else { 
    print "$index does not exist\n";
  }

あなたの質問がなぜその特定の出力を得ているのかに関するものだった場合、次のようになります。

スクリプトからの出力は 1 の後にキャリッジ リターンが続き、次に 2 から 9 が出力されます (elsif の ($ID != $index) 条件にキャリッジ リターン出力がないため) 次の行に読み込まれた最初の行 (入力の場合は 1)。2 行目が読み込まれると、スクリプトは 1 から 4 を一緒に出力し (elsif にキャリッジ リターンはありません)、キャリッジ リターン (5 ではなく 4 が入力されたと思われます) に続いて 5 から 9 を出力するようです。最後の行が読み込まれると、スクリプトは 1 から 8 をまとめて出力し (以前と同様)、次に 9 に続いてキャリッジ リターンを出力します。

論理を正せば、望む結果が得られるはずです。

あなたのスクリプトを出発点として使用して思いついたものは次のとおりです。

use strict;
my $ID;
my $index;
while (<>){
  my ($ID) = split;
  for ($index=1; $index<=9; $index++)
  {
    if ($index == $ID)
    {
      print "$ID\n";
    }
    else
    {
      print "$index does not exist\n";;
    }
  }
  print "\n";
}

そして、次の出力が得られます。

1
2 存在しない
3 存在しない
4 存在しない
5 存在しない
6 存在しない
7 存在しない
8 存在しない
9 存在しない

1 存在しません
2 存在しない
3 存在しない
4 存在しない
5
6 存在しない
7 存在しない
8 存在しない
9 存在しない

1 存在しません
2 存在しない
3 存在しない
4 存在しない
5 存在しない
6 存在しない
7 存在しない
8 存在しない
9

出力に期待する情報に基づいて、これが役立つことを願っています:

use strict;
my $ID;
# Initialized the index to be 1
my $index = 1;
while (<>){
  my ($ID) = split;

  while (( $ID != $index ) && 
     ( $ID < 10)) 
  {
    print "$index does not exist\n";
$index++;
  }
  print "$ID\n";
  $index++;
}

__DATA__
1
5
6

そして、私が得る出力は次のとおりです。

1
2 存在しない
3 存在しない
4 存在しない
5
6 存在しない
7 存在しない
8 存在しない
9

お役に立てれば。

于 2013-01-11T04:45:37.037 に答える