从 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)