• ベストアンサー

変数の永続化?

$hash{'田中'}{'国語'} = 50; $hash{'田中'}{'算数'} = 70; $hash{'田中'}{'理科'} = 60; $hash{'田中'}{'社会'} = 80; ... のようなハッシュ値があり、これをスクリプト実行時に定義するのではなくて、一度登録したら永続的?にファイルか何かに保存して、2回目の実行時には、 print $hash{'田中'}{'算数'};とすると70と表示されるようにしたいのですが、Windows環境では無理なのでしょうか? 永続的に保存できる最大数なども知りたいです。

  • bazax
  • お礼率5% (12/228)
  • Perl
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • okiyoshi
  • ベストアンサー率34% (11/32)
回答No.2

一度生成した構造体を保存、それを復元して利用するという意味ならStorableなんかどうでしょう? Windows環境かどうかはどうでもいいと思いますが、最大数は使えるメモリに依存? use Storable qw( freeze thaw ); my %hash; $hash{'田中'}{'国語'} = 50; $hash{'田中'}{'算数'} = 70; .. # # 構造体をスカラーに変換し、それをファイルに出力 # my $out_data = freeze( \%hash ); # # ファイルから読み込んで構造体に復元 # %hash = %{ thaw( $out_data ) }; # thawはrefを返すので # # 参考:複雑な構造体のsnap shotに # use Data::Dumper; print Dumper( \%hash ); # データの大きさに注意

参考URL:
http://perldoc.jp/docs/modules/Storable-2.05/Storable.pod

その他の回答 (1)

  • sjam
  • ベストアンサー率41% (26/63)
回答No.1

$hash{'田中'}{'国語'} = 50; $hash{'田中'}{'算数'} = 70; $hash{'田中'}{'理科'} = 60; $hash{'田中'}{'社会'} = 80; $hashに値が入る毎に、ファイルに"$hash{'田中'}{'社会'} = 80;"という形式で追記して行き、プログラムの実行のたびに最初にrequireでそのファイルを読み込み&実行すればいかがですか? 又はcsv等形式を決めたデータ形式で保存→必要な時に(ハッシュ値としてではなく)データを読み込みに行くユーザー定義関数として定義するとか。

