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 perl
use 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