加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl中的(@ {${{value}})是什么?

发布时间:2020-12-15 23:27:12 所属栏目:大数据 来源:网络整理
导读:我一直在努力使perl程序工作数周.其他人写了它,从那以后数据源已被更改.我花了几周时间逐行搜索并做了教程.我被卡住了.代码说@ {$Routings {$Code}}有一个值列表[$ProcessID,$Setup,$Process]但是在foreach的代码底部(@ {$Routings {$Code}}){my $ProcessCod
我一直在努力使perl程序工作数周.其他人写了它,从那以后数据源已被更改.我花了几周时间逐行搜索并做了教程.我被卡住了.代码说@ {$Routings {$Code}}有一个值列表[$ProcessID,$Setup,$Process]但是在foreach的代码底部(@ {$Routings {$Code}}){my $ProcessCodeID = @ $_ [0];}它似乎没有返回数据.如果有人甚至可以帮我打印$ProcessCodeID,那么我可以跟踪数据,这将非常有帮助.

另外,如果你能解释一下@ {$value {$key}}代表什么也会有所帮助.

谢谢堆.

%Routings = ();
my $dbh = DBI-> connect('dbi:ODBC:SQL')
    or die "Couldn't open Databaxe: $DBI::errstr;  stopped";

my $query= $dbh->prepare("SELECT Code,Setup,Process,ProcessID FROM ROUTING");

$query->execute() or die "Couldn't execute statement: $DBI::errstr; stopped";

while ( my ($Code,$setup,$process,$processid) = $query->fetchrow_array() ){
    push ( @{ $Routings{$Code} },[ $ProcessID,$Process ] );
}

foreach ( @{ $Routings{$Code} } ) {
    my $ProcessCodeID = @$_[0];
    my $SetupMins = @$_[1];
    my $ProcessMins = @$_[2];
}

解决方法

首先,重要的是在程序开始时使用严格和使用警告,并在首次使用它们时声明所有变量.这将导致Perl生成一些非常有用的消息,这些消息将揭示许多容易被忽视的简单错误.

例如,您分配变量$setup,$process和$processid,然后将$Setup,$Process和$ProcessID推送到数组. Perl标识符区分大小写,因此这些是三个不同的变量,此时将具有undef值. use strict会打印一个编译错误,说明没有声明$ProcessID等. (如果你有一个选择,最好使用小写加下划线来表示这些本地标识符.经验丰富的Perl程序员会感谢你.)

您应该试验Data::Dumper module,它将显示复杂的嵌套Perl数据结构的内容和结构.在程序中使用Data :: Dumper后就可以编写了

print Dumper %Routings

这将显示%Routings的内容作为匿名哈希.

散列的每个元素$Routings {$Code}的值是对应于Code的值的所有ProcessID,Setup和Process集合的列表(对数组的引用). (我假设列Code是非唯一的,否则数据结构比它需要的更复杂.)因此给定$Code的第一组三个值是$Routings {$Code} [0]和该集的ProcessID是$Routings {$Code} [0] [0].

没有代码为foreach循环的$Code赋值,并且可能你想要遍历%Routings哈希的所有键.

每次循环foreach循环时,$_被设置为对当前$Code的每个三元组值的引用.这意味着@ $_是一个三元素数组,但它应该使用$_-> [0]等而不是@ $_ [0]索引,这是一个单元素数组切片和糟糕的编码实践.在这里使用默认的$_代码变得更加模糊,我通过使用命名变量在下面阐明了它.

下面的代码修复了我能看到的问题.如果您需要任何进一步的帮助,请回来.

use strict;
use warnings;

use DBI;

my %Routings;

my $dbh = DBI-> connect('dbi:ODBC:SQL')
    or die "Couldn't open Databaxe: $DBI::errstr;  stopped";

my $query= $dbh->prepare("SELECT Code,ProcessID FROM ROUTING");

$query->execute or die "Couldn't execute statement: $DBI::errstr; stopped";

while ( my ($Code,$Process,$ProcessID) = $query->fetchrow_array ){
  push @{ $Routings{$Code} },$Process ];
}

for my $Code (keys %Routings) {
  foreach my $triplet ( @{ $Routings{$Code} } ) {
    my $ProcessCodeID = $triplet->[0];
    my $SetupMins = $triplet->[1];
    my $ProcessMins = $triplet->[2];
    print "$Code => ($ProcessCodeID,$SetupMins,$ProcessMins)n";
  }
}

请注意,foreach循环中的赋值可以通过一次执行它们来更清晰,更简洁.正如我所解释的那样,@ $triplet是一个三元素数组,所以等效赋值可以简单编码

my ($ProcessCodeID,$ProcessMins) = @$triplet;

(请谨慎对待此代码,因为我无法在没有重要工作设置测试数据库的情况下彻底测试它,尽管它在一个简单的数据集上可以正常工作.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读