例えばある配列内に
@moji = (ak, df, gc);
などという値でも文字でもが格納されていたとして、
$x = "ak";
といったある変数に格納されている値・文字(この場合はak)と一致する要素が配列@mojiに格納されていた場合に、その格納されている要素の添え字番号(配列の添え字番号)を返すような関数はないでしょうか?
イメージとして
$res = mch($x);
とすると、0が返されて$resに格納されるというものです。
ちなみにRという言語では
> a <- c("ljj", "B0", "op199") # 変数aに3つの文字列要素を代入する
> res <- which(a == "op199") # which()は引数に指定された論理に一致する要素番号を返す
> res # aについて,a == "op199"がTRUEとなるのは要素番号3であるから,3を返す
[1] 3
というものがあるのですが、これと同じような関数が欲しいのです(泣)
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;
}
No.5
- 回答日時:
すみません。
本気で間違えました!送信した直後に気付きました。
正規表現部は全て
$moji[$_] =~ m/^\Q$x\E$/
としてください。
m/^\Q$x\E$/
これだけだと、添え字の「番号」に対して正規表現かけてました。
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 が返る。
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";
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.2 …
No.1
- 回答日時:
添字を対象に grep 関数を用いると抜き出すことができます。
@moji = ("ak", "df", "gc");
$x = "ak";
($res) = grep { $moji[$_] eq $x } 0 .. $#moji;
print "$res\n";
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- Visual Basic(VBA) batにて、異なるフォルダの同名ファイルを参照し、文字列を判別。擬似配列で変数へ格納 3 2022/04/10 03:37
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) プログラミングについて(Python) 添付した画像はC言語で簡単に作ったソースで、1つの配列に5つ 3 2022/09/10 19:15
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
二次元配列のインデックスについて
-
エクセルVBAでTransposeの不思議
-
リストボックスに縦スクロール...
-
Dim flag(4) as boolean で配列...
-
VBAのautofilter、criteriaの配...
-
マクロ Publicでの配列定義
-
バイナリデータの検索(VB.NET2008)
-
Strawberry Perl for Windows ...
-
チェックボックスのperlでの値...
-
perl 配列の要素数について
-
Perlで<select multiple>の複数...
-
perlで配列の要素が空なのを知...
-
参照配列の要素数の求め方は?
-
DBIを使ってSelect文 複数のカ...
-
VBA 多次元配列を用いてグルー...
-
vb.netです。2次元配列の要素を...
-
VB2010でCSVファイルの読み込み
-
ボタンが押された時にループか...
-
VBAでの一時停止と再開の方法
-
列挙型と連想配列の違いを教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAでTransposeの不思議
-
マクロ Publicでの配列定義
-
Excel VBA ユーザーフォームの...
-
リストボックスに縦スクロール...
-
VBAのautofilter、criteriaの配...
-
クラスに配列を渡す方法
-
perlで配列の要素が空なのを知...
-
Dim flag(4) as boolean で配列...
-
二次元配列のインデックスについて
-
文字の整列(printf)
-
二次元配列における要素数のは...
-
N88互換BASICで「メッセージの...
-
VBA 多次元配列を用いてグルー...
-
チェックボックスのperlでの値...
-
VBScript 配列
-
VBA 二次元配列の1つ目を増...
-
DataGridViewに配列の値を表示...
-
jcode->jfold で禁則処理
-
重複しない乱数発生
-
perl 配列の要素数について
おすすめ情報