2012-04-26 74 views
1
$chosenbeer = param('beers'); 
    $beerprice = `grep "$chosenbeer" beers | gawk '{gsub(/[a-zA-Z\t ]/,"");print $1}'`; 

這是我正在嘗試使用的代碼,$ chosenbeer是之前CGI頁面的列表的字符串。我正在嘗試選擇啤酒的價格。在Perl中使用grep和gawk

啤酒前行:

Dogfish Head 60 Minute IPA  35.96 

但出於某種原因,這是行不通的。任何想法爲什麼?當我打印$啤酒時,沒有任何東西出來。

+6

'perl'包含'grep'和'awk';你爲什麼要運行一個?在你的'perl'腳本中做。 – geekosaur 2012-04-26 03:17:03

+0

geekosaur是對的,但你爲什麼要用'gsub'?爲什麼不打印$ NF來獲得最後一個字段? – 2012-04-26 03:27:08

+1

您的代碼包含非常大的安全漏洞。考慮一個名爲''。「的啤酒; echo」Owned「;' – Schwern 2012-04-26 03:30:16

回答

9

你可以在Perl中更好地完成這個工作,而不會出現問題。應該更快,更靈活,更便攜,更容易調試,並且不包含大的安全漏洞。

sub find_beer { 
    my $beer = shift; 

    open my $fh, "beers" or die $!; 

    # Take the first beer that matches 
    my($line) = grep /\Q$beer/, <$fh>; 
    return unless $line; 

    # I'm presuming the name and price are separated by a hard tab. 
    my($name, $price) = split /\t/, $line; 

    return { name => $name, price => $price }; 
} 

my $beer = find_beer("Dogfish Head 60 Minute IPA"); 
print $beer->{price}, "\n"; 
+0

現在有這個問題,請讓我解釋一下。我有這樣的代碼選擇啤酒: 'scrolling_list(\t -name => '啤酒') .... $ tempbeer =參數( '啤酒'); 我的$ chosenbeer = find_beer(「$ );' 但是沒有任何東西出現在我做的時候 'print $ chosenbeer - > {price};' – hutherca 2012-04-26 22:49:52

+0

@hutherca 1)打開strict和warnings 2)當打印任何東西時什麼都顯示出來? )它是否可以從命令行工作(參見調試CGI.pm文檔部分)。 – Schwern 2012-04-26 23:11:23