【问题标题】:Perl While Loop/print only specific data/ uninitialized valuePerl While 循环/仅打印特定数据/未初始化的值
【发布时间】:2015-12-17 05:00:17
【问题描述】:

大家好,我的作业是"Print all records that do not list a discoverer in the eighth field."

我们得到一个包含此信息的文件:这是我的一些信息的样子:

Umbriel II Uranus 266000 4.14 0.00 0.00 Lassell 1851
Uranus VII Sun 2870990000 30685.00 0.77 0.05 Herschel 1781
Venus II Sun 108200000 224.70 3.39 0.01 - -

到目前为止,这是我的代码:

#!/usr/bin/perl
use warnings; 
use strict;

while (my $line = <STDIN>) {
     my @field = split(/\s+/, $line);
     my $discover = $field[7];
     if ($discover eq '- -') {
         print "\$discover\n";
     }
}

我收到此错误:

Use of uninitialized value $discover in string eq at ./ss123 line 7, <STDIN> line 2.

我不确定我做错了什么,我们将不胜感激,谢谢。

【问题讨论】:

  • 您的第 12 行有错字。它应该是my $discover = $field[8];(这一行还有另一个错误)。也就是说,该程序将无法使用该修复程序。你应该阅读更多关于编程的内容。例如在这里寻找数组:tutorialspoint.com/perl/perl_arrays.htm。还要想想当你做分配时$nfield 会是什么。你为什么这样做? if 语句的用途是什么,为什么它不起作用?
  • 我已将其更改为:while (my $line = ) { my @field = split(/\s+/, $line);我的 $field = @field;我的 $discover = $field[8]; if ($discover == "- -");打印 "\$discover\n";我正在使用if 语句,因为如果第八个字段没有任何内容,那么将打印这些内容。 @bolav
  • 请创建一个minimal reproducible example。描述你的测试数据是不够的;如果您希望收到高质量的答案,我们需要实际看到它。此外,第八个字段将是数组索引 7,因为 Perl 数组是 0 索引的。而且,这将是了解字符串与数字 comparison operators 的好时机。
  • 你认为my $field = @field; 是做什么的? (提示:它在您的程序中没有任何用处。)您是否使用了正确的比较运算符? (提示:去了解==eq 之间的区别。)你读过Perl 的if 修饰符或if 语句的语法规则吗? (提示:你应该这样做;你所拥有的不是任何一个,而是导致语法错误。)
  • 您可以删除 'use strict' 和 while 循环之间的所有内容。无论如何,您都在重新声明这些变量,以及 行。此外,您可能会遇到这些错误,因为您的行没有至少 8 个字段。

标签: perl


【解决方案1】:

如果您正确搜索非值,这很简单。由于您在空格上进行拆分,因此您永远不会将 - - 作为结果数组的单个元素。在下面的代码中,我将 Data::Dumper 缩进级别增加到 3,这会在每个元素旁边显示数组索引(有助于调试)。

use strict;
use warnings;
use Data::Dumper;

$Data::Dumper::Indent = 3;

while (<DATA>) {
    my @fields = split;

    if ($fields[7] eq '-') {
        print Dumper(\@fields);
    }
}

__DATA__
Umbriel II Uranus 266000 4.14 0.00 0.00 Lassell 1851
Uranus VII Sun 2870990000 30685.00 0.77 0.05 Herschel 1781
Venus II Sun 108200000 224.70 3.39 0.01 - -

输出:

$VAR1 = [
          #0
          'Venus',
          #1
          'II',
          #2
          'Sun',
          #3
          '108200000',
          #4
          '224.70',
          #5
          '3.39',
          #6
          '0.01',
          #7
          '-',
          #8
          '-'
        ];

【讨论】:

    猜你喜欢
    • 2016-05-29
    • 2022-06-27
    • 2015-10-10
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多