【问题标题】:Getting value of a HASH in Perl Mason在 Perl Mason 中获取 HASH 的值
【发布时间】:2016-02-25 20:25:16
【问题描述】:

我有一个像这样的对象

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

当我尝试使用打印它时

print "result ".\$result;

打印出来

哈希(0xc191a768)

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

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

【问题讨论】:

  • 这是一个令人讨厌的错误 ;) 但不清楚您到底想打印什么...success 的值? errorType 的值?每个哈希键的值,包括嵌套结构?对于后者,您可以使用 Data::DumperData::Dump 之类的内容。
  • print "$result->{success}\n";print "$result->{error}{errorType}\n";
  • 您想将哈希序列化为 JSON 吗? {"success": true, "error": {"errorType": "..."}}

标签: perl redirect hash mason


【解决方案1】:

要获取$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&amp;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

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

【讨论】:

  • 您好 Fthiella,非常感谢您的详细回复。唯一的问题是处理程序期望 $result 具有相同的格式,我们无法更改它。 :( .. 请建议我如何在不简化结构的情况下通过 $result。
  • @Andy897 请查看我的更新答案。我认为您应该向我们展示一些代码,也许我们可以建议您更好的方法。请让我知道它是否有效。
  • 非常感谢。我尝试了你的建议 - Can't call method "encode_json" on unblessed reference
  • @Andy897 你确定你正确加载了 JSON 库吗?如果你分配my $json = encode_json $result; 然后my $h = { 'result' =&gt; $json }; 呢?
【解决方案2】:
use Data::Dump;
dd( $result );

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

或者干脆

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

【讨论】:

  • 如何将其作为 URL 参数传递
  • @Andy897 你需要更具体一些。
  • 很抱歉。我可能会创建一个新问题
【解决方案3】:

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

【讨论】:

  • OP 是否在任何地方提到过 JSON?
  • @MattJacob 不是直接的,但是提到OP想要将“对象”传递给http请求:And how can I pass it as URL parameter这让我想到了JSON
  • 没错,除非他只是想要key=value&amp;key=value...,这是我最初的想法。但这对于嵌套哈希没有多大意义,所以也许 JSON 是正确的答案。 ;-)
  • @MattJacob 哦没想到这个,OP也可以传success=0&amp;error[errorType]=...,这也是一个有效的查询字符串。
  • @dev-null .. 非常感谢。我想这样做success=0&error[errorType]=。 ...请建议我该怎么做。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多