我有一个对象,看起来像这个
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"}}