Perl便携式序列化仅适用于CORE模块

时间:2014-02-21 16:04:40

标签: perl

是否存在CORE模块中包含的任何便携式序列化方法/模块?我知道这里是Storable,但它不是真正的便携式,也不是“跨平台标准化”。寻找像YAML,JSON,XML等类似的东西......

我已经完成了http://perldoc.perl.org/index-modules-T.html - 但可能错过了一些东西。

动机:想要制作一个简单的perl脚本,它可以用于任何perl(没有CPAN),并且可以从文件中读取一些配置(和数据)。使用带有Data :: Dumper格式的require不是非常“用户友好”......

可能的解决方案:

  • 将YAML直接包含在我的脚本中(可以是解决方案,但是......)
  • 强制用户安装CPAN模块(不是解决方案)
  • 使用原生perl和require - 不是非常用户友好的语法(对于非perl用户)

任何其他建议的解决方案?

Ps:了解需要保持核心尽可能小和合理,但以某些标准化格式读取数据可能吗?应该是一个核心...

3 个答案:

答案 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来提取配置:

CONFIGFILE

-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,
);

你不能比那更容易维持!