• 締切済み

Storableによる永続化

以下のように、Storableの「store」と「retrieve」を使用して、Bit::Vectorクラスのデータを永続化しようとしています。 すると「Bit::Vector::to_Bin(): item is not a "Bit::Vector" object」とエラーになります。 多分、 @{$array_ref}[$i] をblessしてあげれば良いのではと思うのですが、なかなか上手くいきません。 どなたか、解決方法をご存知の方、いらっしゃいませんでしょうか? 1 use Storable; 2 use Bit::Vector; 3 4 for($i = 0; $i < 3; $i++) { 5 $array[$i] = Bit::Vector->new(20); 6 $array[$i]->Flip(); 7 print $array[$i]->to_Bin(), "\n"; 8 } 9 10 store(\@array, 'store.bin') or die; 11 $array_ref = retrieve('store.bin'); 12 13 for($i = 0; $i < 3; $i++) { 14 print @{$array_ref}[$i]->to_Bin(), "\n"; 15 }

  • Perl
  • 回答数1
  • ありがとう数2

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

単純に to_Hex, from_Hex (あるいは、new_Hex)でファイル出力、ファイル入力から作成でいいような気がします。

iamara
質問者

お礼

連絡が遅くなり大変申し訳ありません。 確かに「to_Hex」, 「from_Hex」でも同じことですが、内部的にBit::Vector->new()する分、スピードが遅いような気がしています。

