2013-03-24 106 views
0

我已經被賦予了一個任務。下面是說明:將文件拆分成列,過濾並打印它們

寫Perl程序來完成每個上的文件solar.txt以下的(見鏈接 類網頁)

  1. 打印不列出一個發現者所有記錄第八場。
  2. 刪除第二個字段後,打印每個記錄。注意:最好是 「打印每條記錄」省略第二個字段。
  3. 打印負軌道週期衛星的記錄。 (負的 軌道週期簡單地表示衛星沿逆時針方向運行 方向)。
  4. 打印由Voyager2空間探測器發現的對象的數據。
  5. 打印每個記錄的軌道週期以秒爲單位而不是以天爲單位。

關於solar.txt文件: 此文件包含的9項,第一個是行: 木衛十五XV木星129000 0.30 0.00 0.00傑威1979 在由行星或月亮的名稱按照字母順序(第一場)。 []中的文本是上面一行中的相應字段。

在此文件中的字段包括:

  1. 行星或月亮的名稱[木衛十五]
  2. 月亮或行星(羅馬數字)的號碼[XV]
  3. 的悲慘的名稱在其周圍衛星軌道[木星]在公里
  4. 軌道半徑(長半徑)[129000]在天
  5. 軌道週期[0.30]
  6. 軌道inclina和灰度[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 
... 
+0

沒有列出發現者的行是什麼樣的?是否有其他信息線缺失? – 2013-03-24 01:57:24

回答

0
  1. 檢查比-其他東西第八字段: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給出的近似結果可能會在容差範圍內。
+0

感謝您的幫助!爲了以防萬一,我會保持這個額外的輸入/評論。 – user2203636 2013-03-24 02:22:01

+0

@ user2203636:注意,在第二步之後,軌道週期在第四個領域,而在第五個領域不再。 – Toto 2013-03-24 09:38:12

0

你的外循環遍歷領域;它應該遍歷整行數組:

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

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

這假定你正在分割每一行;也就是說,字段之間的分隔符是空格字符。

+0

我試過了。不打印任何東西。 – user2203636 2013-03-24 02:00:50

+0

@ user2203636 - 您可以發佈文件內容的樣本嗎? – 2013-03-24 02:01:28

+0

@ user2203636 - 我又看了一遍你的程序並更新了我的答案。 – 2013-03-24 02:04:52

相關問題