2012-04-26 72 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