配列とハッシュの要素比較に基づいてファイルに書き出す方法

このQ&Aのポイント
  • 配列Aとハッシュの配列Bについて要素を比較し、ファイルに書き出す方法を探しています。
  • パターンマッチを使用して、Aにしか存在しない要素をファイルに出力したいです。
  • 両方に存在する要素の場合は、Aをファイルに出力する方法を教えてください。
回答を見る
  • ベストアンサー

配列とハッシュの配列の要素を比較してファイルに書き出したい

配列Aとハッシュの配列Bがあり、配列の内容をファイルに書き出そうとしています。このとき、パターンマッチをして、Aにしかない場合はAのデータを、Bにしかない場合はBを、両方にある場合は、Aをファイルに出力しようとしています。 以下のようなループのまわし方をしようとして、試行錯誤しましたが、うまい方法を思いつくことができませんでした。 ご教授いただければうれしいです。 while (defined $A[$i]) {  my ($name, $pass);  $j=0;  while (($name, $pass) = each(%{$B[$j]})){    if ($A[$i] =~ /$name/) {    }    $j++;  } $i++; }

  • Perl
  • 回答数3
  • ありがとう数0

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

  • ベストアンサー
noname#37358
noname#37358
回答No.3

いくつか不明な点があります。 ・Bの要素は、キーと値のどっちを出力するのか。 ・出力の順番はどういう風なのか。 とりあえず、比較部分として私が思いついたのは、 ・Aにある要素をまず出力する。 ・この時、Bにも要素があるのならBから要素を削除する。 ・Bの残った要素を出力する。 という方法です。 ただし、配列Bの中身をいじくりたくないのであれば、いったん中身を(ハッシュリファレンスの中身も含めて)コピーする必要があります。 ですが、比較部分が一回で済むのでそれなりに効率は良いと思います。

その他の回答 (2)

  • naoto0314
  • ベストアンサー率34% (25/73)
回答No.2

