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

これは私が使用しようとしているコードです。$ chosenbeerは以前CGIページのリストの文字列です。私は選択されたビールの価格を取得しようとしています。Perlでgrepとgawkを使用する

ビールEXライン:

Dogfish Head 60 Minute IPA  35.96 

しかし、これは動作していない何らかの理由で

。どんな考え?私が$ beerpriceを印刷すると何も出てこない。

+6

'perl'は' grep'と 'awk'の両方を含んでいます。なぜあなたはどちらかを実行していますか?あなたの 'perl'スクリプトでそれを行います。 – geekosaur

+0

geekosaurは正しいですが、なぜ 'gsub'を使用しますか? 'print $ NF'で行の最後のフィールドを取得するのはどうですか? –

+1

コードに非常に大きなセキュリティホールが含まれています。 ''と呼ばれるビールを考えよう; echo "Owned"; ' – Schwern

答えて

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

今、この問題があります。 ; 私の$ chosenbeer = find_beer( "$ ' scrolling_list(\t -name => 'ビール') .... $ tempbeer =のparam( 'ビール'):私はビールを選択し、このコードを持っています でも、何も表示されません。 'print $ chosenbeer - > {price};' – hutherca

+0

@hutherca 1)厳しいと警告を出します。 )コマンドラインから動作しますか?(DEBUGGING CGI.pmドキュメントのセクションを参照)。 – Schwern

関連する問題