2013-05-10 18 views
2

我试图在命令行末尾添加一个参数,通过MySQL数据库运行搜索,然后列出结果或说什么都没找到。我试图通过将查询数据保存为哈希和数组来做到这些(这些是练习,我对PERL非常陌生,脚本和尝试学习)。但是,我无法弄清楚如何使用散列做同样的事情。我希望SQL查询完成,然后将输出写入散列,以免调用While函数。任何指导将不胜感激。将Perl SQL查询的输出保存为散列而不是数组

#!/usr/bin/perl -w 
use warnings; 
use DBI; 
use Getopt::Std; 

&function1; 
&function2; 

if ($arrayvalue != 0) { 
    print "No values found for '$search'"."\n"}; 

sub function1 { 

getopt('s:'); 
$dbh = DBI->connect("dbi:mysql:dbname=database", "root", "password") 
    or die $DBI::errstr; 

$search = $opt_s; 
$sql = $dbh->selectall_arrayref(SELECT Player from Players_Sport where Sport like '$search'") 
or die $DBI::errstr; 
@array = map { $_->[0] } @$sql; 
$dbh->disconnect 
    or warn "Disconnection failed": $DBI::errstr\n"; 

} 

sub function2 { 

@array; 
$arrayvalue=(); 
print join("\n", @array, "\n"); 
if(scalar (@array) == 0) { 
    $arrayvalue = -1 
} 
    else {$arrayvalue = 0; 
}; 

} 

回答

2

请参阅并阅读关于selectall_hashref的DBI文档。它返回对散列引用散列的引用。

使用语法

$dbh->selectall_hashref($statement, $key_field[, \%attri][, @bind_values]) 

因此,这里是什么/如何将返回一个例子:

my $dbh = DBI->connect($dsn, $user, $pw) or die $DBI::errstr; 

my $href = $dbh->selectall_hashref(q/SELECT col1, col2, col3 
            FROM table/, q/col1/); 

你返回的结构将类似于:

{ 
    value1 => { 
     col1 => 'value1', 
     col2 => 'value2', 
     col3 => 'value3' 
    } 
} 

所以你可以做如下的访问哈希引用NCES:

my $href = $dbh->selectall_hashref(q/SELECT Player FROM 
             Players_Sport/, q/Player/); 

# $_ is the value of Player 
print "$_\n" for (keys %$href); 

你可以简单地做作为这样单独访问每个哈希记录:

$href->{$_}->{Player} 
+0

完美奏效,谢谢。 – user2361820 2013-05-10 04:54:46

1

documentation恶癖:

$sql = $dbh->selectall_hashef("SELECT Player from Players_Sport where Sport like ?", 'Players_Sport_pkey', $sport_like_value); 
my %hash_of_sql = %{$sql};