2012-11-29 66 views
3

我的問題有點抽象,但我會嘗試在我的聲明中清楚。 (這是一個「橡皮鴨效應」的帖子,所以我會很感激,如果只是打字出來讓我到某個地方。但是,回覆,將是輝煌!)perl代碼結構後處理

我有舊的fortran代碼, (至少現在還沒有),所以我被它的尷尬輸出困住了。

我正在使用Perl來後處理不好註釋的ascii輸出文件,正如你可能想象的那樣,它是文本和數字的非常專業的混合。 「啊,完美的perl目標,」你說。是的。但是我提出的是非常糟糕的編碼,我最近得出結論。

我的問題是關於人們喜歡用來實現這樣一個目標的通用結構。正如我所說,我不喜歡我選擇的那個。

這裏的結構的一些僞代碼,我已經得出的:

flag1 = 0; 
flag2 = 0; 
while (<INPUT>) { 
    if (cond1) { 
     do something [like parse and set a header]; 
     flag1 = 1; 
    } else { 
    next; 
    } 
    if (flag1 == 1 && cond2) { 
     do something else [like process a block of data]; 
    } else { 
    next; 
    } 
} 

上述代碼的目的是能夠打破加工成對應分區的不良ASCII文件塊 - 有通過文件中的「標籤」並不多,因此涉及條件(cond1,cond2等)。除此之外,設置標誌的目的是通過文件跟蹤代碼的進度。

它發生,我現在是一個更好的結構可能

while (<INPUT>) { 
    do stuff; 
} 

while (<INPUT>) { 
    do other stuff; 
} 

在任何情況下,如果我的散漫激發任何想法我會很感激聽他們。

謝謝

+1

您需要提供輸入格式的樣本和你期望 – jordanm

+1

感謝,jordanm,爲你的評論。理想情況下,這將是一條路,我明白這一點。我選擇了僞代碼方法,因爲我不想用特別醜陋的應用程序的細節來加重問題。我必須經常這樣做,所以我認爲抽象方法可能會產生更普遍適用的東西。感謝@DVK接受的答案,我沒有失望。這正是我所尋找的東西。 – MarkWayne

回答

3

您的原始結構非常好。你正在建立一個狀態機,並且以一種完全合理的方式來完成,而這種方式不可能變得更加習慣。

,如果你願意,你能做的唯一一件事就是模塊化的代碼一丁點兒:

our %state = (last => 0, current => 0, next => 0); 
our %extra_flags =(); 
sub cond1($line) { return $next_state } # Returns 0 if cond==false 
sub cond2($line) { return $next_state } # Returns 0 if cond==false 

our %conditions = (
    0 => \&cond1 
    1 => \&cond2 # flag1 is set 
); 

while (<INPUT>) { 
    my $state = $state->{current}; 
    if ($state->{next} = $conditions{$state}->($_, $state)) { 
     $do_stuff{$state}->{$next_state}->($line); 
     $state->{last} = $state->{current}; 
     $state->{current} = $state->{next}; 
     next; 
    } 
} 
+1

謝謝。這正是我尋找的東西。投票並接受。 – MarkWayne

1

如果該文件確實借給自己在多個循環被處理,這將是這樣做比模擬的是用條件,海事組織更清晰的方式。

如果不是,即使只有少數例外代碼,最好堅持使用您描述的原始方法。

+0

是的,我將嘗試兩種方式,並結合@DVK建議的模塊化。 – MarkWayne