ちょっと気になったんですけど、ハッシュに名前がついていないように見えます。 全ての連想配列要素に処理を行なう場合は  while (($name, $pass) = each(%変数名)){ でよかったと思います。

  • togino
  • ベストアンサー率75% (97/129)
回答No.1

B というのは、ハッシュの配列なんですよね。  $j=0;  while (($name, $pass) = each(%{$B[$j]})){   $j++;  } これでは、おかしいですよ。 ハッシュの配列なんですから、B は2重ループになるはずです。  for($j = 0; $j < @B; $j ++){   while (($name, $pass) = each(%{$B[$j]})){   }  } --- ただ質問文のプログラムでは > Bにしかない場合はBを というのが得られないと思うんですが・・・(汗)

関連するQ&A

  • 静的ハッシュの配列のキーに対応する値の数の多さ順で表示させたい

    ハッシュのキーに対応する値の数の多さ順で表示させたいと考え、下記の所まで試行錯誤しておりますが、どうにも思ったようにソートできずにおります。 #!/usr/bin/perl use strict; my(%a, $i, $j ,$allarray ,@keys ,@keys2 ,%hash ,%files ,$a_mumei_ref ,$key ,$value ,@value ,$x ,$files); # ハッシュの配列を静的に作る %a = ( '0' => [ qw(0) ], '1' => [ qw(1 1) ], '3' => [ qw(3 3 3) ], '7' => [ qw(7 7 7) ], '2' => [ qw(2) ], '4' => [ qw() ], '5' => [ qw() ], '6' => [ qw() ], '8' => [ qw(8 8) ], '9' => [ qw(9) ], ); @keys = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %a; #ハッシュのキーを数字順で表示 foreach (@keys){ print $_ ."\n"; } # 静的に作ったハッシュの配列を取り出してみる foreach $i (sort keys %a) { for ($j = 0; $j <= scalar(@{$a{$i}})-1; $j++) { print '$a{'. $i. '}['. $j. ']='. $a{$i}[$j]. ' '; } $allarray=scalar(@{$a{$i}})-1; print "No$i:kosuu:$allarray"; print "\n"; #配列の値の個数を調べその配列を作成 my($a_mumei) = $allarray; $a_mumei_ref = \$a_mumei; $files{"$i"}=($i,$a_mumei_ref); } #each関数で%filesの中身を表示 while ( ( $key , $value ) = each %files ){ print "key:$key value:$$value\n" ; } #試行錯誤 foreach $x (sort { $files{$b} <=> $files{$a} } keys %files){ print "$x => $files->{$x}\n"; } @keys2 = sort {$hash{$a} <=> $hash{$b}} keys %files; #@keys2 = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %files; #@keys2 = sort { $hash{$a} cmp $hash{$b} } keys %files; print "@keys2\n"; print "\n"; __END__; 私のイメージしておりますのは、ソートした結果がハッシュのキーに対応する値の数の多さ順で下記のように表示させたいのですが、 どのようにすれば可能でございますか、ご教授願えませんでしょうか key:3 value:2・・・この場合valueは配列の個数 key:7 value:2 key:8 value:1 key:1 value:1 key:9 value:0 key:2 value:0 key:0 value:0 key:6 value:-1 key:4 value:-1 key:5 value:-1

    • ベストアンサー
    • Perl
  • 動的配列が存在(要素が有る)か否かを判定できますか?

    VBAで、「For ループが初期化されていません」エラーが発生します。 動的配列が要素0の時に発生するようです。 動的配列の要素が生成された場合だけ、Forループしたいのですが、 どうやって判定すればよいのでしょうか? ------------------------------- Dim 配列() As Integer Dim i As Integer i = 0 If (i < 0) Then ' 本当は真になったり偽になったり ReDim 配列(0 To i) 配列(i) = a + b i = i + 1 End If '' if ★★★ then '' 配列が有るか確認 For Each c In 配列 MsgBox c Next '' end if -------------------------------

  • Perlでハッシュや配列で重複するキーについて

    ハッシュで重複するキーが値となるので、このハッシュはabdの3つのキーしか存在しないということでしょうか? %a = ('a'=>1, 'b'=>2, 'a'=>3, 'd'=>4); また、配列の場合はabadと4つ数になるということでしょうか? @a = ('a','b','a','d'); この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。

    • ベストアンサー
    • Perl
  • 配列のファイル出力について

    fortranでできるファイルへの配列の出力をC言語でどのようにプログラムするか教えて頂きたいと思います。 2次元配列a(i,j)の出力はfortranでは以下のようなプログラムになります。 open(10,.省略...) ファイルを指定して開く do j=1,ny                ループj   write(10,'(100f10.3)') (a(i,j),i=1,nx) ループi+書き出し enddo                  ループjの最後尾  close(10)                ファイルを閉じる 100f10.3というのは小数点3桁の実数で10カラムで表現したものが100個並ぶという意味です。これと同じことをやるC言語プログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 C言語にはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。

  • 配列やハッシュで中身が同じか簡単に調べることは可能でしょうか?

    スカラ型なら my $a = "a"; my $b = "b"; if( $a eq $b)の用に比較が簡単に出来ますが、 配列やハッシュはどのように中身が同じかどうか調べることは可能でしょうか? 配列でも複雑な(例えば配列のデータがハッシュ値)のような以下の ものを中身が同じが比較する方法です。 固定でなく、どんなデータが入ってきても数やキーが異なっても比較する方法が知りたいです。 my @ary1 = (); $ary[0]{'test_a'} = "a"; $ary[0]{'test_b'} = "b"; $ary[1]{'test_a'} = "aa"; $ary[1]{'test_b'} = "bb"; my @ary2 = (); $ary[0]{'test_a'} = "aa"; $ary[0]{'test_b'} = "bb"; $ary[1]{'test_a'} = "aaa"; $ary[1]{'test_b'} = "bbb";

    • ベストアンサー
    • Perl
  • 配列のファイルへの出力について

    fortranでできるファイルへの配列の出力をJAVAでどのようにプログラムするか教えて頂きたいと思います。 2次元配列a(i,j)の出力はfortranでは以下のようなプログラムになります。 open(10,.省略...) ファイルを指定して開く do j=1,ny                ループj   write(10,'(100f10.3)') (a(i,j),i=1,nx) ループi+書き出し enddo                  ループjの最後尾  close(10)                ファイルを閉じる 100f10.3というのは小数点3桁の実数で10カラムで表現したものが100個並ぶという意味です。これと同じことをやるJAVAプログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 JAVAにはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。 この質問は、C言語について以前質問したものですQNo.3590702。 JAVAだったらどうなるだろうと思ってお尋ねしています。

    • ベストアンサー
    • Java
  • 動的なハッシュの配列を作成したい

    #お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか #!/usr/bin/perl #想定される配列 @array=(0,2,4,6,8,1,3,5,7,9); #下記が最終的に動的に作成したいハッシュの形です。 %List = ( '0' => [ (@array0_n) ], '2' => [ (@array2_n) ], '4' => [ (@array4_n) ], '6' => [ (@array6_n) ], '8' => [ (@array8_n) ], '1' => [ (@array1_n) ], '3' => [ (@array3_n) ], '5' => [ (@array5_n) ], '7' => [ (@array7_n) ], '9' => [ (@array9_n) ], ); $a='array'; $n='_n'; foreach (@array){ #試行錯誤中... print "\@{${a}[$_]{$n}}=@{${a}[$_]{$n}}"; } __END__; お忙しいかとは存じますが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ハッシュの配列を作ることは可能でしょうか?

    次のようなファイルがある場合、%hash1と%hash2を同じ配列として扱いたいと思っています。 例えば、hash[0]{A}とアクセスすれば'01'、hash[1]{B}とアクセスすれば'002'となるようにしたいと思っています。ご教授ください。 -------------------- A B C 01 001 0001 02 002 0002 %hash1 = {'A'=>'01', 'B'=>'001', 'C'=>'0001'}; %hash2 = {'A'=>'02', 'B'=>'002', 'C'=>'0002'};

    • ベストアンサー
    • Perl
  • ハッシュのハッシュの値代入で悩んでいます

    2次元風配列$yaoya_array[$i][$j]から、ハッシュのハッシュ%yaoyaを作成しようとしています。 $yaoya_array[$i][$j]の[$j]の部分は、添え字によって、以下のようなデータを表します。また、NULLの場合もあるとします。 #--- $yaoya_array の中身 $yaoya_array[$i][0] 品物の名前 $yaoya_array[$i][1] 品物の個数 $yaoya_array[$i][2] 品物の値段 上記のデータがダブりもありで、下のように複数個存在します。 #--- $yaoya_array の中身 $yaoya_array[0][0] = 'みかん'; $yaoya_array[0][1] = 3; $yaoya_array[0][2] = ''; $yaoya_array[1][0] = 'みかん' $yaoya_array[1][1] = ''; $yaoya_array[1][2] = 300; 上記のデータから、下記のようなハッシュのハッシュ%yaoyaを作成しようとしています。要するに、ばらばらに存在する品物のデータをまとめようとしています。 %yaoya = ('みかん' => {'個数' => 3, '値段' =>300}); そこで、下記のようにしてみたのですが、forループが終わった時には、'kosuu'に何も入っていません。具体的には、1回目のループで'kosuu'=>3、'nedan'=>""になり、2回目のループで'kosuu'=>""、'nedan'=>300となってしまい、'kosuu'=>3が保存されていないみたいです。ifでNULLの場合は値を代入しないようにしているつもりなのですが…。 ループ終了時に'kosuu'=>3、'nedan'=>300となるようにするには、どうすればよいのでしょうか? #-- %yaoya の作成 for my $i( 0 .. $#yaoya_array ){ if( $yaoya_array[$i][1] ne "" ){ %yaoya = ( $yaoya_array[0] => {'kosuu' => $yaoya_array[$i][1]} ); } if( $yaoya_array[$i][2] ne "" ){ %yaoya = ( $yaoya_array[0] => {'nedan' => $yaoya_array[$i][2]} ); } }

    • ベストアンサー
    • Perl
  • ハッシュのハッシュを実現したい。

    ハッシュのハッシュを行いたいですがうまくいきません。 ◆正しい例 %ultraman = ( TARO => { cpu => "Celeron(266MHz)", memory=> "32MB", hdd => "4.3GB", }, JACK => { cpu => "Pentium2(333Mhz*2)", memory=> "128MB", hdd => "9GB*4", }, ); $name = "JACK"; $item = "cpu"; print "\$ultraman{$name}{$item}=[$ultraman{$name}{$item}]"; exit(0); __END__ ◆このように使えたら便利(要はハッシュの代入でハッシュのハッシュを実現したい) %a=(); %b = ("cpu"=>"aaaa", "memory"=>"bbbb"); $a{'JACK'} = %b; #---> このように代入したい $name = "JACK"; $item = "cpu"; print "\$a{$name}{$item}=[$a{$name}{$item}]"; exit(0); __END__

    • ベストアンサー
    • Perl

専門家に質問してみよう