関連するQ&A

  • ハッシュリファレンスの無名変数

    サブルーチンにハッシュリファレンスを渡すために、 以下のようにすると上手く実行されます。 %hash = ( baa => 1, boo => 2 ); test(\%hash); sub test { my %hash = %{shift}; print $hash{baa}; } これを、%hashに格納せずに、 直接渡そうとすると上手くいきません。 test(\( baa => 1, boo => 2 )); 考え方が間違っているのでしょうか。

    • ベストアンサー
    • Perl
  • エクセルでの集計・・・再度です

    お世話になります。 エクセルでの集計につきまして 思っていたよりも複雑でわからないため、 再度質問させていただきました。 内容 名前 教科名 順位  田中 国語  8 佐藤 算数  5 鈴木 理科  1 山田 国語  2 田中 算数  3 佐藤 算数  4 田中 国語  1 佐藤 理科  2 鈴木 算数  8 田中 理科  11 という感じで、名前・教科・順位の羅列が並んでいます。 同じ生徒がどの教科で、順位がどうであったかを集計したいのです。 ちなみに、もし可能ならば集計時に 1番、2番、3番、4番以下 という風にできればいいなと思っています。 ピポットテーブルを使用すると良いと お伺いしたのですが、この場合でも可能でしょうか? どうぞよろしくお願いします。

  • ハッシュの中身の表示

    ハッシュの中身の確認ができなくて困っています。 下記のような実行文においてです。 当然、test の戻り値は、スカラーとハッシュです。ハッシュを戻すときには参照渡し記号の\もつけています。 my ($return_code, %hash_data) = test(); 表示しようとすると、 Hash(0x5b04) のような表示にしかなりません、、 (試した表示方法は、下記4つです。) (環境は、WindowsXP上での、ActivePerl-5.10.0.1004 です。) foreach $key ( keys( %Hash ) ) { print "キー値 : $key\n"; print "値 : $Hash{$key} \n " } while ( ( $key , $value ) = each %Hash ){ print "キー値 : $key\n"; print "値 : $value \n " ; } use Data::Dump qw(dump); print dump(\%hash); #print %display_test; 宜しくお願いします。

    • ベストアンサー
    • Perl
  • ハッシュのリファレンスを用いた処理

    ActivePerl 5.8 , WinXP SP2の環境です。 Perl スクリプトを用い、ファイルから複数のブロックからなる情報をよみとり、個別のハッシュを作り、それをリファレンスの配列としてまとめて後から参照するという操作をしたいのですが、詰まってしまいました。。 例として読み取るファイルは ---input.txt--------- >1 Jan 1 Feb 4 >2 Mar 9 Apr 3 >3 Oct 8 Nov 4 ------------------ ここから1,2,3の個別のハッシュ {Jan => 1 Feb => 4} {Mar=> 9 Apr =>3} {Oct =>8 Nov =>4} を作成し、それぞれのハッシュのリファレンスの配列をつくり、その後からすべてのハッシュの中身を個別に出力させたいと思いました。 次のようなスクリプトを作成したのですが思ったように作動しません。 use strict; open (IN, "input.txt") or die ("cant open file \n"); my $reff; my @array_of_reff; my %hash; my $count = 0; while(<IN>){ my $line = $_; ######ここでは各ブロックの頭の ">"を認識し、2個目以降であれば直前までで作ったハッシュのリファレンス($reff)を配列@array_of_reffに入れる。 if($line =~ /^>/){ if($count >0){ $reff = \%hash ; push (@array_of_reff, $reff); %hash = (); } $count++; } ########ここではアルファベットが入った行を認識して、ハッシュに追加しています if($line =~ /^[A-Za-z]/){           $line =~ /([A-Za-z]+)\s+/; my $month = $1; $line =~ /\s+(\d+)/; my $day= $1; $hash{$month} = $day;     } ###ここはファイルの最後になったら直前まで作っていたハッシュののリファレンス($reff)を配列@array_of_reffに入れる。 if( eof ){ $reff = \%hash ; push (@array_of_reff, $reff); } } #####ハッシュのリファレンスの配列(@array_of_reff)からもとのハッシュを参照し、ハッシュごとに出力 foreach my $reff_of_hash (@array_of_reff){    print "output";    while( (my $key,my $value) = each %$reff_of_hash ){     print "\n" , $key, " : ", $value, ;    } } このスクリプトを実行すると Nov 4 Oct 8 という3つめのハッシュのなかみが3回出力されてしまいます。自分では3つの別のハッシュをつくっているつもりでも、どうやら1種類しか作れていない、もしくはハッシュが上書きされているようなのですが、原因がわかりません。 この例だけ見るとハッシュのリファレンスを使う必要はないのですが、実際にはもうすこし大きいスクリプトで"ハッシュのリファレンスの配列を他のサブルーチンに渡す"ということを想定しており、これが解決できず先に進めない状態です。 アドバイス、解決法がわかったら教えていただけないでしょうか。

    • ベストアンサー
    • Perl
  • ハッシュキーの内容について

    こんばんは。perlをはじめて一ヶ月あまりの初心者です。 また疑問に思うことが見つかり、質問させていただきました。 以下のようなコードがあります。 ----------------------------------------- my @array = ( 'a','b','c'); my %hash; for (@array) {   $hash{$_}{OK} = 1;   $hash{$_}{WAVE} = 2;   $hash{$_}{Perl} = 3; } print $hash{a}->{OK}; print $hash{"b"}->{WAVE}; print $hash{c}->{"Perl"}; ----------------------------------------- 1、2、3を格納するときなのですが、 ハッシュのキーになる値(OK、WAVE、Perl)は、 ダブルクォートや、シングルクォートで囲っていません。 でも、エラーも発生せず、普通に実行できてしまいます("123"を表示します)。 ハッシュのキーは、 "OK","WAVE"や、'Perl'のように ダブルクォートや、シングルクォートで 囲む必要はないのでしょうか?? C言語みたいに厳密に型が決まっているわけではないので、 OKでも"OK"でもよいのかなー、という思いはあるのですが、、、 よろしくお願いします。

    • ベストアンサー
    • Perl
  • foreach内での$_の書き換え

    数年前にハッシュのデータをforeachで取り出す時、$_をいじると、$_はハッシュのデータと直接つながっているので、ハッシュのデータ(keyは変わらずvalueのほう)が書き換わってしまうと聞き、実際にやってみて書き換わってしまった覚えがあります。 %hash = ("red" => "aka", "green" => "midori", "blue" => "ao", "black" => "kuro"); foreach (%hash){ print "$_<br>\n"; $_ = "modify"; } print "<hr>\n"; foreach (values %hash ){ print "$_<br>\n"; } ↓↓↓↓↓↓html↓↓↓↓↓↓↓ blue ao green midori red aka black kuro ------------------------------------ modify modify modify modify ↑となったはず 先日それを試してみたら書き換わりませんでした。 以前は確かに書き換わった覚えがあります。 perlの仕様が変わったのでしょうか。それとも私が何か間違っているのでしょうか。 詳しい方にお教えいただければと質問しました。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 平均

    小学生の問題です。 かずやさんは国語、算数、理科、社会の4つのテストを受けました。どれも100点満点のテストです。 国語、算数、理科の平均点は国語の点より2点高く、国語、理科、社会平均点は国語の点より6点低い時、算数の点は社会の点より □点 高くなります。 求め方を教えて下さい。

  • perlについて

    perlのなかにリファレンスの機能がありますが%hashって ハッシュがじぜんに定義されている状態で $fields=\%hash; $form{field}=$fields; $form{field}=$fields; $item=\%form; という構造の$item変数があります。 一行で$itemから%hashを呼び出す時の書き方 を教えてください。

    • ベストアンサー
    • Perl
  • Excel VBA 検索して該当行を抽出

    はじめまして、下記のように、Excelでマクロを組みたいのですが 組み方がわかりません。 ご教授願えませんでしょうか。 MS Ofiice2010 生徒数500名ほど シート1には生徒の生徒番号、氏名などがあります。      A     B     C     D 1 生徒番号   氏名   備考 2 120001     田中 3 120002     山田  試験時休み 4 T120009    相田   転入 シート2には生徒の成績表:生徒番号、氏名、国語、算数、理科、社会 生徒番号でソートされていません。      A     B     C     D     E     F    1 生徒番号   氏名   国語   算数   理科   社会   2 120001     田中   80    65     65     75 3 T120009    相田   90    85     80     80 シート1の生徒番号でシート2生徒番号を検索して、該当したら成績を シート1の検索した生徒番号のD列以降にコピーしたいのですが      A     B     C     D     E     F     G 1 生徒番号   氏名   備考   国語   算数   理科   社会 2 120001     田中         80    65     65     75 3 120002     山田  試験時休み 4 5 10 T120009    相田   転入    90    85     80     80 お手数ですが、ご教授願えますでしょうか。 よろしくお願いいたします。

  • アクセス クエリーの作成

    OS:98 Access Version:97 下記のようなレコードの抽出をしたいのですが、どのようにすれば できるのか教えてください。 <テーブル1> 顧客番号 氏名   学年 曜日 時間 科目 111111 田中一郎 中1 月  A1 国語 222222 鈴木太郎 中2 水  B3 算数 111111 田中一郎 中1 月  A2 理科 222222 鈴木太郎 中2 金  B3 社会 <クエリ1> 顧客番号 氏名   学年 曜日1 時間1 科目1 曜日2 時間2 科目2 111111 田中一郎   中1 月  A1  国語  月   A2 理科 222222 鈴木太郎   中2 水  B3  算数  金   B3 社会 このようにしたいのですが、お知恵をお貸し下さい

専門家に質問してみよう