2013-03-24 79 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

相关问题