例えば以下のような文字列があったとして、
my $str = 'Apple,Orange,Grape';
これをカンマで分けたい!と思ったらsplitを使います。
my @fruits = split( /,/ , $str);
splitの使い方は「splitしてくれ、この区切り文字で、この文字列を」となります。
(英語のSVOO的に)
「 /,/ 」というのはスラッシュの中で囲んだ文字で、という意味で、
今回はスラッシュの中にカンマが入っているので、区切り文字はカンマとなります。
今回は区切り文字がどこからどこまでかをスラッシュで囲んで表現しましたが、
他の文字(たとえばシングルクォート)なんかでもOKです。
で、@fruitsで受け取った分割された文字列は配列の要素として格納され
print $fruits[0];
とすることで
Apple
と表示されます。
つまり
my $str = 'Apple,Orange,Grape'; my @fruits = split( /,/ , $str); print $fruits[0];
という感じなわけで、splitって便利!なわけですが、
慣れてくると「@fruits」が邪魔に見えてきます。
分割してN番目の要素を取り出したいだけ!なのに、
わざわざ配列を作るのはなんとなく美しくない。。。と思っていました。
で、そういう受け取りのためだけの変数をなくす方法が以下。
それには無名配列を使います。
無名配列というのは以下のようなモノです。
my $array_ref = [ 'Ape', 'Becky', 'Charles' ]; print $array_ref->[0];
とすると「Ape」と表示されます。
単なる配列との違いは「->」がつくところと、
配列を宣言するときに丸かっこ' ( ) 'ではなく
角かっこ' [ ] 'で括るところです。
それから変数名が@でなく$ではじまるところもポイント。
無名配列はリストではなくスカラーなのです。
で、もとからある配列を無名配列化するには以下の2つの方法があります。
my @array = ( 'KGB', 'CIA', 'FBI'); my $a_ref_1 = [ @array ]; my $a_ref_2 = ¥@parray;
配列を角カッコ ' [ ] ' で括る方法と、
先頭にバックスラッシュ(or 円マーク)をつける方法です。
どちらの方法で無名配列化したとしても、
同じように要素にアクセスできます。
$a_ref_1->[1]も$a_ref_2->[1]も「CIA」となります。
わざわざ配列を宣言しておかなくても、
いきなりつくっていきなり使うことができます。
例えばこんな風に。
print [ 'Ice', 'Snow', 'Water' ]->[0]
これは「Ice」と表示されます。
さて、splitで得られる配列に直接アクセスする方法は上記の方法を使います。
次のようにやるのです。
[ split( /,/ , $str) ]->[0]
気付けばなんてことはないのですが、
これができると知って、僕は目から鱗が落ちました。
ちなみに、他にもこんな方法があります。
${ [ split( /,/ , $str) ] }[0]
それから最初の要素を取得したい時に限定ですが、
shift ( @{[split(/,/, $str)]} )
というのもできます。
しかし、
shift ( split (/,/ , $str) )は何故かできない。