2015-04-01 57 views
-2

這是一個問題不知道在哪裏解決perl的基本

寫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. 行星或月亮的名稱[木衛十五]

  2. 月亮或行星(羅馬數字)〔XV〕的

  3. 名稱數[Jupiter]

  4. 軌道半徑(半長軸)以公里爲單位[129000]

  5. 軌道週期在天[0.30]

  6. 度[0.00]

  7. 軌道偏心[0.00]

  8. 發現者[傑威]

  9. 年份的軌道傾角發現[1979]

我的代碼是

#!/usr/bin/perl 
use warnings; 

open(FILE, "<solar.txt") or die "Can't open file, $!"; 

while(<FILE>) { 
    my $tmp = split(/ /, $file); 
    if($tmp[7] eq '-') { 
     print "@tmp"; 
    } 
} 

while(<FILE>) { 
    splice(/ /, 1, 1); 
    print "FILE\n"; 
} 

while(<FILE>) { 
    my @tmp = split(/ /, FILE); 
    if($tmp[4] < 0) { 
     print "@tmp\n"; 
    } 
} 

while(<FILE>) { 
    my @tmp = split(/ /, FILE); 
    if($tmp[7] eq 'Voyager2') { 
     print "@tmp\n"; 
    } 
} 

while(<FILE>) { 
    my @tmp = split(/ /, FILE); 
    @tmp = $tmp[4] * 24 * 60 * 60; 
    print "$tmp\n"; 
} 

close(FILE); 

,當我嘗試運行它,它說,使用未初始化值的誤差。 但我不知道在哪裏修復。請幫幫我。

+1

你需要'使用嚴格的;'你的文件 – KeepCalmAndCarryOn 2015-04-01 20:37:13

+0

頂部我試過一個,但新的錯誤出現,說裸字「文件」時不允許使用「嚴格的潛艇「在使用...... – 2015-04-01 20:42:23

+0

我使用DWIM Perl 5.14.2.1(v7)這一個。 – 2015-04-01 20:56:25

回答

1

你說:

open(FILE, "<solar.txt") or die "Can't open file, $!"; 

則:

my $tmp = split(/ /, $file); 

你有什麼期望能夠在先前未申報,未初始化$file

及更高版本:

my @tmp = split(/ /, FILE); 

在這裏,我們試圖split文件句柄。這不會做你想做的。

在這兩種情況下,您確實需要$_(在最近的<FILE>調用中讀取該行)。

所以:

my @tmp = split(/ /, $_); 

但由於(q.v.):

如果只有模式是給出EXPR默認爲$_

你可以只說:

my @tmp = split(/ /); 
+0

謝謝,我修復後,我的結果變得更好一些,但仍然有錯誤,並說在字符串eq中使用未初始化的值$ tmp [7]。你能幫我這個嗎? – 2015-04-01 20:57:18

+1

沒有看到輸入數據?不是真的。你確定你有8個項目在該陣列? ('[0..7]') – 2015-04-01 20:58:27

+0

我把太陽能txt。 – 2015-04-01 21:02:23