是否存在CORE模块中包含的任何便携式序列化方法/模块?我知道这里是Storable
,但它不是真正的便携式,也不是“跨平台标准化”。寻找像YAML,JSON,XML等类似的东西......
我已经完成了http://perldoc.perl.org/index-modules-T.html - 但可能错过了一些东西。
动机:想要制作一个简单的perl脚本,它可以用于任何perl(没有CPAN),并且可以从文件中读取一些配置(和数据)。使用带有Data :: Dumper格式的require
不是非常“用户友好”......
可能的解决方案:
require
- 不是非常用户友好的语法(对于非perl用户)任何其他建议的解决方案?
Ps:了解需要保持核心尽可能小和合理,但以某些标准化格式读取数据可能吗?应该是一个核心...
答案 0 :(得分:4)
有一个与Perl捆绑在一起的YAML解析器和序列化器,隐藏起来。它被称为CPAN::Meta::YAML
。它只处理YAML的一个子集,但这可能足以满足您的需要。
答案 1 :(得分:1)
您可以将Data :: Dumper的输出配置为类似JSON。例如:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
$Data::Dumper::Pair = ': ';
$Data::Dumper::Terse = 1;
$Data::Dumper::Useqq = 1;
$Data::Dumper::Indent = 1;
my $structure = {
foo => 'bar',
baz => {
quux => 'duck',
badger => 'mythical',
}
};
print Dumper( $structure );
打印:
{
"baz": {
"quux": "duck",
"badger": "mythical"
},
"foo": "bar"
}
这可能会让您最大程度地实现互操作性?该模块确实有一堆用于控制/改变输出的选项,例如冰箱和烤面包机的选择。
答案 2 :(得分:1)
你能再次向我解释Storable的问题吗?如果你在讨论了Bigendiness和Littleendiness后再看Perlport,那就得出结论:
可以用两种方式绕过这两个问题。传输和存储数字始终采用文本格式,而不是原始二进制文件,或者考虑使用 Data :: Dumper 和可存储等模块(包含在perl 5.8中)。将所有数据保存为文本可以显着简化问题。
因此,Storable在Perl中存储和检索数据是通用的,它不仅易于使用,而且是标准的Perl模块。
您希望能够在没有Perl程序的情况下编写数据的问题是否适合您?你可以简单地编写自己的Perl模块。在大多数Perl安装中,该模块可以放在与程序相同的目录中。
package Some_data; # Can be put in the same directory as the program like a config file
our $data; # Module variable which makes it accessible to your local program
$data = {}; # I am making this complex data structure...
$data->{NAME}->{FIRST} = "Bob";
$data->{NAME}->{LAST} = "Smith";
$data->{PHONE}->[0]->{TYPE} = "C";
$data->{PHONE}->[0]->{NUMBER} = "555-1234";
$data->{PHONE}->[1]->{TYPE} = "H";
$data->{PHONE}->[1]->{NUMBER} = "555-2345";
# Or use Subroutines
sub first {
return "Bob";
}
sub last {
return "Smith"
}
...
现在您可以将其包含在您的计划中:
use Some_data;
my $first_name = $Some_data::data->{NAME}->{FIRST} # As a hash of hashes
# OR
my $first_name = Some_data::first; # As a constant
子程序的好处是你无法改变程序中的数据。它们是常数。事实上,这正是Perl常量的工作方式。
谈论常数。您也可以使用use constant
:
package Some_data;
use constant {
FIRST => "Bob",
SECOND => "Smith",
};
在您的计划中:
use strict;
use warnings;
use Some_data;
my $fist_name = &Some_Data::FIRST; # Note the use of the ampersand!
不太干净,因为你需要在常量前面添加一个&符号。有办法绕过那个&符号,但它们并不是那么漂亮。
现在,您可以在程序中导入数据,而且维护起来并不比JSON数据结构更难。除了use Module;
获取该数据外,您的程序无需执行任何操作。
这是我以前做过的一个。我只是有一个看起来像你在命令行上放置的配置文件,然后使用Getopt::Long来提取配置:
-first Bob -last Smith
-phone 555-1212
注意:如果你把它全部放在一行上并不重要:
use strict;
use warnings;
use Getopt::Long qw(GetOptionsFromString);
open my $param_fh, "<", $param_file;
my @parameters = <$param_fh>;
close $param_fh;
my $params = join " ", $parameters # One long string
my ( $first, $phone );
GetOptionsFromString ( $params,
"first=s" => \$first,
"phone=s" => \$phone,
);
你不能比那更容易维持!