嘗試:
my @header = split(/\,/,$recIn,-1);
print "Header Feed Date: $header[2]\n";
chop($header[2]);
uj5u.com熱心網友回復:
use warnings;
use strict;
use feature 'say';
my $tot = 0;
my $header = <>;
while (<>) {
$tot = (split /,/)[-1];
}
say join ',', 'FINAL', $.-1, $tot;
<>操作員在呼叫時讀取在命令列提交的檔案行。該$.變數是最后使用的檔案句柄的當前行號。
數字(及其小數位數)的格式很好地與printf.
以上處理來自檔案的資料。但是,FINAL...問題中顯示的最后一行帶有 ,確實是輸入檔案的最后一行,需要檢查。那么這也不應該被處理,所以我們需要添加一個檢查
while (<>) {
if (/^\s*FINAL/) {
my @fields = split /,/;
if ($.-1 != $fields[1] or $tot != $fields[-1]) {
warn "Wrong FINAL line: $_";
}
last;
}
$tot = (split /,/)[-1];
}
但隨后我們多次(三)次處理該行。它更好,當然也更適合檢查輸入資料,首先將split每一行放入一個陣列并使用準備好的陣列
while (<>) {
my @fields = split /,/;
# Is this the last line, with a summary to be checked?
if ($fields[0] eq 'FINAL') {
if ($.-1 != $fields[1] or $tot != $fields[-1]) {
warn "Wrong FINAL line: $_";
}
last;
}
# Validate input if/as needed
$tot = $fields[-1];
}
僅當檔案相當大或處理了許多此類檔案時,這種添加的陣列結構才能明顯(和負面地)反映效率。但是,如果確實需要檢查輸入資料的格式、有效性或以任何方式進行預處理,那么當然別無選擇。(在非常短的檔案中,這可能更有效,但很難檢測到這一點,因為它只有一行。)
如果檔案不是太大,另一種選擇是首先將所有行讀入一個陣列,剝離不需要的第一行(標題)和最后一個摘要行,然后處理其余部分
my @lines = <>;
chomp @lines;
my $header = shift @lines;
my $final = pop @lines;
foreach my $line (@lines) {
# or split into an array for checking of various fields etc
$tot = (split /,/, $line)[-1];
}
say join ',', 'FINAL', scalar @lines, $tot;
CHECK_FINAL_LINE: {
my @fields = split /,/, $final;
if ( $fields[1] != @lines or $fields[-1] != $tot ) {
warn "FINAL summary line wrong: $final";
}
};
現在我們避免檢查每一行是否是最后一行。
資料行的數量是陣列的長度@lines,當@lines陣列用于標量背景關系時產生,就像在if最后一個塊中一樣。我將檢查放在一個塊中,以避免@fields為程式的其余部分引入一個陣列(這樣它的范圍僅限于該塊),CHECK_FINAL_LINE為了方便/清晰起見,我命名了該塊。該塊不是必需的。
在列印計算出的最終結果的行中,盡管我們有一個串列背景關系,由print(等等say)強加,我們實際上需要一個顯式的scalar.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/432380.html
標籤:perl
上一篇:為什么下面的代碼中缺少哈希值
下一篇:Perl模塊安裝在錯誤的根目錄
