我正在寫一個小的Perl腳本,主要是爲了學習語言。基本上它有一個動作調度表。基於用戶輸入,將調用任何一個目標動作。每一個動作都是一個小的獨立的效用函數(比如說打印時間),它可以讓我探索和學習perl的不同方面。perl foreach循環問題突圍
我遇到了調度機制的問題。該腳本以連續的循環運行,每次都會收到用戶請求的操作。該輸入與每個可用操作的正則表達式進行比較。如果匹配,則執行該操作,並跳出匹配循環以讀取用戶的下一個請求。我面臨的問題是,如果我兩次要求採取同樣的行動,那麼第二次就不會匹配。如果我在匹配後立即打印調度表,則匹配的操作條目似乎缺失。如果我連續請求相同的操作,它只能在備用調用中使用。如果我避免使用「最後的LABEL」,它的工作原理沒有任何問題。
Perl版本是5.12.4(在Fedora 15,32位上)。以下是一個簡單但完整的例子。我仍然是perl的初學者。請原諒,如果它不符合僧侶的標準:)請幫助解決這個代碼的問題。非常感謝您的幫助。
#!/bin/env perl
use strict ;
use warnings ;
use Text::ParseWords ;
my @Actions ;
my $Quit ;
sub main
{
# Dispatch table
# Each row has [syntax, help, {RegExp1 => Function1, RegExp2 => Function2,...}]
# There can be multiple RegExps depending on optional arguments in user input
@Actions =
(
['first <value>', 'Print first', {'first (.*)' => \&PrintFirst} ],
['second <value>', 'Print second', {'second (.*)' => \&PrintSecond} ],
['quit', 'Exits the script', {'quit' => \&Quit} ]
) ;
my $CommandLine ;
my @Captures ;
my $RegEx ;
my $Function ;
while(!$Quit)
{
# Get user input, repeat until there is some entry
while(!$CommandLine)
{
print "\$ " ;
my $argline = <STDIN> ;
my @args = shellwords($argline) ;
$CommandLine = join (" ", grep { length() } @args) ;
}
# Find and execute the action matching given input
# For each entry in the @Actions array
ExecAction: foreach my $Action (@Actions)
{
# For each RegExp for that action (only 1 per action in this example)
while (($RegEx, $Function) = each %{@$Action[2]})
{
if (@Captures = $CommandLine =~ m/^$RegEx$/i)
{
print "Match : $RegEx\n" ;
&$Function(@Captures) ;
last ExecAction ; # Works if this line is commented
}
}
}
$CommandLine = undef ;
}
}
sub PrintFirst { print "first $_[0]\n" ; }
sub PrintSecond { print "second $_[0]\n" ; }
sub Quit { $Quit = 1 ; }
main ;
從http://stackoverflow.com/questions/1123693/why-doesnt-perls-each-iterate-through-the-entire-hash-the-second-time也適用的答覆對你的問題。 –
謝謝。我確實在尋找類似的東西,但沒有任何運氣。 – mpathi