不知道在哪里修复perl基本

时间:2015-04-01 20:34:46

标签: perl

这是问题

编写一个Perl程序来完成solar.txt文件中的以下每一项(见课程主页上的链接)

  1. 在第八个字段中打印未列出发现者的所有记录。

  2. 删除第二个字段后打印每条记录。注意:最好说"打印每条记录"省略第二个字段。

  3. 打印具有负轨道周期的卫星的记录。 (负轨道周期只是意味着卫星沿逆时针方向运行。)

  4. 打印Voyager2空间探测器发现的对象的数据。

  5. 以轨道周期打印每条记录,而不是几天。

  6. 关于solar.txt文件:

    此文件包含9个项目的行,第一个是:

    Adrastea XV Jupiter 129000 0.30 0.00 0.00 Jewitt 1979
    

    按行星或月亮的名称(第一个字段)按字母顺序排列。

    []中的文字是上面一行中的相应字段。

    此文件中的字段为:

    1. 行星或月球名称[Adrastea]

    2. 月球或行星的数量(罗马数字)[XV]

    3. 卫星绕轨道运行的名称[木星]

    4. 轨道半径(半长轴),以千米为单位[129000]

    5. 以天为单位的轨道周期[0.30]

    6. 轨道倾角度[0.00]

    7. 轨道偏心率[0.00]

    8. Discoverer [Jewitt]

    9. 发现年份[1979]

    10. 我的代码是

      #!/usr/bin/perl
      use warnings;
      
      open(FILE, "<solar.txt") or die "Can't open file, $!";
      
      while(<FILE>) {
          my $tmp = split(/ /, $file);
          if($tmp[7] eq '-') {
              print "@tmp";
          }
      }
      
      while(<FILE>) {
          splice(/ /, 1, 1);
          print "FILE\n";
      }
      
      while(<FILE>) {
          my @tmp = split(/ /, FILE);
          if($tmp[4] < 0) {
              print "@tmp\n";
          }
      }
      
      while(<FILE>) {
          my @tmp = split(/ /, FILE);
          if($tmp[7] eq 'Voyager2') {
              print "@tmp\n";
          }
      }
      
      while(<FILE>) {
          my @tmp = split(/ /, FILE);
          @tmp = $tmp[4] * 24 * 60 * 60;
          print "$tmp\n";
      }
      
      close(FILE);
      

      当我尝试运行它时,它表示使用未初始化的值错误。 但我不知道在哪里修理。请帮帮我。

1 个答案:

答案 0 :(得分:1)

你说:

open(FILE, "<solar.txt") or die "Can't open file, $!";

然后:

my $tmp = split(/ /, $file);

您对以前未声明的,未初始化的$file期待什么?

后来:

my @tmp = split(/ /, FILE);

这里你试图split一个文件句柄。那不是你想要的。

在这两种情况下,您确实需要$_(在最近<FILE>次来电中读取的行。)

所以:

my @tmp = split(/ /, $_);

但是(q.v.):

  

如果仅给出PATTERN,则EXPR默认为$_

你可以说:

my @tmp = split(/ /);