在PerlMason中获取HASH的值



我有一个对象,看起来像这个

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

当我尝试使用打印时

print "result ".$result;

它打印

HASH(0xc191a768)

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

最后,我想把它作为参数传递给我的重定向请求。只是想添加更多细节。@dev-null建议如何将其作为json传递,但我想像success=0&error[errorType]=。。。。。请说明如何实现这一目标。

要获得$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序列化请求,如下所示:

组件.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

我不觉得它太优雅,但它很管用。

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

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

或简称

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

如果您想将哈希序列化为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"}}

相关内容

  • 没有找到相关文章

最新更新