0

する任務を与えられました。手順は次のとおりです。

ファイル solar.txt で次のそれぞれを達成するための Perl プログラムを作成します (クラスのホームページのリンクを参照してください)。

  1. 8 番目のフィールドに発見者がリストされていないすべてのレコードを出力します。
  2. 2 番目のフィールドを消去した後、すべてのレコードを印刷します。注: 2 番目のフィールドを省略して、「すべてのレコードを印刷する」と言ったほうがよいでしょう。
  3. 負の軌道周期を持つ衛星の記録を印刷します。(負の軌道周期は、衛星が反時計回りに周回していることを意味します。)
  4. Voyager2 宇宙探査機によって発見されたオブジェクトのデータを出力します。
  5. 日ではなく秒で指定された軌道周期で各レコードを印刷します。

solar.txt ファイルについて: このファイルには 9 項目の行が含まれています。最初は Adrastea XV Jupiter 129000 0.30 0.00 0.00 Jewitt 1979 で、惑星または月の名前のアルファベット順です (最初のフィールド)。[] 内のテキストは、上の行の対応するフィールドです。

このファイルのフィールドは次のとおりです。

  1. 惑星や月の名前【アドラステア】
  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
  1. 8 番目のフィールドで次以外のものを確認します-if ($fields[7] ne '-') { ... }
  2. 2 番目のフィールドを削除します。splice(@fields, 1, 0);
  3. 5 番目のフィールドが負かどうかを確認します。if ($fields[4] < 0) { ... }
  4. 8 番目のフィールドで次のことを確認しますVoyager2if ($fields[7] eq 'Voyager2') { ... }
  5. 不可能。1日の秒数は毎日同じではありません。ただし、 で得られるおおよその結果$fields[4]*24*60*60は、おそらく許容範囲内です。
于 2013-03-24T02:18:26.933 に答える
0

あなたの外側のループはフィールドを繰り返しています。行の配列全体を反復処理する必要があります。

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

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

これは、各行を正しく分割していることを前提としています。つまり、フィールド間の区切り文字はスペース文字です。

于 2013-03-24T01:58:39.143 に答える