• ベストアンサー

連想配列とforeach

連想配列 %hogeにおいて、.name の名前が最後に付く配列の値を取り出したいと思い、下記のようにしました。 foreach ($hoge{/.*\.name$/}) {  print "$_\n"; } としてみましたが期待した出力がされませんでした。こういう描き方って出来ないんでしょうか?それともどこか間違ってますか?

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

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

  • ベストアンサー
  • tailkuppa
  • ベストアンサー率53% (52/98)
回答No.1

$_ = "right.name"; print /.*\.name$/; や、 $_ = "chigau.namae"; print /.*\.name$/; の結果を見てみると分かりますが、この正規表現は、そのままで用いると変数 $_ に代入された値のマッチ結果になります。 foreach (keys %hoge) { # ハッシュのキーを一つずつ $_ に代入  if (/.*\.name$/) {   print "$hoge{$_}\n";  } } のように、一旦$_ に代入する形式にすれば、お望みのことは可能だと思います。

yatokesa
質問者

お礼

回る数を減らそうと画策しましたが、配列の数分だけ回らないとだめと言うことですね。 ありがとうございました。

その他の回答 (1)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

ハッシュ(連想配列)のキーに正規表現を書くことはできません。 やるなら、次のようにします。   foreach (keys %hoge) {     print $hoge{$_} if /\.name$/;   } あるいは、   foreach (grep /\.name$/, keys %hoge) {     print "$hoge{$_}\n";   } もしくは、   foreach (map $hoge{$_}, grep /\.name$/, keys %hoge) {     print "$_\n";   }

yatokesa
質問者

お礼

>ハッシュ(連想配列)のキーに正規表現を書くことはできません。 そうですか。出来ると嬉しいこともあるので是非対応して欲しいところです。その分オーバーヘッドが大きくなってしまっては元も子もないですが。 色々書き方があるものですね。勉強になります。 #といっても後半の2つはほとんど意味不明です^^;)。勉強しておきます。 ありがとうございました。

関連するQ&A

  • 連想配列を配列に入れるには

    下記のような連想配列を配列に入れる簡単な方法はありますか。 array("a"=>"1","b"=>"2") 期待する結果(print_r) Array ( [0] => Array ( "a" => "1" ) [1] => Array ( "b" => "2" ) ) 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 連想配列の配列の使い方

    C言語でいうところの構造体の配列(要素は"hoge"と"fuga"のみ)を perlで表現する場合、連想配列の配列にするのが一般的でしょうか? 以下の様なソースコードなのですが、perlらしさが失われている気がします。 perlらしく書くとしたらどう書くのが良いでしょうか? [ソース] @list; #この配列の要素に連想配列を入れる sub input{ #list.txtの中にはhogeとfugaの値がカンマ区切りで記入されている open(IN, "list.txt");  $i = 0; while ($xx = <IN>) { ($list[$i]{"hoge"}, $list[$i]{"fuga"}) = split /,/, $xx; $i++; } close(IN); } sub output{ for($i = 0; $i <= $#list; $i++){ print $list[$i]{"hoge"}, $list[$i]{"fuga"}; } }

    • ベストアンサー
    • Perl
  • 配列や連想配列について

    言語一般の配列や連想配列について 最近どういう解釈をしていいのか わからなくなってしまいました。 仮にPerlで話をさせてもらいますと、 連想配列%FORMがあるとき、 個々の要素にアクセスする場合 例えば$FORM{'name'}などと記述しますが、 この$FORM{'name'}を みなさんはどのように解釈しているでしょうか? $FORM{' '}にキー nameを 代入しているようなイメージで、 「連想配列%FORMからキー'name'の値を取得する」 という考え方でしょうか? わたしは最近、 $FORM{'name'}はそれ自体が一つの変数という 考え方が出来るのではないかという気がしているのですが、 連想配列の実装から考えると この考え方は正しいのでしょうか? 以前、配列について同様の質問を したことがあります。 例えばC言語でint a[100]と宣言した場合は、 連続的なアドレスに確保されるため、 a[2]はaという名前のアドレスから a + 2 番目の場所という意味になるが、 言語によっては不連続なアドレスに 確保されるため、a[2]は一つの変数名として 考える必要がある・・ との回答でした。 ならば連想配列の場合も もし不連続なアドレスに確保されるならば、 $FORM{'name'} は一つの変数名と 考えたほうが正しいのではないかと 思ったからです。 連想配列の内部的な処理がどうなっているのか 教えて頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • foreachで多次元配列にしたくないのですが……

    foreachで多次元配列にしたくないのですが、多次元配列になってしまいます。 なぜでしょうか? ■$hoge Array (  [0] => 3  [1] => 9 ) ■処理 foreach ($hoge as $val){  $result[]= 関数($val); } ■期待している結果 Array (   [0] => Array     (       [id] => 1       [created_at] => 2013-08-01     )   [1] => Array     (       [id] => 2       [created_at] => 2013-08-02     ) ) ■実際の結果 Array (   [0] => Array     (       [0] => Array          (            [id] => 1            [created_at] => 2013-08-01          )     )   [1] => Array     (       [0] => Array          (            [id] => 2            [created_at] => 2013-08-02          )     ) )

    • ベストアンサー
    • PHP
  • foreachと連想配列変数について

    はじめまして。 初めて質問します。 私はあまりプログラム知識がないのですが、PHPに興味があり独学でPHPを勉強しているのですが、よくわからない個所があって困っています。 <?php $list[0]["code"] = "0100:"; $list[0]["name"] = "ミルクパン"; $list[1]["code"] = ""; $list[1]["name"] = "イチゴパン"; $list[2]["code"] = "0301:"; $list[2]["name"] = "メロンパン"; foreach($list as $data) { $product = ""; foreach($data as $value) { if ($value == "") continue 2; $product .= $value; } print $product."\n"; } ?> 実行結果 0100:ミルクパン 0301:メロンパン と本に書いてあるのですが、 0100:ミルクパン 0301:メロンパン と表示されるのがよくわかりません。 $product .= $value; で、なぜ "0100:"と"ミルクパン"が表示されるのでしょう。 普通のforeach($list as $value)ならイメージできるのですが、 二重にforeachがあるので、 ($list as $data) ($data as $value) の意味がよくわからないです。 どなたかご教授していただけませんでしょうか?

    • ベストアンサー
    • PHP
  • 配列の連想配列のソート

    お世話になります。mooTaihenです。 Perlで配列のソートが出来なくて困っております。 お忙しいところ、誠に申し訳けありませんが、ご教示をお願い致します。 【内容】  サンプルソースに示した様なデータ構成をソートしたいのですが、思惑通りに行きません。  期待しているソート結果は、 a1 b3 b4 c2  です。  <サンプルソース> my @data; $data[0]{name} = "b"; $data[0]{cnt} = 4; $data[1]{name} = "c"; $data[1]{cnt} = 2; $data[2]{name} = "b"; $data[2]{cnt} = 3; $data[3]{name} = "a"; $data[3]{cnt} = 1; @data2 = sort {chg($a,$b)} @data; foreach (@data2) { print $_->{name} . $_->{cnt} . "\n"; } sub chg { my(@s,@d)=@_; return $s[0]{name} cmp $d[0]{name} and $s[0]{cnt} <=> $d[0]{cnt}; }  <出力結果> a1 b3 c2 b4

    • ベストアンサー
    • Perl
  • smartyのforeachの使い方

    仮に$strが以下のような配列を持っている場合smartyのtpl側で 出力させたいのですがうまくいきません。 Array ( [0] => Array ( [id] => 1 [name] => 名前 [sub_id] => Array ( [0] => 12 [1] => 13 ) [sub_name] => Array ( [0] => あああ [1] => いいい ) [sub_cnt] => Array ( [0] => 5 [1] => 5 ) ) [1] => Array ( [id] => 1 [name] => 名前 ) ) sub_***は配列が存在するものとしないものがあります。 そしてtpl側は {foreach item=items from=$str} <ul id="side{$items.id}"> {foreach item=item from=$items} <li><a href="index.php?id={$item.sub_id}">{$item.sub_name} ({$item.sub_cnt})</a></li> {/foreach} </ul> {/foreach} とforeachを重ねてみたのですがsub_***の値が表示されない 状態です。 複雑な配列なのですがこの場合どうすればうまく表示させれるの でしょうか?

    • ベストアンサー
    • PHP
  • たくさんの配列を簡単に操作したい。

    配列の要素を出力したいのですが、 @name_1 @name_2 @name_3 @name_4 print "@name_1\n@name_2\n@name_3\n@name_4\n"; としてるのですが、配列が100個あったとき書ききれません。 このような処理を簡単に書ける方法はないでしょうか? ニュアンスとしては以下のような感じです。 for($n=0;$n<100;$n++){ print "@name_$n\n"; } ご教授おねがいします。

    • ベストアンサー
    • Perl
  • 連想配列をリターン値として返す方法

    ご協力をお願いいたします。 <私の考え>を記載しましたが、上手く動作しませんでした。 何が間違っているのか、ご指摘をお願いいたします。 質問は、2件あります。 (1)連想配列の2次元について  例えば、以下の様なデータを持っている場合、  連想配列では、どの様に定義したらよいですか?  <データ>   |*name|*tel|   |moo |012 | |aiai |235 | <私の考え>   %data;   $data[0]{"name"} = "moo";   $data[0]{"tel"} = "012";   $data[1]{"aiai"} = "moo";   $data[2]{"235"} = "012"; (2)上記の様なデータをサブルーチンの返り値として渡すには? <私の考え>   sub.pl(パッケージ)   sub data {    %data;    $data[0]{"name"} = "moo";    $data[0]{"tel"} = "012";    $data[1]{"aiai"} = "moo";    $data[2]{"235"} = "012";    return(%data);   }    main.pl(サブルーチンを呼び出しているファイル)   %data = data(); print "$data[0]->{name}\n" print "$data[0]->{tel}\n"  

    • ベストアンサー
    • Perl
  • 多次元配列で、foreachを使って、key値を

    多次元配列で、foreachを使って、key値を入れ替えているのですが、 なんで、こうなるか分かりません。  $x = array();  $x[] = array(   "id" => 1,   "name" => "JavaScript",  );  $x[] = array(   "id" => 5,   "name" => "PHP",  );  $z = array();  foreach($x as $key => $value){   $z[$value["id"]] = $value;   }  print_r($z); 配列のKEYをIDに変更しているのですが、 なんで、こうなるのでしょうか? 特に、  $z[$value["id"]] = $value; が分かりません。 例えば、foerachの途中で、var_dumpすると、 1回目だと、 ◆$key 0 ◆$value Array (  [id] => 1  [name] => JavaScript ) ◆$value["id"] 1 まではいいのですが、 ◆$z[$value["id"]] の値が見れません。 ここはどんな処理をやっているのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう