1

让我们看看这段代码

1
5
9

我想要一个 perl 来检查序列号 1 到 9。如果该数字存在,它将打印该数字,否则它将打印“不存在的数字”。它是 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

You need two loops. First go through your input file and mark the found numbers in some array. Then go through your marks and print them

# 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,但是在这两个条件下,我看不出如何到达 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)。读入第二行时,脚本一起打印出 1 到 4(elsif 中没有回车),并且似乎打印出回车(我怀疑输入的是 4 而不是 5),然后是 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 回答
0

这是一种更简洁的方法:

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

我假设您不需要验证输入是否真的是一个递增的整数序列。如果这可能不是真的,那么您还需要决定要做什么 -die或者消除重复项,或者打印警告,等等。

于 2013-01-25T03:13:18.783 回答