在 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
我觉得它不太优雅,但它确实有效。
我有一个看起来像这样的对象
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()
上使用 JSONMason 似乎不支持 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
我觉得它不太优雅,但它确实有效。