Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.
For the best experience please use the latest Chrome, Safari or Firefox browser.


目標時間 : 30分
#!/usr/bin/env perluse utf8;use strict;use warnings;binmode STDIN, ":encoding(UTF-8)";binmode STDOUT, ":utf8";binmode STDERR, ":utf8";
sub add {my ($left, $right) = @_;return $left + $right;}
my @array_a = ('a', 'b', 'c');my @array_b = ('d', 'e', 'f', 'g');my @return = &merge(@array_a, @array_b);print @return;sub merge {my (@left, @right) = @_;return (@right, @left);}
@returnの中身を'd', 'e', 'f', 'g', 'a', 'b', 'c'にしたい.abcdefgと表示されたのではないでしょうか.
@returnの中身が'a', 'b', 'c', 'd', 'e', 'f', 'g'となっている.@array_a = ('a');, @array_b = ('b')のとき, @array_c = (@array_a, @array_b)は, @array_c = ('a', 'b')になります.@_配列という配列に格納されます.@left = ('a', 'b', 'c', 'd', 'e', 'f', 'g'), @right = undefとなります.@_配列に格納される為, 引数となる2つの配列の区切りがわからなくなってしまう!
my @array_a = ('a', 'b', 'c');my @array_b = ('d', 'e', 'f', 'g');my @return = &merge(\@array_a, \@array_b);print @return;sub merge {my ($left, $right) = @_;return (@$right, @$left);}
&merge(\@array_a, \@array_b)とすることで, 関数に対して配列のリファレンスを渡します.@leftではなく$leftとします.@を付けることで, 配列として参照します.defgabcと表示されるはずです.
@returnの中身が'd', 'e', 'f', 'g', 'a', 'b', 'c'になっています!
my @array = ('a', 'b', 'c');my @return = &add(\@array_a);print "return: " . (join ',', @return) . "\n";print "array : " . (join ',', @array) . "\n";sub add {my ($array) = @_;@$array = (@$array, 'd');return @$array;}
dを加えて, その配列を返す関数です.@arrayと@returnの要素はどうなるでしょうか.@returnも@arrayも, どちらもa,b,c,dと表示されたのではないでしょうか.
&subroutine(1, 'papix', '22', $year, $month, $day);sub subroutine {my ($id, $name, $age, $year, $month, $day) = @_;}
&subroutine({ id => 1, name => 'papix', age => 22, year => $year, month => $month, day => $day});sub subroutine {my ($arg) = @_;print $arg->{id} . "\n";}
my $name = 'papix';my $twitter = '__papix__';my @mail = ('papix2011@gmail.com', 'hogehoge@fugafuga.com');
このような出力になればOKです.
my $sum = 0;for my $num (1..10) {$sum += $num;}print "$num\n"; # 55
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)というリストの全ての要素を$sumという変数に足し合わせることで, 1から10までの数の和を計算しています.
my $sum = 0;while($sum <= 10) {$sum++;}print "$sum\n"; # 11
my @language = qw/ python ruby c perl haskell java /;my $find = 0;for my $lang (@language) {if($lang eq 'perl') {$find = 1;}}
@language)にperlという文字列が含まれているかを確認するスクリプトです.
perlという文字列が含まれていれば, $findの値が1となり, そうでないならば0のままになります.perlという文字列が見つかった後でも, 繰り返しの処理は終わりません.pythonからjavaまで, 配列の全ての要素に対してperlと等しいかをチェックします.perlという文字列を含むか否か, です.
perlという文字列を発見した時点で, 繰り返し処理を終了してもいいですよね?
my @language = qw/ python ruby c perl haskell java /my $find = 0;for my $lang (@language) {if($lang eq 'perl') {$find = 1;last;}}
lastです.lastが来ると, その時点で今行なっている繰り返し処理を中止します.
my @university = qw / kwansei kansai ritsumeikan doushisha /;for my $univ (@university) {print "$univ\n";}
@universityに含まれる要素を全て出力するスクリプトですが, 要素がkwanseiだった場合出力したくない, という場合を考えます.
my @university = qw / kwansei kansai ritsumeikan doushisha /;for my $univ (@university) {if($univ eq 'kwansei') { next; }print "$univ\n";}
nextを置くと, その時点でその繰り返しが終了し, 次の繰り返しへ遷移します.
$univがkwanseiと等しい場合, それ以降の処理を実行せず, 次の繰り返し(kansai)に移ります.int rand(100)
if($num == 100) {$num *= 100;}unless($num != 100) {$num++;}
$num *= 100 if($num == 100);$num++ unless($num != 100);
$num++; $num *= 10 if($num == 100);
$numが100の場合, $num++をした後に, $num *= 10をさせたい, と思ってこのように書いても, そのように動作しません.$numの値に関わらず$num++が実行され, その後に$numが100の場合, $num += 10が実行されます.
my @university = qw / kwansei kansai ritsumeikan doushisha /;for my $univ (@university) {next if($univ eq 'kwansei');# if($univ eq 'kwansei') { next; }print "$univ\n";}
nextを紹介する際に使ったプログラムを, 後置ifを使って書きなおしてみました.Use a spacebar or arrow keys to navigate