gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:59:50 26 4
gpt4 key购买 nike

我一直在努力使 perl 程序工作数周。其他人写了它,从那时起数据源已更改。我花了数周时间逐行搜索并做教程。我被困住了。代码说 @{ $Routings{$Code} }它有一个值列表 [ $ProcessID, $Setup, $Process ]但在代码底部 foreach ( @{ $Routings{$Code} } ) {my $ProcessCodeID = @$_[0];}它似乎没有返回数据。如果有人可以帮助我print $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, $Setup, $Process ] );
}

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

最佳答案

首先重要的是你use strictuse warnings在程序开始时,并在第一次使用变量时声明所有变量。这将导致 Perl 生成一些非常有用的消息,这些消息将揭示许多容易被忽视的简单错误。

例如,您正在分配变量 $setup , $process , 和 $processid但随后推 $Setup , $Process , 和 $ProcessID到一个数组上。 Perl 标识符区分大小写,因此它们是三个不同的变量,其值为 undef这一点。 use strict会打印一个编译错误,说 $ProcessID等没有被宣布。 (如果您有选择,最好使用小写加下划线作为本地标识符。经验丰富的 Perl 程序员会感谢您。)

您应该尝试使用 Data::Dumper module它将显示像这样的复杂嵌套 Perl 数据结构的内容和结构。一旦您拥有 use Data::Dumper在你的程序中你可以写

print Dumper \%Routings

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

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

没有代码可以为 $Code 赋值为 foreach循环,大概你想循环遍历 %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, 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, $Setup, $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, $SetupMins, $ProcessMins) = @$triplet;

(请谨慎对待此代码,因为我无法在没有设置测试数据库的大量工作的情况下对其进行彻底测试,尽管它确实可以在简单的数据集上正常工作。)

关于perl - perl 中的 (@{ $value{$value}} ) 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10202194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com