关联数组 - PERL

时间:2016-02-14 09:05:05

标签: arrays perl associative-array

我需要知道在Perl中创建关联数组的方法。

基本上我现在的代码实现如下:

 my $getEmployeeListOfTeamQuery  = "SELECT profiles.userid 
                                  FROM user_group_map,profiles 
                                  WHERE user_group_map.group_id = $teamId 
                                  AND profiles.userid = user_group_map.user_id 
                                  AND profiles.active = 'y' 
                                  AND profiles.login_name NOT LIKE 'qa_%' 
                                  AND profiles.disabledtext = '' 
                                  GROUP BY profiles.login_name 
                                  ORDER BY profiles.login_name";

    my $getEmployeeListOfTeam = $dbh->prepare($getEmployeeListOfTeamQuery);
    $getEmployeeListOfTeam -> execute();
    my @techs = ();

    while(my ($tech) - $getEmployeeListOfTeam->fetchrow_array) {
        push @techs,$tech;
    }

所以上面的代码将在$ getEmployeeListOfTeamQuery中进行查询,将数组名称创建为techs。

然后尝试将值推送到数组中。

这里工作正常。

我的问题是关于创建关联数组。

那就是我需要查询如下:“SELECT profiles.userid,profiles,username .....”

因此我需要创建一个关联数组,其中“userid”为键,“username”为值。

4 个答案:

答案 0 :(得分:3)

我担心你用来学习Perl的资源。自从Perl 5在二十多年前发布以来,Perl程序员还没有使用术语“关联阵列”。我们现在将这些结构称为“哈希”。如果您从使用术语“关联数组”的资源中学习,那么它们几乎肯定是过时的。

但是,回答你的问题。代码非常简单。

my $sql = 'select profiles.userid, profiles.username...';
my $sth = $dbh->prepare($sql);
$sth->execute;

my %techs_hash;
while (my @row = $sth->fetchrow_array) {
  $techs_hash{$row[0]} = $row[1];
}

答案 1 :(得分:2)

使用selectcol_arrayref()Columns属性:

my $aref = $dbh->selectcol_arrayref('select userid, login_name ...', {Columns => [1, 2]});
my %hash = @$aref;

答案 2 :(得分:0)

通过调用selectall_hashref:

,可以将所有行提取到哈希哈希值中
 my $tech=$dbh->selectall_hashref("select profile.userid, profiles.username, ...",'userid');

或者您可以使用属性为{Slice=>{}}的selectall_arrayref将所有行提取到哈希数组中:

my $tech=$dbh->selectall_arrayref("select profile.userid, profiles.username, ...",{Slice=>{}});

然后将其转换为所需的哈希值(这正是您想要的):

my $result;
$result->{$_->{userid}}=$_->{username} foreach @$tech;

答案 3 :(得分:0)

my @l;
while(my $h = $sth->fetchrow_hashref){
  push @l,$h;
}
my %hash;
map { $hash{$_->{userid}} = $_->{username} } @l;