0

我被分配了一项任务。以下是说明:

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

  1. 打印所有未在第八个字段中列出发现者的记录。
  2. 擦除第二个字段后打印每条记录。注意:最好说“打印每条记录”省略第二个字段。
  3. 打印具有负轨道周期的卫星的记录。(负轨道周期仅表示卫星沿逆时针方向运行。)
  4. 打印 Voyager2 太空探测器发现的物体的数据。
  5. 打印每条记录,并以秒而不是天为单位给出轨道周期。

关于 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. 发现者[杰维特]
  9. 发现年份 [1979]

我被困在第一条指令上。我可以读入“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
...
4

2 回答 2

0

您的外部循环正在遍历字段;它应该遍历整个行数组:

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

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

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

于 2013-03-24T01:58:39.143 回答
0
  1. 检查第 8 个字段是否有以下内容-if ($fields[7] ne '-') { ... }
  2. 删除第二个字段:splice(@fields, 1, 0);
  3. 检查第 5 个字段是否为负:if ($fields[4] < 0) { ... }
  4. 检查第 8 个字段Voyager2if ($fields[7] eq 'Voyager2') { ... }
  5. 不可能的。一天中的秒数对于每一天来说是不一样的。但是,由 给出的近似结果$fields[4]*24*60*60可能在公差范围内。
于 2013-03-24T02:18:26.933 回答