duan4369 2010-06-18 20:43
浏览 192
已采纳

循环遍历数组以在Perl中构建多维数组,从PHP转换,并在语法上错误

Working on converting an array to another array. In PHP, this is easy, but Perl has some syntax that I am having a hard time getting my head around and understanding.

Here is my loop in Perl:

foreach my $r (@toindex){
    #print Dumper $r;
    %indexed{@$r[0]}{'image_id'} = @$r[0];     #Broken
    %indexed{"@$r[0]"}{'image_id'} = @$r[0];   #Broken
}

Here is my @toindex array

$VAR1 = [
      [
        3638584,
        'Aperture',
        'F13'
      ],
      [
        3638588,
        'Exposure Bias',
        '0 EV'
      ],
      [
        3638588,
        'Focal Length',
        '80.0 mm'
      ],
    ];

And here is what I want to do, but in PHP

foreach($indexrows as $k => $v){
    $indexed[$v['image_id']]['image_id'] = $v['image_id'];     
}

It seems so very simple in PHP, but moving it to Perl is proving to be quite a challenge for me.


Update

Thanks to the help of Sinan Ünür and DVK with that final little pointer, I have a working solution. I'm posting the complete script in case anyone might find some part of it useful in the future.

#!/usr/bin/perl
use strict; use warnings; use DBI; use Data::Dumper;

my $dbh = DBI->connect('dbi:Pg:dbname=database;host=serveraddress','user','password') or die;
my $sth;
my $sql = "SELECT id, field, data FROM table";

my $offset = 0; 
my $increment = 20;
my $toindex;

# This loop here is to solve a problem that was not part of the
# original question. I included it to illustrate the syntax for
# looping a database query
do{
    $sth = $dbh->prepare($sql . " LIMIT " . $increment . " OFFSET " . $offset);
    $sth->execute or die;
    $toindex = $sth->fetchall_arrayref;
    $offset = $offset + $increment;
}while(@$toindex == 0);

# Alternately, if you do not need a loop below is all you need
# $sth = $dbh->prepare($sql);
# $sth->execute or die;
# $toindex = $sth->fetchall_arrayref;

my %indexed;
foreach my $r ( @$toindex ) {
    #print Dumper $r;
    my ($id, $field, $value) = @$r;
    @{ $indexed{ $id } }{('image_id', $field)} = ($id, $value);
}

print Dumper %indexed; 

$dbh->disconnect;
  • 写回答

3条回答 默认 最新

  • dongwei6457 2010-06-18 21:01
    关注

    I am going to speculate that you are trying to convert that information to a hash table indexed by the image identifier:

    #!/usr/bin/perl
    
    use strict; use warnings;
    
    my $table = [
          [ 3638584 => 'Aperture',      'F13'     ],
          [ 3638588 => 'Exposure Bias', '0 EV'    ],
          [ 3638588 => 'Focal Length',  '80.0 mm' ],
    ];
    
    my %indexed;
    
    for my $r ( @$table ) {
        @{ $indexed{ $r->[0] } }{('image_id', $r->[1])} = @$r[0,2];
    }
    
    use YAML;
    print Dump \%indexed;
    

    Output:

    E:\Home> t
    ---
    3638584:
      Aperture: F13
      image_id: 3638584
    3638588:
      Exposure Bias: 0 EV
      Focal Length: 80.0 mm
      image_id: 3638588

    You can write the for loop above less cryptically as:

    for my $r ( @$table ) {
        my ($id, $field, $value) = @$r;
        @{ $indexed{ $id } }{('image_id', $field)} = ($id, $value);
    }
    

    which might save a lot of headaches a week from now.

    See also the Perl Data Structures Cookbook. Perl comes with excellent documentation; use it.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?