2009-05-21 78 views
3

這是perl中的一個初學者最佳實踐問題。我是這個語言的新手。問題是:Perl:使用基於索引的方法循環輸入行

如果我想處理來自程序的輸出行,如何以特殊方式格式化第一行?

我想的兩種可能性:

1)一種標記變量,一旦執行循環第一次被設置。但它會被評估爲每個週期。 BAD解決方案

2)基於索引的循環(如「for」)。然後我會在i = 1開始循環。這個解決方案好得多。問題是我怎麼做?

我剛剛發現用while循環(<>)構造的代碼。

在這裏你可以看到更好的:

$command_string = "par-format 70j p0 s0 < " . $ARGV[0] . "|\n";                     

open DATA, $command_string or die "Couldn't execute program: $!"; 

print "\t <div>&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;|-- <strong>Description</strong></div>\n"; 
while (defined(my $line = <DATA>) ) { 
    chomp($line); 
    # print "$line\n"; 
    print "\t <div>&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;|&‎nbsp;&‎nbsp;&‎nbsp;-- " . $line . "</div>\n"; 
} 

close DATA; 

也請在這裏糾正任何代碼不要猶豫,這是我的第一個Perl的詩。

謝謝!

+0

有趣的是,用&代替   不起作用。我聞到一個錯誤是SO。 – 2009-05-21 14:38:58

+0

任何人都可以給我一個類似的TIE解決方案,我可以使用fifo! – alvatar 2009-05-21 14:45:56

+0

警告:現在有U + 200e字符來欺騙SO的格式化程序不吸吮。複製粘貼上述代碼將不太可能按預期工作,並且可能會在您的頁面上打印* literal *  : – 2009-05-21 20:10:43

回答

8

您可以隨時使用$.或英文名稱$INPUT_LINE_NUMBER與控制邏輯,你的循環:

while (my $line = <>) { 
    if ($. == 1) { 
     # do cool stuff here 
    } 
    # do normal stuff here 
} 
5

以不同方式處理的第一線,你可以只是把

$line = <DATA>; 

你的循環以上。

隨着讀的問題適當的檢查(空文件等),這應該是

if ($line = <DATA>) { 
    ...do special things... 
} 

while (my $line = <DATA>) { 
    ...do regular things... 
} 

我不知道有關defined()電話。你可能不需要它,因爲一個空字符串有一個錯誤的真值。

+0

定義的()調用是不必要的 - 請參閱「man perlop」 - Perl在添加時隱式添加它() – Alnitak 2009-05-21 14:40:54

4

從「最佳做法」的角度來看,是非常不妥的代碼示例:

open DATA, $command_string or die "Couldn't execute program: $!"; 
  • 安全漏洞請利用我。
  • DATA是一個神奇的值,指向當前文件末尾的__DATA__部分。
  • 您應該使用

    open my $fh 
    

    它採用了詞法變量的文件處理,而不是全球性的。

  • 您應該使用3精氨酸打開,即:

    open my $fh, '<' , $filename 
    open my $fh, '-|' , $command 
    open my $fh, '-|' , $command, @args 
    

    可悲的是,我還沒有制定出3 ARG如何與雙管道。 theres'這個IPC :: Open2的事情,但我還沒有制定出如何有效地使用 呢。建議歡迎。