从 hashref 中提取各种结构化数据
extracting various structured data from hashref
我有一个散列,其中收集了错误消息。
在散列中,__errlist__
是一个键,然后是一个值的列表,可以是字符串,散列或嵌套散列,如下所示:
字符串:
{'_errlist_' => ['Empty table error - data load failed.']}
哈希:
{ '_errlist_' => [
{'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column DWH_TENANT_ID not found in Q. (SQL-HY000) '}]}
嵌套哈希:
{'_errlist_' => [
{'message' =>
{'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000) '}}]}
或:
{'_errlist_' => [
{'message' =>
{'message' =>
{'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000) '
}}}]}
我想到的是:
if (defined($RunActSeq->[0]->{'_errlist_'}->[0]->{'message'}->{'message'}->{'message'})){
$errmsg = $RunActSeq->[0]->{'_errlist_'}->[0]->{'message'}->{'message'}->{'message'};
} elsif (defined($RunActSeq->[0]->{'_errlist_'}->[0])){
$errmsg = $RunActSeq->[0]->{'_errlist_'}->[0];
} elsif (defined($RunActSeq->[0]->{'_errlist_'}->[0]->{'message'}->{'message'})){
$errmsg = $RunActSeq->[0]->{'_errlist_'}->[0]->{'message'}->{'message'};
} elsif (defined($RunActSeq->[0]->{'_errlist_'}->[0]->{'message'}) ){
$errmsg = $RunActSeq->[0]->{'_errlist_'}->[0]->{'message'};
} else {
$errmsg = "Undefined Error";
}
但是在提取错误消息字符串时我仍然没有收到消息,大多数时候我得到的是 HASH(0x3c04250)
而不是消息文本。
有没有人知道如何更准确地提取错误信息?
您可以像这样尝试递归查找:
use feature qw(say);
use strict;
use warnings;
{
my @tests = (
['Empty table error - data load failed.'],
[ {'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column DWH_TENANT_ID not found in Q. (SQL-HY000) '}],
[ {'message' =>
{'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000) '}}],
[{'message' =>
{'message' =>
{'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000) ' }}}],
);
for my $i (0..$#tests) {
my $test = $tests[$i];
my $hash = { "_errlist_" => $test };
my $errmsg = extract_err( $hash->{_errlist_}[0] );
say "Test #$i: $errmsg";
}
}
sub extract_err {
my ( $hash ) = @_;
if (ref $hash eq "HASH") {
return extract_err( $hash->{message} );
}
elsif (!(ref $hash)) {
return $hash;
}
else {
die "Unexpected reference type: ", ref $hash, "\n";
}
}
输出:
Test #0: Empty table error - data load failed.
Test #1: Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column DWH_TENANT_ID not found in Q. (SQL-HY000)
Test #2: Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000)
Test #3: Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000)
我有一个散列,其中收集了错误消息。
在散列中,__errlist__
是一个键,然后是一个值的列表,可以是字符串,散列或嵌套散列,如下所示:
字符串:
{'_errlist_' => ['Empty table error - data load failed.']}
哈希:
{ '_errlist_' => [
{'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column DWH_TENANT_ID not found in Q. (SQL-HY000) '}]}
嵌套哈希:
{'_errlist_' => [
{'message' =>
{'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000) '}}]}
或:
{'_errlist_' => [
{'message' =>
{'message' =>
{'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000) '
}}}]}
我想到的是:
if (defined($RunActSeq->[0]->{'_errlist_'}->[0]->{'message'}->{'message'}->{'message'})){
$errmsg = $RunActSeq->[0]->{'_errlist_'}->[0]->{'message'}->{'message'}->{'message'};
} elsif (defined($RunActSeq->[0]->{'_errlist_'}->[0])){
$errmsg = $RunActSeq->[0]->{'_errlist_'}->[0];
} elsif (defined($RunActSeq->[0]->{'_errlist_'}->[0]->{'message'}->{'message'})){
$errmsg = $RunActSeq->[0]->{'_errlist_'}->[0]->{'message'}->{'message'};
} elsif (defined($RunActSeq->[0]->{'_errlist_'}->[0]->{'message'}) ){
$errmsg = $RunActSeq->[0]->{'_errlist_'}->[0]->{'message'};
} else {
$errmsg = "Undefined Error";
}
但是在提取错误消息字符串时我仍然没有收到消息,大多数时候我得到的是 HASH(0x3c04250)
而不是消息文本。
有没有人知道如何更准确地提取错误信息?
您可以像这样尝试递归查找:
use feature qw(say);
use strict;
use warnings;
{
my @tests = (
['Empty table error - data load failed.'],
[ {'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column DWH_TENANT_ID not found in Q. (SQL-HY000) '}],
[ {'message' =>
{'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000) '}}],
[{'message' =>
{'message' =>
{'message' => 'Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000) ' }}}],
);
for my $i (0..$#tests) {
my $test = $tests[$i];
my $hash = { "_errlist_" => $test };
my $errmsg = extract_err( $hash->{_errlist_}[0] );
say "Test #$i: $errmsg";
}
}
sub extract_err {
my ( $hash ) = @_;
if (ref $hash eq "HASH") {
return extract_err( $hash->{message} );
}
elsif (!(ref $hash)) {
return $hash;
}
else {
die "Unexpected reference type: ", ref $hash, "\n";
}
}
输出:
Test #0: Empty table error - data load failed.
Test #1: Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column DWH_TENANT_ID not found in Q. (SQL-HY000)
Test #2: Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000)
Test #3: Prepare failed: [Teradata][ODBC Teradata Driver][Teradata Database](-5628)Column not found . (SQL-HY000)