Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数组上循环以在Perl中构建多维数组,从PHP转换,语法错误_Php_Perl_Syntax - Fatal编程技术网

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

在数组上循环以在Perl中构建多维数组,从PHP转换,语法错误,php,perl,syntax,Php,Perl,Syntax,正在将一个数组转换为另一个数组。在PHP中,这很容易,但是Perl有一些语法,我很难理解 以下是我在Perl中的循环: foreach my $r (@toindex){ #print Dumper $r; %indexed{@$r[0]}{'image_id'} = @$r[0]; #Broken %indexed{"@$r[0]"}{'image_id'} = @$r[0]; #Broken } 这是我的@toindex数组 $VAR1 = [

正在将一个数组转换为另一个数组。在PHP中,这很容易,但是Perl有一些语法,我很难理解

以下是我在Perl中的循环:

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

$VAR1 = [
      [
        3638584,
        'Aperture',
        'F13'
      ],
      [
        3638588,
        'Exposure Bias',
        '0 EV'
      ],
      [
        3638588,
        'Focal Length',
        '80.0 mm'
      ],
    ];
下面是我想做的,但是用PHP

foreach($indexrows as $k => $v){
    $indexed[$v['image_id']]['image_id'] = $v['image_id'];     
}
这在PHP中似乎非常简单,但将其转移到Perl对我来说是一个相当大的挑战


更新

感谢SinanÜnür和DVK对最后一个小指针的帮助,我有了一个有效的解决方案。我正在发布完整的脚本,以防将来有人发现其中的某些部分很有用

#!/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;

我将推测,您正在尝试将该信息转换为由图像标识符索引的哈希表:

#!/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;
输出:

E:\Home> t --- 3638584: Aperture: F13 image_id: 3638584 3638588: Exposure Bias: 0 EV Focal Length: 80.0 mm image_id: 3638588 从现在起一周内可能会省去很多头疼的事


另见。Perl附带了优秀的文档;使用它。

这并不能直接回答这个问题,但它对学习很有用,所以我把它改成CW

  • 在Perl 5及更早版本中,可以使用语法
    $hash{key}
    来寻址散列
    %hash
    的单个元素,因为该元素是标量

  • 哈希键总是字符串化的。因此,作为散列的键,
    @$r[0]
    “@$r[0]”
    是相同的

  • 给定对数组
    $r
    的引用,有两种方法可以访问其第一个元素<代码>@$r[0]没有错,但是在前面添加符号会让人觉得很无聊。因此,我发现
    $r->[0]
    更可取,特别是如果
    $r->[0]
    包含对嵌套数据结构的引用(这里不是这种情况),那么我可以编写
    $r->[0]{this}[1]{that}


  • 全局符号“%indexed”需要在./db_index.pl第79行显示包名。“my%indexed;”足以定义它。@Ben:您在示例中试图使用
    %indexed
    符号,因此hobbs自然认为您已经声明了它。@Ether@hobbs对此表示抱歉。我将其重新声明为%索引,而不是$索引。我倾向于非常消极地看待无端的语言比较。因此,您不知道如何在Perl中做一些您知道如何在PHP中做的事情。您可以简单地问“我如何在Perl中执行X?”而不是抱怨一种语言的语法,您似乎根本没有读过它的文档。请看@Ben,这就是为什么你需要真正学习一门语言,在接受一份需要你使用它的工作之前理解它的基本规则。@Ben:你不需要用谷歌搜索任何东西;规范的perl文档包含了您所需要的一切
    perldoc-perldsc
    有很多例子。但是作为一个程序员,你知道复杂的任务实际上只是一堆相互缠绕的简单任务。将每个任务简化为简单的原子项,一切都会变得清晰起来。@Ben在选择Perl和PHP时,不应以所有任务的速度为标准。因为您似乎了解PHP,并且似乎有PHP中的工作代码,所以除了使用Perl的工作要求之外,我想不出任何其他原因。如果你这样做是一种学习运动,你应该把它当作这样,并考虑得到一本书。西南,本-休息!拳击比赛结束了:)@Ben-说“Perl有一些奇怪的语法”,而不是“Perl有一个我觉得很难理解的语法”,听起来确实有点侮辱性,即使你不是这个意思。我建议你修改一下措辞@西南——如果你仔细阅读本之前的问题,就会给人留下这样的印象:他正在努力学习,并在其中投入了一些真诚的努力。所以请对一个新的皈依者好一点:)@Sinan我正在使用dumper,但我得到了这个结果。这是向前迈出的一步,但看起来不太正确$VAR1='数组(0x1ce7f88)'$VAR2={'image_id'=>[3638584',Aperture','F13'],'ARRAY(0x1ce7f70)=>[3638584,'Exposure Bias','0 EV']};@Ben:如果你得到了那个输出,你就没有使用。@我想他是在插入数组引用。@Ben你是不是写了
    $r
    而不是
    $r->[0]
    $index{$r->[0]}
    ?这个例子在
    Data::Dumper
    @Sinan中的工作原理是一样的。我在循环中添加了一个print,它似乎将$r设置为与@table相同的值,这毫无意义。我使用print Dumper$r;来验证这一点。@Ben-方法的名称意味着它返回的是数组引用,而不是数组,因此您不需要eed
    $toindex=$sth->fetchall\u arrayref;
    和其他地方使用
    @$toindex
    来使用数组和
    $toindex->[$i]
    来使用其元素。本页提供了一个一般使用DBI,特别是fetchall\u arrayref()的好例子:使用
    @$r[0]访问数组引用
    实际上是在访问一个长度为1的切片。在标量上下文中进行计算时,这就像
    操作符一样,并返回切片中的最后一个元素。因此
    @$r[0]
    得到的结果与
    $$r[0]
    得到的结果相同,但方式复杂而怪异。就我个人而言,我坚持使用
    $r->[0]
    ,这一切都很简单。 E:\Home> t --- 3638584: Aperture: F13 image_id: 3638584 3638588: Exposure Bias: 0 EV Focal Length: 80.0 mm image_id: 3638588
    for my $r ( @$table ) {
        my ($id, $field, $value) = @$r;
        @{ $indexed{ $id } }{('image_id', $field)} = ($id, $value);
    }
    
     foreach my $r (@toindex){
         #print Dumper $r;
         %indexed{@$r[0]}{'image_id'} = @$r[0];     #Broken
         %indexed{"@$r[0]"}{'image_id'} = @$r[0];   #Broken
     }