Hatena::Diary

WEB開発初心者の成長記録 このページをアンテナに追加 RSSフィード

2009-06-16

【perl】join関数とsplit関数、「@」が展開されるとどうなるの?

#! /usr/bin/perl

use strict;
use warnings;

my @array = (453,45,778);
print "@array\n";

#関数join('区切り文字',連結したい配列や文字) => なにか連結したいときに使用
print join('あ',@array),"\n";
#出力結果 => 453あ45あ778

print "\n";

my $x = 1;
my $y = 2;
my $z = 3;

print join('点と',$z,$y,$x),"\n";
#出力結果 => 3点と2点と1 => 最後の要素の後には、区切り文字はつかない

print join('点と',$z,$y,$x),"点です。\n";
#出力結果 => 3点と2点と1点です。

print "\n";

#以下の2つのprint分は同じ出力結果 => 3点と2点と1点です。
print '点数は',join('点と',$z,$y,$x),"点です。\n";
#「,」コンマを使用すると、コンマで区切られた別々の文として出力される。
print '点数は'.join('点と',$z,$y,$x)."点です。\n";
#「.」ピリオドを使用すると、連結された1文として出力される。(ピリオド=文字列連結演算子)

今回の大発見は、以下。「@」って、展開されると「$"」と認識されてスペースになる。だから配列の要素をprintすると、要素がスペースで区切られてprintされるんだね。

#! /usr/bin/perl

use strict;
use warnings;

#split関数=>区切って要素に分解したいとき
my $m = '127804508057305';
my @array1 = split(/0/,$m);

print @array1."\n";
#出力結果 => 5 =>ピリオド(文字列連結演算子)を使うことで、@array1を配列ではなくスカラと無理にみなそうとする。配列をスカラと見なすと、要素の数を返す。
print "@array1\n";
#出力結果 => 1278 45 8 573 5 => @が展開されて配列と見なされている。※""内で展開される記号は、「\」と「@」の2つのみ。

print "\n";

$" = ','; 
#「@」は展開されるとスペースになり、各要素の間に入るようになっている。機械には、展開されたとき「$"」と見えていて、スペースを要素の間に入れろという命令と取る。そこで、「$"」を「,」と置き換えてみる。
print @array1."\n"; 
#出力結果 => 5
print "@array1\n";
#出力結果 => 1278,45,8,573,5 =>「@」が展開されたときのスペースを「,」に置き換えているので、「,」で区切ってprintされる。

print "\n";

print @array1,"\n";
#出力結果 => 12784585735 => @array1をスカラとは見ないしていない。ただ、「""」がないので@が展開されず、つながってprintされている。
print "@array1","\n";
#出力結果 => 1278,45,8,573,5
print "@array1\n";
#出力結果 => 1278,45,8,573,5

まとめは以下。

(1)join('区切り文字(のりの役割)',連結したい文字列や配列など)
(2)split(/区切り位置(はさみの役割)/,ばらばらにしたい文字列など)

(3)""(ダブルクォーテーション)内で展開される記号は、「@」と「\」の2種類(sjisのとき)
→「@」が展開されると「$"」となり、要素の間に「スペース」を入れろという命令になる(=配列と見なしなさいという命令)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/midori_kasugano/20090616/1245139122