5

Data::Dumper次の行に沿って、を使用して作成されたテキスト ファイルがあるとします。

my $x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];

そのファイルを読み込んで戻ってきたいです$x。私はこれを試しました:

my $vars;
{
  undef $/;
  $vars = <FILE>;
}

eval $vars;

しかし、うまくいかなかったようです-$x定義されていないだけでなく、使用しようとすると警告が表示されます

グローバル シンボル $x には明示的なパッケージ名が必要です。

これを行う正しい方法は何ですか?(そして、はい、私はそれが醜いことを知っています。これは、生命維持システムなどではなく、クイック ユーティリティ スクリプトです。)

4

9 に答える 9

11

これは、いくつかの異なるオプションを提供するスレッドです: Undumper

データの永続性だけを探している場合は、Storable モジュールが最適です。

于 2009-01-06T20:40:33.260 に答える
10

他の人がすでに言っているように、おそらくデータをより適切なシリアル化形式で保存する方がよいでしょう:

  • 保存可能- これは迅速かつ簡単ですが、かなり Perl 固有です (ただし、比較的重要でないスクリプトでの迅速な解決策に対するニーズを簡単に満たすことができます)。
  • YAMLモジュール、またはYAML ::Tiny、またはYAML::Anyをラッパーとして使用して、システムで使用可能な JSON モジュールを利用するYAML 。
  • JSONモジュールを使用するJSON 、または高速化のためにJSON::XS (または、システムで使用可能な JSON モジュールを利用するためのラッパーとしてのJSON::Any )
  • XML、XML-Simpleモジュール、またはその他の XML モジュールのいずれかを使用します。

個人的には、YAML か JSON を目指すと思います。

my $data = YAML::Any::LoadFile($filename);

于 2009-01-06T23:03:14.640 に答える
8

デフォルトでは、特にダンプされるデータ構造が何らかの方法で循環している場合、Data::Dumper出力をevalで解析することはできません。ただし、設定することはできます

$Data::Dumper::Purity = 1;

また

$obj->Purity(1);

ここobjで、はData::Dumperオブジェクトです。これらのいずれかにより、Data::Dumperはevalで解析できる出力を生成します。

詳細については、CPANのData::Dumperドキュメントを参照してください。

于 2009-01-06T21:56:47.943 に答える
6

Rich が言うように、永続化のために Data::Dumper を使用するのではなく、Storableのようなものを使用したいでしょう。

しかし、尋ねられた質問に答えるために... IIRC、Data::Dumper はあなたの変数が であると宣言していませんmy

データを取り戻せるようにするには、変数がeval 内evalにない必要があります。myテキスト ファイルに次の内容が含まれている場合:

$x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];

次に、これは機能します:

my $vars;
{
  undef $/;
  $vars = <FILE>;
}

my $x;    
eval $vars;
print $x;
于 2009-01-06T21:39:18.227 に答える
3

簡単で人間が読めるものにとどまりたい場合は、 のData::Dump代わりにモジュールを使用してData::Dumperください。基本的に、これは適切に行われます。奇妙な変数などData::Dumperを作成することなく、代入の準備が整った有効な Perl 式が生成されます。$VAR1$VAR2

次に、コードが次のようになっている場合:

my $x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];

次を使用して保存します。

use Data::Dump "pp";
open F, ">dump.txt";
print F pp($x);

dump.txtこれにより、 (少なくとも私のPCでは)次のようなファイルが生成されます。

[{ asdf => undef, foo => "bar" }, 0, -4, [[]]]

次を使用してロードします。

open F, "dump.txt";
my $vars;
{ local $/ = undef; $vars = <F>; }
my $x = eval $vars;

ご了承ください

  1. への割り当てを$/独自のブロックに配置するのが面倒な場合は、 を使用localして、その値が実際にブロックの最後に復元されるようにする必要があります。と
  2. の結果をeval()に代入する必要があります$x
于 2009-01-07T14:55:42.970 に答える
1

このスニペットは短く、私のために機能しました(私は配列で読んでいました)。最初のスクリプト引数からファイル名を取得します。


# Load in the Dumper'ed library data structure and eval it
my $dsname = $ARGV[0];
my @lib = do "$dsname";
于 2009-06-06T17:18:15.053 に答える
1

そのファイルは Data::Dumper によって作成されたものですか? そこにあるべきではありませんmy

その他のオプションには、Storable、YAML、または DBM::Deep があります。Mastering Perlの「Persistence」の章でいくつかの例を見ていきます。

幸運を、 :)

于 2009-01-06T21:40:23.933 に答える
0

入れたいと思います

our $x;

xにアクセスする前にコードに挿入します。これにより、厳密なエラーチェックが満たされます。

そうは言っても、私は他の声に加わってStorableを提案します。

于 2009-01-06T22:00:07.187 に答える
0

これは私にとってはうまくいきます:

書き出す:

open(my $C, qw{>}, $userdatafile) or croak "$userdatafile: $!";
use Data::Dumper;
print $C Data::Dumper->Dump([\%document], [qw(*document)]);
close($C) || croak "$userdatafile: $!";

読み方:

open(my $C, qw{<}, $userdatafile) or croak "$userdatafile: $!";
local $/ = $/;
my $str = <$C>;
close($C) || croak "$userdatafile: $!";
eval { $str };
croak $@ if $@;
于 2009-01-06T22:13:55.503 に答える