在列中拆分文件,过滤并打印它们

时间:2013-03-24 01:50:38

标签: arrays perl split

我已经完成了一项任务。以下是说明:

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

  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. 卫星轨道[Jupiter]
    4. 周围的物种名称
    5. 轨道半径(半长轴),以千米为单位[129000]
    6. 以天为单位的轨道周期[0.30]
    7. 轨道倾角度[0.00]
    8. 轨道偏心率[0.00]
    9. Discoverer [Jewitt]
    10. 发现年份[1979]
    11. 我被困在第一条指令上。我可以在“solar.txt”文件中阅读,但之后我无法做到或无法弄明白。拆分阵列似乎是最好的选择,但目前不适合我。这是代码:

      #usr/bin/perl
      use warnings;
      use strict;
      
      open (SOLAR_FILE, "C:/perl_tests/solar.txt") or die "Could not open the file!";
      my @array = (<SOLAR_FILE>);
      close (SOLAR_FILE);
      
      for (my $i = 0; $i < 8; $i++) {
          my @tempArray = split(/ /, $array[$i]);
          if ($tempArray[$i] eq "-") {
              print "@tempArray";
          }
      }
      
      open (SOLAR_FILE, "C:/perl_tests/solar.txt") or die "Could not open the file!";
      my @array = (<SOLAR_FILE>);
      close (SOLAR_FILE);
      
      for my $record (@array) {
          my @tempArray = split(/ /, $record);
          if ($tempArray[2] eq qw(Jupiter, Uranus, Saturn, Pluto, Mars, Sun, Neptune, Earth)
          s//???/" "/g;
          #I know something goes where the (???) are, but I'm not sure how to do it.
          {
          print "@tempArray";
          }
      }
      

      另外,我不确定如何启动另一个4.如果有人能指出我正确的方向,那将会有所帮助。

      编辑:这是文件中的信息:

      Adrastea XV Jupiter 129000 0.30 0.00 0.00 Jewitt 1979
      Amalthea V Jupiter 181000 0.50 0.40 0.00 Barnard 1892
      Ananke XII Jupiter 21200000 -631 147.00 0.17 Nicholson 1951
      Ariel I Uranus 191000 2.52 0.00 0.00 Lassell 1851
      Atlas XV Saturn 138000 0.60 0.00 0.00 Terrile 1980
      Belinda XIV Uranus 75000 0.62 0.03 0.00 Voyager2 1986
      Bianca VIII Uranus 59000 0.43 0.16 0.00 Voyager2 1986
      ...
      Leda XIII Jupiter 11094000 238.72 27.00 0.15 Kowal 1974
      Lysithea X Jupiter 11720000 259.22 29.00 0.11 Nicholson 1938
      Mars IV Sun 227940000 686.98 1.85 0.09 - -
      Megaclite XIX Jupiter 23911000 ? ? ? Sheppard 2000
      Mercury I Sun 57910000 87.97 7.00 0.21 - -
      Metis XVI Jupiter 128000 0.29 0.00 0.00 Synnott 1979
      Mimas I Saturn 186000 0.94 1.53 0.02 Herschel 1789
      Miranda V Uranus 130000 1.41 4.22 0.00 Kuiper 1948
      Moon I Earth 384000 27.32 5.14 0.05 - -
      Naiad III Neptune 48000 0.29 0.00 0.00 Voyager2 1989
      Neptune VIII Sun 4504300000 60190.00 1.77 0.01 Adams 1846
      ...
      

2 个答案:

答案 0 :(得分:0)

你的外循环正在遍历字段;它应该迭代整个行数:

for my $record (@array) {
    my $tempArray = split(/ /, $record);

    if ($tempArray[7] eq "-") # test 8th field
    {
        . . .
    }
}

这假设你正确分割每一行;也就是说,字段之间的分隔符是空格字符。

答案 1 :(得分:0)

  1. 检查第8个字段,查看-以外的内容:if ($fields[7] ne '-') { ... }
  2. 删除第二个字段:splice(@fields, 1, 0);
  3. 检查第5个字段是否为:if ($fields[4] < 0) { ... }
  4. 检查Voyager2if ($fields[7] eq 'Voyager2') { ... }
  5. 的第8个字段
  6. 不可能。一天中的秒数与每天不同。但是,$fields[4]*24*60*60给出的近似结果可能在容差范围内。