リファレンスについて教えて下さい

このQ&Aのポイント
  • リファレンスについて教えてください。データ構造を持つ%hResultから、ArrayRef1の要素とSCALAR1,SCALAR2を使用したいが、正しい記述方法がわかりません。
  • リファレンスについて教えてください。%hResultというデータ構造から、ArrayRef1の要素とSCALAR1,SCALAR2を使いたいが、どのように記述すればよいのかがわかりません。
  • リファレンスについて教えてください。%hResultというデータ構造から、ArrayRef1の要素とSCALAR1,SCALAR2を使用したいのですが、正しい書き方がわかりません。
回答を見る
  • ベストアンサー

リファレンスについて教えて下さい

      KEY     VALUE %hResult----RetCode ---- 0     ----Contents --- \%Hash1       KEY     VALUE %Hash1------MainContents--\@ArrayRef1    ------List     \%Hash2       KEY     VALUE %Hash2------NAME----------SCALAR1    ------TYPE----------SCALAR2 上のようなデータ構造をしている%hResultを サブルーチンから返却してきます。 %hResult から記述して、 1.ArrayRef1の要素を使用したい 2.SCALAR1,SCALAR2を使用したい のですが、記述が良く分かりません。 どなたか教えて頂けませんか?

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

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

  • ベストアンサー
  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.1

#こんちはっ %hResult = foo(); sub foo { my (%Hash, %Hash2,@ArrayRef1); %Hash1=(MainContents=>\@ArrayRef1, List=>\%Hash2); %Hash2=(NAME=>'SCALAR1',TYPE=>'SCALAR2'); @ArrayRef1 = ('item1','item2','item3'); (RetCode=>0, Contents=>\%Hash1); } ってことですか? Ans1. #ArryaRef1[0] $hResult{Contents}{MainContents}[0]; #@ArrayRef1 @{$hResult{Contents}{MainContents}}; Ans2. # $Hash2{NAME} $hResult{Contents}{List}{NAME}; # $Hash2{TYPE} $hResult{Contents}{List}{TYPE}; という感じ...

t-hiyori
質問者

お礼

で・き・ま・し・た!! ありがとうございます。×200ぐらい ポインタとか苦手でして、助かりました。 来週一週間が期限のツールを作っていまして、 また何かあったら是非お願い致します。

