2016-08-17 6 views
0

ハッシュを格納するためにグローバル%ENVを(ab-)使用します。これは%ENVでは通常のハッシュよりも異なるように見えます。下のプログラムでは、$ENV{myhash}にはまだ'myhash' => 'HASH(0x7ffad8807380)'が含まれており、%ahashは依然として周囲にあります。その文字列を単に格納するのではなく、その位置のポイントに戻ることが可能ですか?私は、代わりにハッシュをシリアライズしてシリアル化することができたと思います。これを行う正しい方法は何ですか?perlが%でハッシュを格納ENV

#!/usr/bin/perl -w 

use common::sense; 
use Data::Dumper; 

my %QENV = (nohash => 'noh'); 
my %ahash= (hv1 => 'htext1', hv2 => 'htext2'); 
$QENV{'myhash'} = \%ahash; 
print "works: ". Dumper(\%QENV)."\n\n\n"; 


$ENV{'myhash'} = \%ahash; 
print "fails: ". Dumper(\%ENV)."\n"; 
+3

いいえ。システム環境変数はperlとは関係ありません。 perlのデータ構造を格納することはできません。プレーンテキストにシリアル化してから、そのシリアル化されたテキストをvarに格納する必要があります。 –

+2

これをやりたがっている理由は何ですか? – stevieb

+0

たとえば、あるモジュールでhttpセッションハッシュを%ENVに保存すると、他のperlモジュールやルーチンがhttpセッションが存在するかどうかを確認できます。私たちがそれを持っているかどうかによって違うことをしているだけで、定義された($ ENV {'myhash'}と... ...)の実行だけで、私は '' no strict vars ''のトリックを知っていますか?私は%ENVがプロセス自体にバックアップを継承していないと考えました –

答えて

5

は魔法のハッシュです。プロセスの環境を反映します。それを読むことは環境から読み込み、それを書くことは環境を変える。

参照変数がまだ有効であることが保証されている場合(まだ有効範囲内にあるか、またはREFCNTが増加していることによって)、アドレスから参照変数を作成できます。

use strict; 
use warnings; 

use Data::Dumper; 

use Inline C => <<'__EOS__'; 

    SV* _newRV(IV iv) { 
     return newRV((SV*)iv); 
    } 

__EOS__ 

my %hash = (a => 1, b => 2); 
my $ref = \%hash; 
my $ref_string = "$ref"; 
my $addr = hex(($ref_string =~ /\((.*)\)/)[0]); 
my $ref2 = _newRV($addr); 
print(Dumper($ref2)); 

私はあなたがこれをしたいと考えていません。あるプロセスが別のプロセスが別のプロセスのメモリにアクセスできないため、別のプロセスがデータにアクセスすることを許可しません。

+0

ダーク(繁殖バックアップ時):グローバル変数を簡単に挿入できるようにするのはとても便利だと思いました。 'はい5.018'はグローバルなものを使用していますが、これは%ENVについても同じことが言えます。それはグローバルです。新しいハッシュを使用してvarsを生成し、それが戻って伝播しないようにすることは有用なトリックでもありました。ありがとう –

+1

wut ///あなたは何を意味するのか分かりません「伝播する」。子供から親に情報を渡すことができないと言っていますか?真実。親から子への情報の受け渡しにも使用できません。 ///実際、 'use 5.018'はレキシカルスコープであり、グローバルではありません。//アンチ・アンチ・グローバル・ラントはどうですか?誰もあなたがグローバルを使うことはできないと言った。理由はほとんどありませんが、そうではありません。 'my'の代わりに' our'を使って宣言することができます。 ///数値がアドレスでも、リファレンスを作成するために 'newRV'を使用しているのか分かりません。 – ikegami

+0

データ構造をJSONとしてシリアル化し、それを取得できますか?しかし、それはちょっとした種類のIPCです。 – Sobrique

1

データを共有したいようです。ここでは、JSONファイルにデータを格納し、それを取得する方法を示す例を示します。 JSONはクロスランゲージなので、Perlだけでなく多くのプログラミング言語でデータを使用できます。この例は単一のスクリプトの中にありますが、それは2つの異なるPerlアプリケーションであると想像してください:

use warnings; 
use strict; 

use JSON; 

my $file = 'data.json'; 

my %h = (
    foo => 'bar', 
    raz => { 
     ABC => 123, 
     XYZ => [4, 5, 6], 
    } 
); 

my $json = encode_json \%h; 

# write the JSON to a file, and close it 

open my $fh, '>', $file or die $!; 
print $fh $json; 
close $fh or die $!; 

# open the JSON file, and read it 

open my $json_file, '<', $file or die $!; 

my $read_json; 

{ 
    local $/; 
    $read_json = <$json_file>; 
} 

my $perl_hash = decode_json $read_json; 
関連する問題