1月7日の履歴


今日も結城先生の入門本

16:00開始 18:00
21:00開始 23:00

計4hr
p83-108
1万時間まであと9987時間。


先頭 末尾
追加 unshift push
取りだし shift pop


スタック 先入れ後だし push pop とunshift shiftの関係
キュー 先入れ先だし pushで入れてshiftで取る。


なんかperlで2次元作りにくい、多次元どうすれば???って思っていたんだけど、
これはリファレンス作成しないといけないみたいだ。
結城先生の入門本には掲載していないらしい。



$a <=> $bとは?
ちょっとわかりにくいけど、


$a < $b -1 $aは前へ
$a == $b 0  等しい
$a > $b 1  $aは後ろへ

##---split------

my $bbb = 'I am a dog, too.';
print "$bbb\n";
my @ccc = split(//, $bbb);
print join(':',@ccc), "\n";

実行結果
I am a dog, too.
I: :a:m: :a: :d:o:g:,: :t:o:o:.  # ブランクも含めて:で区切られた。


my @data = split(/\s+/, ' a b c d e f g ');
print "@data\n";

実行結果
a b c d e f g  # これよくわかりにくいけど、一つ以上のブランクで分けても、
           先頭のブランクは実はそのまま。ブランクは[0]になるのかな??


my $ddd = ' a b c d e f g ';
print "\$ddd = $ddd\n";
$ddd =~ s/^\s+//;
print "\$ddd = $ddd\n";
my @eee = split(/\s+/, $ddd);
print "\@eee = @eee\n";
print "@eee\n";

実行結果
$ddd = a b c d e f g
$ddd = a b c d e f g   # 先頭の1つ以上の空欄を取った。
@eee = a b c d e f g  # 一つ以上の空欄で分けて配列に入れた。
a b c d e f g # 確かに前にブランクがない。


#-----push---------

my @fff = qw(aaa bbb ccc ddd eee fff ggg hhh iii);
push(@fff, 'JJJ');
print "\@fff = @fff\n";


my @ggg = ('AA', 'BB', 'CC', 'DD', 'EE', 'FF');
push(@fff, @ggg);
print "\@ggg = @ggg\n";
print "\@fff = @fff\n";

実行結果
@fff = aaa bbb ccc ddd eee fff ggg hhh iii JJJ  # 最後にJJJという要素を追加。
@ggg = AA BB CC DD EE FF
@fff = aaa bbb ccc ddd eee fff ggg hhh iii JJJ AA BB CC DD EE FF # 要素だけでなく配列も追加可能。

##----pop----------

my $last_array = pop(@fff);
print "\@fff = @fff\n";
print "\$last_array = $last_array\n";

実行結果
@fff = aaa bbb ccc ddd eee fff ggg hhh iii JJJ AA BB CC DD EE # 残りがある。
$last_array = FF  # popは最後の要素をアレイから取る。

##----shift--unshift------

my $top_fff = shift(@fff);
print "\@fff = @fff\n";
unshift(@fff, $top_fff);
print "\$top_fff = $top_fff\n\@fff = @fff\n";

実行結果
@fff = bbb ccc ddd eee fff ggg hhh iii JJJ AA BB CC DD EE # 先頭の要素が取られる。
$top_fff = aaa # 取られたものが入っている。
@fff = aaa bbb ccc ddd eee fff ggg hhh iii JJJ AA BB CC DD EE #先頭に要素を入れる。

##---splice(array, offset, length, list)----


print "\@ggg = @ggg\n";
my @remove = splice(@fff, 2, 4, @ggg);
print "\@fff = @fff\n";
print "\@remove = @remove\n";

実行結果
@ggg = AA BB CC DD EE FF
@fff = aaa bbb AA BB CC DD EE FF ggg hhh iii JJJ AA BB CC DD EE  # 要素0...の2番目から4個取って@gggを入れる。 
@remove = ccc ddd eee fff  # 取った要素たちが入っている。


##1###
my @remove2 = splice(@fff, 2, 4);
print "\@fff = @fff\n";
print "\@remove2 = @remove2\n";

実行結果
@fff = aaa bbb EE FF ggg hhh iii JJJ AA BB CC DD EE # 0..と数えて要素2から続けて4個の要素を取る。
@remove2 = AA BB CC DD #その取った要素達

##2###
my @remove3 = splice(@fff, 2);
print "\@fff = @fff\n";
print "\@remove3 = @remove3\n";

実行結果
@fff = aaa bbb # 要素2から最後まで取る。
@remove3 = EE FF ggg hhh iii JJJ AA BB CC DD EE # その取った要素が入っている。


##3###
print "\@ggg = @ggg\n";
my @remove4 = splice(@ggg);
print "\@remove4 = @remove4\n";
print "\@ggg = @ggg\n";

実行結果
@ggg = AA BB CC DD EE FF 
@remove4 = AA BB CC DD EE FF # 指定無くspliceにアレイを入れると全部取られる。
@ggg =  #全部アレイが取られた。

引き続き、sort reverse(reverseはsortしてからじゃないとできない。)
my @array = (1, 10, 243, 9, 45, 12, 87, 91, 288);
my @sort_array = sort(@array);
print "\@sort_array = @sort_array\n";

my @sort_array2 = sort{$a <=> $b} @array;
print "\@sort_array2 = @sort_array2\n";

my @reverse_array = reverse(sort{$a <=> $b} @array);
print "\@reverse_array = @reverse_array\n";

my @week = ('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
my @sort_week = sort(@week);
my @reverse_week = reverse(sort(@week));

print "\@week = @week\n";
print "\@sort_week = @sort_week\n";
print "\@reverse_week = @reverse_week\n";

print "\@week[0, 2, 6] = @week[0, 2, 6]\n";
print "\@week[2..6] = @week[2..6]\n";

実行結果
[minako1@minako ~]# perl !$
perl array.pl
@sort_array = 1 10 12 243 288 45 87 9 91 # そのままsortだから 1 10 2 20って並んだ。
@sort_array2 = 1 9 10 12 45 87 91 243 288 # 比較演算子を入れてあるので数としてsort。
@reverse_array = 288 243 91 87 45 12 10 9 1 # 数としてsort後にreverseしてある。
@week = sun mon tue wed thu fri sat
@sort_week = fri mon sat sun thu tue wed # 文字でも同様にsort可能。
@reverse_week = wed tue thu sun sat mon fri
@week[0, 2, 6] = sun tue sat  # [カッコ]にカンマ区切りで複数要素を指定して取りだすことも可能。
@week[2..6] = tue wed thu fri sat
[minako1@minako ~]#