関連する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
  • ハッシュのリファレンスを用いた処理

    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・DBIでの汎用selectサブルーチンを作成するには?

    Perl・DBIで、select文発行のサブルーチンを作成していますが、未熟なため、完成できません。 呼び出し側では、下の記述のように、サブルーチンの引数として、SQL文を渡し(SELECT系)、戻り値として、SELECTされた結果を取得したい(配列もしくは、ハッシュで)と思っております。 もし、参考にできる、サイト・ サンプルサイト等のご紹介でも、結構ですので、ご教授くださればと思います。(処理の流れ等の箇条書きでもかまいません。) -------------------------------------------- # 呼び出し側(メインルーチン) $name;#テンプレート置換変数  $age; #テンプレート置換変数 my $sql =<<"EOQ"; # この抽出select文はその都度変わる。 select NAME,AGE from EMP EOQ my @row = &do_select($sql); $name = $row[0]; $age = $row[1]; もしくは、 $name = $hash_ref->{NAME}; $age = $hash_ref->{AGE}; のような記述で代入。 # テンプレートを読み込んで、置換処理で代入 ※幾分省略しています。 <table> for(){# SELECT分の結果の行数分繰り返し処理。 <tr>  <td>$name</td>  <td>$age</td> </tr> } </table> my $dbh = DBI->connect($dbhost, $dbuser, $dbpass) || die $dbh::errorstr; ##### select発行サブルーチン ####### sub do_select{ my $sth; my $rv; my @row; # 戻り値(フィールドが入る) my %dbhash; # 戻り値はこちらかな? my $sql = shift(@_); # select文 $sth = $dbh->prepare("$sql"); $rv = $sth->execute || die $sth->errstr; while($hash_ref = $sth->fetchrow_hashref){      # print "$hash_ref->{TITLE}<br>"; # ここに、何かの処理が入る } return @row; }

    • ベストアンサー
    • Perl
  • 複数選択した情報をそのまま次のステップに移行させる方法

    PHP5.2.4を使用しています。 ちょっとPHPと直接関係があるかは分かりませんがお願いします。 選択メニューで複数選択できるようにnameをkey[]として設定して、 例えばこの場合はaとbを選択します。 送信ボタンを押して次の[form2.php]に移ったとします。 そこでprint_r($_POST['key']);とすると、 Array([0] => 'a' [1] => 'b') と表示されるのですが、この$_POST['key']をhiddenで <input type="hidden" name="key[]" value="{$_POST['key']}"> ともたせたいのですが、このやり方だと次の[form3.php]に 移ったときにはprint_r($_POST['key']);とすると Array としか表示されません(当たり前かもしれませんが・・・) これをなんとかして <input type="hidden" name="key[]" value="{$_POST['key']}"> このような持たせ方で移行させる方法はないでしょうか? つまり、 <input type="hidden" name="key1" value="{$_POST['key'][0]}"> <input type="hidden" name="key2" value="{$_POST['key'][1]}"> とはしたくないのです。 [form1.php] <select name="key[]" size="3" multiple> <option value="a">あ</option> <option value="b">い</option> <option value="c">う</option> </select> [form2.php] <input type="hidden" name="key[]" value="{$_POST['key']}">

    • ベストアンサー
    • PHP
  • タグの内容をxsl:variableのname属性に使いたい

    立て続けに2つめの質問してしまい恐縮ですがよろしくお願い 致します。 やりたい事をストレートに記述しますと <work> <name>hoge</name> <x>0.5</x> </work> というwork要素があった場合に <xsl:template match="work"> <xsl:variable name="<xsl:value-of select="x"/>"> <xsl:value-of select="name"> </xsl:variable> </xsl:template> ということがしたいのですが、これではxsl:variableのnameの 箇所で当然エラーが出てしまい出来ません。 上記のように任意のタグの内容をxsl:variableのnameに使用 することは出来ないのでしょうか? よろしくお願い致します。

    • 締切済み
    • XML
  • ファイル内で重複している数と重複した回数

    開くファイルの中身は数字のみ。 1行に一つずつ数字が入っており、 それが何行にもわたり続くファイルです。 ファイル内で重複している数と重複した回数を数えたいです。 以下のようなスクリプトを使ったのですが、 結果を表示させようとすると global symbol"$hash" requires explicit package name. にエラーが出ます。 何故なのでしょうか。 use strict; # ファイルを開く my $INPUT_FILE; open ($INPUT_FILE, ">numbers.dat") or die “Can't open. \n”; # それぞれの数をハッシュキーにする。そして対応するバリューを同じ数を見つける度毎にカウントアップする。 my %hash = (); while (my $line = readline($INPUT_FILE)) { chomp $line; $hash{$line}++; } # キーでソートし、結果を表示する。 my @keys = sort keys %hash; foreach my $key (@keys) { print “$key is found $hash{$key} times\n”; } close ($INPUT_FILE) or die “can't close the file\n”;

    • ベストアンサー
    • Perl
  • Ruby ハッシュ継承クラス、作成方法について

    ハッシュを拡張し、値をキーで指定した範囲内から取得したいと思っているのですが、ハッシュと同じように作成できないのでしょうか? 試行錯誤してみたのですが、記述が分かりません・・・。 class Range_List < Hash  #  # 範囲に対応する、値を取得(速度が気になりますが・・・)  #  def [](other)   @list.each { |range, value|    return value if range === other   }   nil  end end # 角度 (0..1) に対応する、十キーのリストを作成 angle_to_direction = Range_List{  # => エラー。このような記述で呼び出したい  0.0625..0.1875 => 3,  0.1875..0.3125 => 2,  0.3125..0.4375 => 1,  0.4375..0.5625 => 4,  0.5625..0.6875 => 7,  0.6875..0.8125 => 8,  0.8125..0.9375 => 9,  0.9375..1    => 6,  0..0.0625    => 6 } # 角度対応の十キーを求める p angle_to_direction[0.1]  # => 3 どうかご回答お願いいたします。

    • ベストアンサー
    • Ruby
  • jqueryで要素がない場合

    貴重なスペースをお借りして質問させていただきます。 jqueryについてご質問させていただきます。 例えば下記のような記述があるとします。 var hogeheight = $('#contents1').height() + $('#contents2').height() + $('#contents3').height(); 上記のhogeheightの値を使ってなにかするとします。 このjsをいろいろなところで使用したいのですが、ページによっては#contents1と#contents3しかなかったり、#contents2と#contents3しかなかったりしますが、その場合はやはり要素がなかったら値を0にするような記述をすべきでしょうか。。 実際にやってみたところ、問題なく動いていて、consoleをみてもエラーは出ませんが、実際には取得しようとするので重くなってしまうとはおもうのですが。。 すみませんよろしくお願い申し上げます。

  • Mapから特定のキーの情報を取得したい

    MapからforEachを使用してkeyとvalueを取得する際、下記のように記述すると思います。この時、forEachを使用してtestMapからkeyArrayに一致するkeyの情報だけ取得することはできますでしょうか? keyArray: number[] = [1, 2, 3]; testMap.forEach((value, key) => { });

  • 【validation.xml】長さの入力チェック

    いつもお世話になっております。 validation.xmlを使用しての長さ入力チェックについてご教授ください。 validation.xmlで、下記の指定をした場合、文字列の長さが100でチェックがかかりますが(半角でも全角でも)、 文字数ではなくバイトでチェックをかける方法はどのように記述すればよろしいでしょうか? <form name="TestForm">  <field property="freearea" depends="maxlength">   <arg0 key="フリーエリア" resource="false"/>   <arg1 key="${var:maxlength}" resource="false"/>   <var>    <var-name>maxlength</var-name>    <var-value>100</var-value>   </var>  </field> </form>