関連するQ&A

  • requireについて教えてください。

    こんにちは、require について教えてください。 require されるファイルの最終行は 1 を書くのが一般的ですが、 他の値を書くと何か問題があるのでしょうか? 以下の実験をしてみました。 -- require されるファイル array.pl -- #! usr/bin/perl -w use strinct; ['a','b','c',] -- 実行するスクリプト -- #! /usr/bin/perl use strict; my $array_ref = get_array_ref('array.pl'); print "$_n" foreach ( @{$array_ref} ); exit(); sub get_array_ref {   return eval {require $_[0]}; } -- 結果 -- a b c 結果はうまく行ったのですが、eval も含めてこの様な使い方は 間違っていませんでしょうか? よろしくお願いします。

  • DBM::Deepでの配列がうまく動作しない

    DBM::Deepでの配列がうまく動作しない 普段よくgdbmを使うのですが、DBM::Deepを使うと配列も使える人のことで試しているのですが、 ちょっと動作がおかしいです。私が何か間違えているかもしれませんので、一度見ていただければと思います。 --------------------------------- use DBM::Deep; my @array; tie @array, "DBM::Deep", "bar.db" ; # ★3 @array=( [ "123" , "abc" ], [ "456" , "def" ], ); print qq($array[0][1]\n); # ★1 for my $ref(@array){ print "@$ref\n"; # ★2 } --------------------------------- 結果 --------------------------------- abc --------------------------------- これを実行してみますと、★1はちゃんと表示されるのですが、★2が何も表示しません。どうもループにも入りません。。 ここで試しに★3をコメントにしてみますと・・ --------------------------------- 結果 --------------------------------- abc 123 abc 456 def --------------------------------- これはどういう事なのでしょうか? DBM::Deepでは値の列挙ができない・・・のでしょうか。 それとも何か間違えていますでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • 文字列の条件判定

    配列の中身が"00"~"10"でなかったらerrorを出力するプログラムを作りたいです。 以下のようなプログラムを書くと、"20"や"-4"などには対応できるのですが、 英語が入るとエラーが出ません("a0"とか)。また、("22c")などもエラーが出ません。 なぜなんでしょう?そしてどうやって書けばいいのでしょうか・・・。 for( $i = 0 ; $i <= $#array ; $i++ ){    if( ($array[$i] < "00" ) || ( $array[$i] > "10" ) ){       print "$array[$i]\n";       print "error\n";    } }

    • ベストアンサー
    • Perl
  • 繰り返し文における小数の挙動

    以下のような簡単なプログラムを書いて実行させたところ、小数点表示の挙動がおかしくなりました。 ###プログラム ここから #!/usr/bin/perl use strict; use warnings; for(my $i=0.01;$i<=1;$i+=0.001) { print $i,"\n"; } ###ここまで ##結果 ここから . . . 0.685 0.686 0.687 0.688000000000001 0.689000000000001 0.690000000000001 ##ここまで 以上のように、0.001づつ増加する $i に途中から000000000001が加わってしまいます。この000000000001が足される現象をやめさせたいです。原因、解決策等おわかりであれば教えていただけないでしょうか。よろしくお願いします。

    • ベストアンサー
    • Perl
  • C言語でのプログラム

    全対最短経路(フロイドのアルゴリズム)のプログラムを作成したんですが、以下のようなメッセージが出てしまい、どこが悪いのかさっぱりわかりません。どなたかご教授願えないでしょうか? <プログラム> #include<stdio.h> #define NC 999 /* It should be large enough. */ #define N 5 void floyd(int, int [][], int [][], int [][]); int W[N][N] = { { 0, 1, NC, 1, 5 }, { 9, 0, 3, 2, NC }, { NC, NC, 0, 4, NC }, { NC, NC, 2, 0, 3 }, { 3, NC, NC, NC, 0 }, }; int P[N][N]; int D[N][N]; main() { floyd(N, W, D, P); } void floyd(int n, int W[][], int D[][], int P[][]) { int i, j, k; for(i=0;i<n;i++){ for(j=0;j<n;j++){ P[i][j] = 0; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ D[i][j] = W[i][j]; } } for(k=0;k<n;k++){ for(i=0;i<n;j++){ for(j=0;j<n;j++){ if(D[i][k]+D[k][j]<D[i][j]){ P[i][j] = k; D[i][j] = D[i][k] + D[k][j]; } } } } printf("?nall pairs of the shortest pathes:?n"); for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("%3d ", D[i][j]); } printf("?n"); } printf("?n"); } <エラーメッセージ> In function `floyd': :30: error: invalid use of array with unspecified bounds :36: error: invalid use of array with unspecified bounds :43: error: invalid use of array with unspecified bounds :44: error: invalid use of array with unspecified bounds :45: error: invalid use of array with unspecified bounds :54: error: invalid use of array with unspecified bounds

  • warningsの出るタイミングでコマンドを実行するには?

    warningsでメッセージが出るタイミングでコマンドを実行させたいのですが、どうすれば良いのでしょうか?例えばの例として use strict; use warnings; my @array = (1..5, 7..9); my $sum; for(1..9){ $sum += $array[$_]; } このまま実行すると、$_が6,7の時に$array[6],$array[7]が未定義なために警告が出ますが、この警告が出るタイミングで、例えば"print $_\n";などといったコマンドを実行したいと思っています。

    • ベストアンサー
    • Perl
  • perl ファイルのデータを編集したい

    初めまして、perl をやり初めたばかりです。作業は Linux 上で行ってます。 あるテキストファイル data.txt があります。 data.txt の中は、以下のようになっているとします。 100 200 300 400 500 600 これを読み込んで、例えば、 1 2 3 4 5 6 以上の様に各数字を百分の一にして出力したいと思ってます。 一応、色々と調べながらプログラムを書いてはみましたが 思う様に出力されません。以下そのプログラム。 #!/usr/bin/perl open(IN, "data.txt") or die ; @x = <IN>; close (IN); $ref_x = \@x; $n_data = @x; for ($i = 0; $i< $n_data; ++$i) { $$ref_x[$i] /= 100 ; print $x[$i], " "; } print"\n"; どなたか、perl にお詳しい方教えていただけないでしょうか? 宜しくお願い申し上げます。

  • PerlでRSS取得 ~ 文字化け ~ utf8→ShifJIS変換できない

    XML::RSSを使用してRSSのタイトルを取得するPerlスクリプトを作っています。 DBCSの場合、文字化けするので、以下のようにfrom_toを使用してutf8をShiftJISに変換しようとしましたが、エラーが出ます。 SBCSでは問題無いのですが。 Encode::Guessで調べるとutf8が返ってくるので、「from_to( $title, 'utf8','shiftjis' )」でutf8をShift-JISに変換すればよいのかと思ったのですが。 ■環境 ・perl v5.8.3 built for MSWin32-x86-multi-thread ・Windows2000(SP4) ■エラーメッセージ Cannot decode string with wide characters at c:/Perl/lib/Encode.pm line 184. ■ソース #!/usr/bin/perl BEGIN { use CGI::Carp qw(carpout fatalsToBrowser); carpout(STDOUT); } use Encode qw/ from_to /; use LWP::Simple 'get'; use XML::RSS ; print"Content-type: text/html\n\n"; print"<HTML>\n"; print"<HEAD><meta http-equiv=\"Content-Type\" content=\"text/html;charset=Shift-JIS\"></HEAD>\n"; print"<BODY>\n"; my $rss = new XML::RSS; eval {   # $rss->parse( get('http://slashdot.org/slashdot.rdf') );    $rss->parse( get('http://oshiete1.goo.ne.jp/rss/oshiete_goo.xml') ); }; exit if $@; foreach my $ref( @{$rss->{items}} ) {   $title = $ref->{'title'};   $link = $ref->{'link'};   from_to( $title, 'utf8','shiftjis' );   print"[title] $title<br>\n";   print"[link] <a href=\"$link\" target=\"_blank\">$link</a><br>\n";   ----------------------------<br><br>\n"; } print"</BODY></HTML>\n"; RSSの取得方法はここを参考にしました。 http://www.rfs.jp/sb/perl/10/rss01.html 宜しくお願いします。

    • ベストアンサー
    • Perl
  • [Perl]Shift-JISのXMLを解析する場

    行き詰まってしまったので教えて下さい。 <やりたいこと> とあるAPIからXMLファイルを取得し、解析して出力する、ということをやっているのですが、元のXMLがShift-JISでエンコーディングされており、これをUTF-8に変換して出力しようとしています。 <問題> XMLを取得して解析、取り出したいパラメータが出力できるようにはなったのですが、文字のエンコーディングが上手く行っていないためか、文字化けしてしまいます。 <元のXML> <?xml version="1.0" encoding="Shift_JIS"?>  <test>   <prod count=3>    <record>     <code>アイウエ</code>    </record>    <record>     <code>カキクケ-</code>    </record>    <record>     <code>ABC</code>    </record>   </prod>  </test> <XML解析用のコード> #!usr/bin/perl use utf8; use Encode qw/ from_to encode decode /; use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /; use LWP::UserAgent; use XML::Simple; use Data::Dumper; #--XML取得部分省略 #--XMLはgetで$xmlに格納 $from = guess_encoding($xml)->name; &from_to($xml,$from,"utf8"); $XML::Simple::PREFFERRED_PARSER = 'XML::SAX::PurePerl'; $xs = new XML::Simple(); $ref = $xs->XMLin($xml); $xml =~ s/<\?.*\?>//; for($i=0;$i<=$#{$ref->{'test'}->{'prod'}->{'record'}};$i++){  $name = $ref->{'test'}->{'prod'}->{'record'}[$i]->{'code'}; $name = encode('utf-8',$name); print "$i : $name\n"; } <結果> 黒ダイヤに?文字で文字化けして出力される。 どなたか原因がお分かりになりますでしょうか。 よろしくお願いいたします。

  • perl の複雑(?)なクラス定義(データ構造)

    以下のようなクラスを作成したいのですが、どのようにクラスとして定義して、どのように呼び出せばよいのでしょうか。特に「score」の部分の記述方法が良く分かりません。 オブジェクト指向(とくにPerl)はあまり経験がない初心者です。 -------------------- データ構造 name addr score--+-- math +-- english +-- science -------------------- クラス記述 package myClass; $ref_score->{math} = '30'; # <-- 正しい? $ref_score->{english} = '40'; # <-- 正しい? # ... sub new { my $class = shift; my $self={}; $self->{name} = 'tanaka'; $self->{addr} = 'tokyo'; $self->{score} = $ref_score; # <-- 正しい? bless $self, $class; } -------------------- メイン文 package main; $inst[0] = myClass::new(); $inst[0]->{name} = "OVERWRITE_NAME"; $inst[0]->{score}->{math} = "OVERWRITE_SCORE_MATH"; print $inst[0]->{module}."\n"; # 出る print $inst[0]->{score}->{math}."\n"; # オーバーライトした値は出るが... print $inst[0]->{score}->{english}."\n"; # 初期値のままの値は表示してくれない... 宜しくお願いいたします。

専門家に質問してみよう