重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

後ろから2つ目の配列にアクセスする場合、通常は@tempを作りこのようにアクセスると思います。
my @temp = split(/tab/,$str);
print $temp[-2];

しかし、以下みたいな表記でいきなり配列にアクセスする方法があったのですが思い出せません。どのような表記法ならいきなり配列の指定文字列にアクセスできますか?
print split(/tab/,$str)[-2];

宜しくお願い致します。

A 回答 (2件)

この手の関数は Perl上「名前を持った演算子」という扱いになっていて, その名前の*直後*に開きかっこがあると


対応する閉じかっこまでを引数とみなす
というルールがあります (cf.
https://perldoc.jp/docs/perl/5.26.1/perlop.pod
). つまり
print (split(/tab/,$str))[-2];
だと
print (split(/tab/,$str))
という関数呼び出しをしちゃうんです. そうさせないためには
print ((split(/tab/,$str))[-2]);
とさらにかっこを追加するとか, あるいは
print +(split(/tab/,$str))[-2];
のように「『直後』が開きかっこではない」ようにする必要があります.

だったら単純に
print split(/tab/,$str)[-2];
でいいんじゃないかって話になるんだけど... この場合, 多分 split の返り値がスカラーコンテキストになるからダメだと思う. 確認してないけど.

ついでに.
$ が付いていればスカラー, @ が付いていれば配列なので
・$array[-2] は配列 @array の後ろから 2番目の要素を表すスカラー
・@array[-2] は配列 @array の後ろから 2番目の要素のみからなる配列
という違いがあります... が, たぶんこの違いが表に出てくるケースはそんなにないんじゃないかなぁ.
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます。とても良く理解できました!

お礼日時:2020/06/20 00:53

print ((split(/tab/,$str))[-2]);



要素にアクセスするだけなら
(split(/tab/,$str))[-2]
でいいんだけどこの場合は print の引数になっているので単純に
print (split(/tab/,$str))[-2]
とするとエラーになるので「引数をくくる」かっこがもう 1組必要.

split の引数のかっこがなくてもいいと思えば
print ((split /tab/,$str)[-2]);
とも書ける.
    • good
    • 0
この回答へのお礼

ありがとうございます。
printの引数になるとエラーになるとのことですが、実は下記表記までは思いつき試したのですが試しそこで諦めていました。
ただ、これでも引数は1つに見えますがprintから見ると別のものに見えているのでしょうか?
print (split(/tab/,$str))[-2];
print @array[-2];と同じ意味になるような気がしたのです。
ただ、これを書いていて思ったのですが普通は$array[-2];が正しいと思いますが、$の代わりに@でも良いのでしょうか?

お礼日時:2020/06/19 04:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!