2014-02-21 42 views
0

已存在任何便攜式序列化方法/模塊什麼被包括在覈心模塊?我知道這裏是Storable,但它不是真正的便攜,也不是「跨平臺的標準化」。尋找像YAML,JSON,XML或類似的東西...Perl的便攜式序列僅與核心模塊

我已經chchcked http://perldoc.perl.org/index-modules-T.html - 但也許錯過了一些東西。

動機:想要製作一個簡單的perl腳本什麼將與任何Perl(無CPAN)一起使用,並且可以從文件讀取一些配置(和數據)。使用require與數據::自卸車格式是不是很「人性化」 ......

所以可能的解決方案:

  • 包括像YAML直接給我的腳本(可以是一個解決方案,但.. 。)
  • 迫使用戶安裝CPAN模塊(未解決)
  • 使用本地Perl和require - 不是很用戶友好的語法(非Perl用戶)

其他建議的解決方案?

ps:理解需要保持核心儘可能小而合理,但讀數據有些標準格式可能嗎?應該在一個核心...

+3

[作爲單個Perl正則表達式的JSON解析器](http://www.perlmonks.org/?node_id=995856) – toolic

+0

如果您完全解釋了*爲什麼不能使用CPAN模塊,可能會有所幫助。您提到不想讓用戶安裝模塊;這些最終用戶還是內部用戶?你必須支持哪些操作系統?有[封裝工具](https://metacpan.org/pod/pp)可以幫助你分發你的程序和它的依賴關係,但是沒有更多的細節,很難說這對你是否是一個可行的解決方案。 – ThisSuitIsBlackNot

回答

4

有一個YAML解析器和串行用Perl捆綁,隱藏起來。這就是所謂的CPAN::Meta::YAML。它只能處理YAML的一個子集,但可能足以滿足您的目的。

+2

'corelist CPAN :: Meta :: YAML':'CPAN :: Meta :: YAML首次與perl v5.13.9發佈' – toolic

+4

哦,我怎麼能忘記...?! JSON :: PP還附帶Perl 5.13.9及以上版本! – tobyink

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" 
} 

這可能讓你最的方式對互操作性?該模塊有很多控制/改變輸出的選項,例如冷凍櫃和烤麪包機的選擇。

+0

這不會有幫助,因爲我們不能僅僅評估該格式來加載數據。 – amon

+1

如果您不能將它看作JSON,它如何幫助將輸出製作爲JSON? – TLP

+0

看起來有效的JSON給我,並http://jsonlint.com/。當然,它缺少Data :: Dumper添加的通常的「$ VAR1 =」序言,並且在Perl中更易於評估,但如果這是一個問題,那麼Perl代碼可以將它添加回來? –

1

你能再解釋一下Storable的問題嗎?如果你看Perlport,在討論Bigendiness和Littleendiness後,它得出結論:

可以用兩種方式來回避這兩個問題。無論是傳輸和存儲數字總是文本格式,而不是原始二進制文件,或考慮使用模塊,如Data :: Dumper可存儲(包括自perl 5.8)。將所有數據保存爲文本可以顯着簡化事宜。

因此,可保存的是普遍用於存儲和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, 
); 

你不能得到比這更容易維護!

+0

這個問題並不完全清楚,但OP似乎希望*用戶*能夠編寫配置文件。因此,希望避免使用Data :: Dumper:要求非程序員使用Perl語法編寫配置文件並不理想。 – ThisSuitIsBlackNot

+0

模塊可能是用戶配置自己數據的最簡單方式。你給他們的基本結構,它比JSON文件更容易維護。畢竟,如果你是一名Perl開發人員,那只是Perl。還有一種可能性,那就是使用Getopt :: Long來讀取配置文件,就像讀取從程序傳入的參數一樣。也許我會將其附加到我的答案中。 –