gpt4 book ai didi

perl - 使用 xml 模块时对 "pseudo-hashes are deprecated"进行故障排除

转载 作者:行者123 更新时间:2023-12-04 15:33:16 25 4
gpt4 key购买 nike

我刚刚学习如何使用 perl 哈希并在 perl 中遇到了这条消息。我正在使用 XML::Simple 来解析 xml 输出并使用 exists 检查散列键。

消息:./h2.pl 第 53 行弃用了伪哈希。
参数“\x{2f}\x{70}...”不是数字存在于 ./h2.pl 第 53 行。
在 ./h2.pl 第 53 行将数组强制转换为散列时索引错误。

我让脚本在一个测试目录下工作,然后在收到此消息时在另一个目录上执行脚本进行测试。我该如何解决/解决这个问题?

错误引用的代码:

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;

#my $data = XMLin($xml);
my $data = XMLin($xml, ForceArray => [qw (file) ]);
my $size=0;

if (exists $data->{class}
and $data->{class}=~ /FileNotFound/) {
print "The directory: $Path does not exist\n";
exit;
} elsif (exists $data->{file}->{path}
and $data->{file}->{path} =~/test-out-00/) {
$size=$data->{file}->{size};
if ($size < 1024000) {
print "FILE SIZE:$size BYTES\n";
exit;
}
} else {
exit;
}

print Dumper( $data );

工作测试用例,数据结构如下所示:

$VAR1 = {
'recursive' => 'no',
'version' => '0.20.202.1.1101050227',
'time' => '2011-09-30T02:49:39+0000',
'filter' => '.*',
'file' => {
'owner' => 'test_act',
'replication' => '3',
'blocksize' => '134217728',
'permission' => '-rw-------',
'path' => '/source/feeds/customer/test/test-out-00',
'modified' => '2011-09-30T02:48:41+0000',
'size' => '135860644',
'group' => '',
'accesstime' => '2011-09-30T02:48:41+0000'
'modified' => '2011-09-30T02:48:41+0000'
},
'exclude' => ''
};
recursive:no
version:0.20.202.1.1101050227
time:2011-10-01T07:06:16+0000
filter:.*
file:HASH(0x84c83ec)
path:/source/feeds/customer/test
directory:HASH(0x84c75d8)
exclude:

出现错误的数据结构:

$VAR1 = {
'recursive' => 'no',
'version' => '0.20.202.1.1101050227',
'time' => '2011-10-03T04:49:36+0000',
'filter' => '.*',
'file' => [
{
'owner' => 'test_act',
'replication' => '3',
'blocksize' => '134217728',
'permission' => '-rw-------',
'path' => '/source/feeds/customer/test/20110531/test-out-00',
'modified' => '2011-10-03T04:47:46+0000',
'size' => '121406618',
'group' => 'feeds',
'accesstime' => '2011-10-03T04:47:46+0000'
},

测试xml文件:

<?xml version="1.0" encoding="UTF-8"?><listing time="2011-10-03T04:49:36+0000" recursive="no" path="/source/feeds/customer/test/20110531" exclude="" filter=".*" version="0.20.202.1.1101050227"><directory path="/source/feeds/customer/test/20110531" modified="2011-10-03T04:48:19+0000" accesstime="1970-01-01T00:00:00+0000" permission="drwx------" owner="test_act" group="feeds"/><file path="/source/feeds/customer/test/20110531/test-out-00" modified="2011-10-03T04:47:46+0000" accesstime="2011-10-03T04:47:46+0000" size="121406618" replication="3" blocksize="134217728" permission="-rw-------" owner="test_act" group="feeds"/><file path="/source/feeds/customer/test/20110531/test-out-01" modified="2011-10-03T04:48:04+0000" accesstime="2011-10-03T04:48:04+0000" size="127528522" replication="3" blocksize="134217728" permission="-rw-------" owner="test_act" group="feeds"/><file path="/source/feeds/customer/test/20110531/test-out-02" modified="2011-10-03T04:48:19+0000" accesstime="2011-10-03T04:48:19+0000" size="125452919" replication="3" blocksize="134217728" permission="-rw-------" owner="test_act" group="feeds"/></listing>

最佳答案

“Pseudo-hashes are deprecated”错误意味着您正在尝试将数组作为哈希访问,这意味着 $data->{file}$data->{file}{path} 是一个数组引用。

您可以使用 print ref $data->{file} 检查数据类型。 Data::Dumper 模块还可以帮助您查看数据结构中的内容(可能在设置 $Data::Dumper::Maxdepth = N 以限制转储时如果结构很大,则为 N 个级别)。

更新

既然您正在使用 ForceArray,$data->{file} 应该始终指向一个 arrayref,它可能有多个对 path 的引用。这是您的代码的修改段来处理它。但请注意,if-then-exit 条件的逻辑可能需要更改。

if (defined $data->{class} and $data->{class}=~ /FileNotFound/) {
print "The directory: $Path does not exist\n";
exit;
}

exit if ! defined $data->{file};

# filter the list for the first file entry named test-out-00
my ( $file ) = grep {
defined $_->{path} && $_->{path} =~ /test-out-00/
} @{ $data->{file} };

exit if ! defined $file;

$size = $file->{size};
if ($size < 1024000) {
print "FILE SIZE:$size BYTES\n";
exit;
}

关于perl - 使用 xml 模块时对 "pseudo-hashes are deprecated"进行故障排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7618269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com