Как создать 2-мерный ассоциативный массив в Perl - PullRequest
0 голосов
/ 18 января 2012

Пример в PHP, но я хочу создать такой же ассоциативный 2d массив в perl и как распечатать этот массив.EX в PHP: -

while($row=mysql_fetch_array($rc))
{
    $associative_array[$ClientCode]=array('PartnerCode'=>$row["PartnerCode"],
                                'OldPartnerCode'=>$row["OldPartnerCode"],
                                'ClientCode'=>$ClientCode,
                                'OldClientCode'=> $row["OldClientCode"]);
}

Добавление комментария OP:

Если создание двумерного массива правильное, то как печатать этот массив.

$sql_sel="select client_id,partner_id,client_code,partner_code from $tblname"; 
$sth = $dbh->prepare($sql_sel); 
$sth->execute(); 
$nrow=$sth->rows; 
while( ($ccode,$pcode,$old_ccode,$old_pcode) = $sth->fetchrow_array) { 
    $ccode =~ y/A-Z/a-z/; 
    $pcode =~ y/A-Z/a-z/; 
    $old_ccode =~ y/A-Z/a-z/; 
    $old_pcode =~ y/A-Z/a-z/; 
    $client_partner_hash->{$ccode}={
        'newclinetcode'=>$ccode, 
        'newpartnercode'=>$pcode, 
        'oldclinetcode'=>$old_ccode,
        'oldpartnercode'=>$old_pcode
    }; 
}

Ответы [ 4 ]

1 голос
/ 18 января 2012

Вот прямой перевод PHP-кода, который вы разместили.Это не так уж и отличается.:)

while (my $row = mysql_fetch_array($rc)) {
    $associative_array->{$ClientCode} = {
        'PartnerCode'    => $row->{'PartnerCode'},
        'OldPartnerCode' => $row->{'OldPartnerCode'},
        'ClientCode'     => $ClientCode,
        'OldClientCode'  => $row->{'OldClientCode'},
    };
}

Обратите внимание, конечно, что в Perl нет mysql_fetch_array.Переведите соответственно.:)

0 голосов
/ 22 января 2012

Если мы заново представим версию Perl первой версии в более перлитом стиле, мы можем получить что-то вроде этого:

use strict;
use warnings;

my $sth = $dbh->prepare(
    "select client_id, partner_id, client_code, partner_code from $tblname"
); 
$sth->execute(); 
my %client_partner_hash;
while (my $row = $sth->fetchrow_hashref()) {
    $client_partner_hash{lc($$row{client_code})} = +{
        map { $_ => lc($$row{$_}) } keys %$row
    };
}

Если вы хотите снова извлечь данные, вы можете сказать:

for my $ccode (sort keys %client_partner_hash) {
    my $cp = $client_partner_hash{$ccode};

    print 'client_code = ', $$cp{client_code}, "\n";

    for my $part (sort keys %$cp} {
        if ($part ne 'client_code') {
            print "  $part = ", $$cp{$part}, "\n";
        }
    }
}
0 голосов
/ 18 января 2012

Вы можете использовать Data :: Dumper, так как некоторые предлагают выводить объект хеша на экранВы, вероятно, хотите сделать что-то более полезное.

foreach $ccode(keys(%$client_partner_hash)){
  print "C Code: $ccode\n";
  print "New Clinet Code: " . $client_partner_hash->{$ccode}->{newclinetcode} ."\n";
  print "New Partner Code: " .$client_partner_hash->{$ccode}->{newpartnercode} ."\n";
  print "Old Clinet Code: " . $client_partner_hash->{$ccode}->{oldclinetcode} ."\n";
  print "Old Partner Code: " .$client_partner_hash->{$ccode}->{oldpartnercode} ."\n";
}
0 голосов
/ 18 января 2012

Вы можете получить данные строки в двумерном массиве, как показано ниже, а также указать способ их отображения.

use Data::Dumper
my $associate_array; #Array reference of the @D array
while (my $row = $sth->fetchrow_arrayref()){
    $associative_array->[$ClientCode] = {
        'PartnerCode'    => $row->['PartnerCode'],
        'OldPartnerCode' => $row->['OldPartnerCode'],
        'ClientCode'     => $ClientCode,
        'OldClientCode'  => $row->['OldClientCode'],
   };

}

foreach my $row (@$associative_array){
    print Dumper $row;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...