我有大量数据另存为Data :: Dumper输出。
我应该如何读取这些数据?我想对其进行重组,但是我完全迷失了这种方法。数据结构是数组中的哈希,它们是哈希的哈希...
这是一个(非常精简的)示例。另外,创作也不是很好,因为角色可以有两个“攻击”或两个“特殊”,所以很明显这是一次碰撞,一个将被覆盖。
编辑:我真正要问的是:这是存储数据的理想方式吗?或者,还有更好的方法?因为对我来说,访问哈希$char_hash{Character Name}{abilities}{attack}{tiers}{level 1}{description}
似乎很难写。遍历像@{$char_hash{Character Name}{Equipment}{Equipment Level 1}{Items}}
疯狂的事情
my @char_hash = (
"Character Name" => {
"description" => "",
"alignment" => "",
"categories" => [
"ex 1",
"ex 2",
"ex 4",
"ex 5"
],
"primaryStat" => "Strength (STR)",
"baseStats" => {
"Strength (STR)" => "22",
"Agility (AGI)" => "15",
"Intelligence (INT)" => "17",
"Speed" => "100",
"Health" => "197",
"Physical Damage" => "17"
},
"abilities" => {
"attack" => {
"name" => "ex 1",
"type" => "Physical",
"tiers" => {
"level 1" => {
"description" => ""
},
"level 2" => {
"unlockLevel" => 16,
"cost" => {
"Money" => 700,
"Material" => 3
},
"fromPrevious" => "+5% Damage",
"description" => ""
}
},
"conditions" => {
}
},
"special" => {
"name" => "ex",
"cooldown" => 3,
"type" => "special",
"tiers" => {
"level 1" => {
"description" => ""
},
"level 2" => {
"unlockLevel" => 18,
"cost" => {
"Money" => 1300,
"Material" => 2
},
"fromPrevious" => "+5% Damage",
"description" => ""
}
},
"conditions" => {
}
},
"Equipment" => {
"Equipment Lvl I" => {
"cummulatedStats" => {
"Strength (STR)" => "+22",
"Agility (AGI)" => "+15",
"Intelligence (INT)" => "+17",
"Speed" => "+100",
"Health" => "+197",
"Physical Damage" => "+17"
},
"items" => [
{
"name" => "",
"id" => "",
"tier" => 1,
"mark" => "",
"requiredLevel" => 1,
"sellValue" => 10,
"stats" => {
"Physical Damage" => ""
}
},
{
"name" => "",
"id" => "",
"tier" => 1,
"mark" => "",
"requiredLevel" => 2,
"sellValue" => 20,
"stats" => {
"Strength (STR)" => "",
"Agility (AGI)" => "",
"Intelligence (INT)" => ""
}
},
{
"name" => "",
"id" => "",
"tier" => 1,
"mark" => "",
"requiredLevel" => 2,
"sellValue" => 20,
"stats" => {
"Strength (STR)" => "",
"Agility (AGI)" => "",
"Intelligence (INT)" => ""
}
},
{
"name" => "",
"id" => "",
"tier" => 1,
"mark" => "",
"requiredLevel" => 2,
"sellValue" => 20,
"stats" => {
"Speed" => ""
}
},
{
"name" => "",
"id" => "",
"tier" => 1,
"mark" => "",
"requiredLevel" => 2,
"sellValue" => 20,
"stats" => {
"Strength (STR)" => ""
}
},
{
"name" => "",
"id" => "",
"tier" => 1,
"mark" => "",
"requiredLevel" => 2,
"sellValue" => 20,
"stats" => {
"Armor" => ""
}
}
]
}
}
}
}
);
我会说,有更好的方法。
答案是-使用面向对象的代码。如果您还没有真正认识到OO,那么它听起来可能会令人生畏-而且有很多Java或C ++程序员都喜欢这样做。
但实际上,它是一个数据结构,其中包含“内置”代码以对其进行操作。这些代码位称为“方法”,适用于对象。
所以-采取上述措施。您具有“字符”和“设备”作为“对象”的清晰示例。
#!/usr/bin/env perl
package MyStuff::Character;
use strict;
use warnings;
sub new {
my ( $class, $name ) = @_;
my $self = {};
$self -> {name} = $name;
bless $self, $class;
return $self;
}
sub set_attr {
my ( $self, $attr, $value ) = @_;
$self -> {attr} -> {$attr} = $value;
}
sub get_attr {
my ( $self, $attr ) = @_;
return $self -> {attr} -> {$attr};
}
sub get_name {
my ( $self ) = @_;
return $self -> {name};
}
sub add_item {
my ( $self, $item_ref ) = @_;
push ( @{ $self -> {items} }, $item_ref );
}
sub inventory {
my ( $self ) = @_;
return @{$self->{items}};
}
package MyStuff::Items;
sub new {
my ( $class, $name, $type ) = @_;
my $self = {};
$self -> {name} = $name;
$self -> _set_type($type);
bless $self, $class;
return $self;
}
sub get_name {
my ( $self ) = @_;
return $self -> {name};
}
sub _set_type {
my ( $self, $type ) = @_;
$self -> {type} = $type;
if ( $type eq "sword" ) {
$self -> {attack_bonus} = "+10";
}
}
package main;
use strict;
use warnings;
my $character = MyStuff::Character -> new ( "Joe Beefcake" );
$character -> set_attr('STR', 9000);
print $character -> get_name, " has STR ", $character -> get_attr('STR'),"\n";
my $new_sword = MyStuff::Character -> new ( "Hackmaster", "sword");
$character -> add_item( $new_sword );
print "And is carrying:\n";
foreach my $item ( $character -> inventory ) {
print $item -> get_name,"\n";
}
这是一个非常基本的示例,但是希望说明一种处理复杂数据结构的新方法吗?
具体来说-我们将不需要的东西“交给”要照顾的对象,并使用方法与之交互。因为项目是一个自包含的对象,所以它“知道”它的状态。您可以将其拿走,然后“交给”另一个角色。
这样做的另一个好处是继承。我有一个非常通用的“项目”对象。每个项目都会有您可能要处理的事情-拿起它们,随身携带,出售,然后交给其他人。
但是您可以创建一个“武器”类,该类继承“物品”类(因此您仍然可以给别人用剑),还增加了一些额外的东西-例如攻击力,熟练程度要求,攻击力,等等。
对象定向的概念并不是一个新概念,但在perl中并不常见。有perldoc perlobj
一些基础知识。
还有一些软件包可以帮助完成该过程(上述工作独立运行),例如Moose
。
对于“保存”和“加载”-有很多可能的选择,而且要视情况而定。
我可能会通过将“字符”和“项目”分别序列化为JSON,然后重新加载/验证来解决。
这在这里进行了更详细的介绍:如何将Perl对象转换为JSON,反之亦然
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句