perl中的(@ {${{value}})是什么?
我一直在努力使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程序员会感谢你.) 您应该试验 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; (请谨慎对待此代码,因为我无法在没有重要工作设置测试数据库的情况下彻底测试它,尽管它在一个简单的数据集上可以正常工作.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |