• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:一致する要素が格納されている添え字番号を返す)

配列内の一致する要素の添え字番号を返す関数について

このQ&Aのポイント
  • ある配列内の要素と一致する値または文字を指定した場合に、その要素の添え字番号を返す関数について質問です。
  • 具体的には、ある配列@moji内の要素が指定した変数$xの値または文字と一致する場合、その要素の添え字番号を返す関数を探しています。
  • R言語では、which()関数を使用することで同様の結果を得ることができるのですが、Perlで同じような機能を持つ関数があるか教えていただきたいです。

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

  • ベストアンサー
  • shiren2
  • ベストアンサー率47% (139/295)
回答No.6

皆さんが既に答えられてますが…。 普通の関数として実装すればいいと思いますよ。 インデントは全角スペースになっています。 #!/usr/bin/perl use strict; my @moji = ('ak', 'df', 'gc'); my $x = "ak"; my $res = &mch($x, @moji); # definedを使えば0番が返ったときでもTRUEになる if(defined $res){  print("found: $res\n"); }else{  print("not found\n"); } sub mch {  my($key, @array) = @_;  for(my $i = 0; $i < @array; $i++){   if($key eq $array[$i]){    return $i;   }  }  return undef; }

その他の回答 (5)

  • SaLeeFA
  • ベストアンサー率66% (6/9)
回答No.5

すみません。本気で間違えました! 送信した直後に気付きました。 正規表現部は全て $moji[$_] =~ m/^\Q$x\E$/ としてください。 m/^\Q$x\E$/ これだけだと、添え字の「番号」に対して正規表現かけてました。

  • SaLeeFA
  • ベストアンサー率66% (6/9)
回答No.4

Perlがよくわからないってことですか? 質問の趣旨とは違いますが、少し書いておきます。 #なんとか演算子 .. (2 .. 5) #演算子名は忘れましたが、指定した連番からなるリストが返ります。 (2, 3, 4, 5,) #この記述と同等。 #配列変数に対し、スカラーを要求した場合、保持している要素の数を返します。 $scl = @ary; #要素数が10なら10が代入される。 # foreach (){} 条件判定部に与えられた「リスト」を順番に一つづつ取り出し、 { } の中を実行する。 一つづつ取り出されたリストの中身は、明示的な指定がなければ デフォルトの変数 $_ に代入されている。 #正規表現 m/ココの部分に正規表現を指定/; 検索対象の明示的な指定がなければ、$_ を対象として正規表現を行う。 ----------------------------------------------- 以上を踏まえて、以下の記述で実現できます。 動作テストはしてません。 @moji = (ak, df, gc); $x = "ak"; foreach ( 0 .. @moji - 1 ){ #-1とするのは、添え字は0から始まるため数字が1狂う。 m/$x/ and $res = $_; #正規表現でマッチが行われた場合、番号を代入。 } ----------------------------------------------- 実際に使う場合には、最初にマッチが行われた際、即座にループを終了する lastなどを書いたほうが良い。 もしくは、$res を配列変数にし、マッチが行われた番号を全て代入する、 などの処置をしたほうが良い。 ----------------------------------------------- まーテストはしてませんが、 Perlを分かってなさそうなので関数化した例もかいときます。 変数名や関数名は適当に直しといてください。 sub fnc ($@){ my $x = shift; my @moji = @_; my @ary; #戻り値 foreach ( 0 .. @moji - 1 ){ m/^\Q$x\E$/ and push @ary, $_; } return @ary; } #※この関数が返す値は必ず配列です。 # スカラーでこの関数を要求した場合、マッチした個数が返ります。 # 呼び出しは以下のようになります。 @moji = (ak, df, gc); $x = "ak"; @ary = fnc($x, @moji); # $x に マッチする @moji 全ての添え字を @ary に返す。 #この関数の場合、スカラーで求めるとマッチした「個数」が返るので間違わないで下さい。 $scl = fnc($x, @moji); #この場合、一個にマッチしたので$sclには 1 が返る。

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.3

No.1さんとほととん同じですが、配列の要素数が大きい場合はこちらのほうが高速だと思います。 use List::Util qw(first); my @moji = ("ak", "df", "gc"); my $x = "ak"; my $res = first { $moji[$_] eq $x } 0 .. $#moji; print "$res\n";

  • diszo
  • ベストアンサー率78% (32/41)
回答No.2

CPANのList::MoreUtilsを使用すれば値が一致するインデックスを返す メソッド(firstindex)があります。 #標準ではこのモジュールはインストールされていないようですので、 #ご自分でインストールする必要があります。 例文を引用させてもらうと以下のよう動きになるそうです。 my @list = (1, 4, 3, 2, 4, 6); printf "item with index %i in list is 4", firstidx { $_ == 4 } @list; 結果 item with index 1 in list is 4

参考URL:
http://search.cpan.org/~adamk/List-MoreUtils-0.26/lib/List/MoreUtils.pm
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

添字を対象に grep 関数を用いると抜き出すことができます。 @moji = ("ak", "df", "gc"); $x = "ak"; ($res) = grep { $moji[$_] eq $x } 0 .. $#moji; print "$res\n";

関連するQ&A