在 Perl Mason 中获取 HASH 的值

Getting value of a HASH in Perl Mason

我有一个看起来像这样的对象

my $result;
$result->{success} = 0;
$result->{error} = {errorType => "SHIT_ERROR"};

当我尝试使用

打印它时
print "result ".$result;

它打印

HASH(0xc191a768)

我怎样才能真正得到它的内容?

归根结底,我想将其作为参数传递给我的重定向请求。只是为了添加更多细节。 @dev-null 建议如何将其作为 json 传递,但我想将其传递为 - success=0&error[errorType]=..... 请建议如何实现。

use Data::Dump;
dd( $result );

use Data::Dumper;
print Dumper( $result );

或者干脆

while ( my ( $k, $v ) = each %{ $result } ) {
  print "$k => $v\n";
}

如果您想将散列序列化为 JSON 对象,您可以:

#!/usr/bin/env perl

use strict;
use warnings;

use JSON;

my $result;
$result->{success} = 0;
$result->{error} = {errorType => "SHIT_ERROR"};

print encode_json $result; # {"success":0,"error":{"errorType":"SHIT_ERROR"}}

要获取 $result 的内容,您必须:

print $result->{success};

然后打印 error,但请注意 error 是一个嵌套哈希,如果您尝试打印它的值:

print $result->{error};

你仍然会得到类似 HASH(...) 的东西(你必须打印 {error} 元素的 {errorType} 元素)。

回到你的问题。你说你想把这个参数传递给你的重定向请求。您希望如何实现您的重定向请求?

使用 $m->redirect() 方法

如果您正在使用 $m->redirect(),我建议您将 $result 更改为更简单的结构,如下所示:

% my $result = {
%   success => 0,
%   errorType => 'SHIRT_ERROR',
% };
% $m->redirect( make_uri('error_handler', $result), 302);

这将创建一个像这样的 uri:

/error_handler?errorType=SHIRT_ERROR&success=0

重定向方法将重定向到它。你的 error_handerl.mc 可能包含这样的内容:

<%class>
  has 'success';
  has 'errorType';
</%class>
<%init>
  if ($.success eq "0") {
    print $.errorType;
  }
</%init>

在 $m->redirect()

上使用 JSON

Mason 似乎不支持 success=0&error[errorType]=...

这样的查询字符串

我能想到的唯一选择是像这样用 JSON 序列化请求:

component.mc

<%init>
use JSON;

my $result;
$result->{success} = 0;
$result->{error} = {errorType => "SHIRT_ERROR"};

my $h = {
  result => encode_json $result
};

$m->redirect(make_uri('/error_handler', $h), 302);
</%init>

error_handler.mc

<%class>
  has 'result';
</%class>
<%init>
  use JSON;

  my $result = decode_json $.result;

  print dh $result;
</%init>

第一个组件将重定向到 url,如下所示:

http://localhost:5000/error_handler?result=%7B%22success%22%3A0%2C%22error%22%3A%7B%22errorType%22%3A%22SHIRT_ERROR%22%7D%7D

我觉得它不太优雅,但它确实有效。