Perl入学式の練習問題をおさらいする (第4回)
第4回
[次のような機能を持つコードを作成しよう(simple_calc.pl)]
1.2つの引数の和を計算するaddと同様に, 2つの引数の差を計算するmin, 積を計算するmul, 商を計算するdiv
というサブルーチンを作ってみよう.
これらのサブルーチンが正しく実装できているか(与えた2つの引数に対して, 適切な値を返すか)を確認するコードを書いてみよう.
#---------------------- sub say { my $str = shift; print $str,"\n"; } #---------------------- sub add { my ($xxx,$yyy)=@_; return ($xxx+$yyy); } print "add=>"; say add(9,9); #---------------------- sub min { my ($xxx,$yyy)=@_; return ($xxx-$yyy); } print "min=>"; say min(9,9); #---------------------- sub mul { my ($xxx,$yyy)=@_; return ($xxx*$yyy); } print "mul=>"; say mul(9,9); #---------------------- sub div { my ($xxx,$yyy)=@_; return ($xxx/$yyy); } print "div=>"; say div(9,9); #---------------------- print "\n"; if (add(9,9)==9+9){ say "add_ok"; } if (min(9,9)==9-9){ say ("min_ok"); } if (mul(9,9)==9*9){ say ("mul_ok"); } if (div(9,9)==9/9){ say ("div_ok"); }
[配列とハッシュをそれぞれ1つずつ定義してから, 第1引数に配列のリファレンス,
第2引数にハッシュのリファレンスを受け取り, その中身を出力する(for文などを利用して...),
サブルーチン(output_array_and_hash)を書いてみよう(output_array_and_hash.pl)]
my @xxx=("a","b","c","d"); my %yyy=("name"=>"yamada"); #サブルーチン(output_array_and_hash) sub output_array_and_hash { my ($array,$hash) = @_; for my $aaa(@$array) { print $aaa,"\n"; } for my $bbb(keys(%$hash)) { print $bbb,"=>"; print $hash->{$bbb},"\n"; } } #サブルーチン呼ぶ output_array_and_hash(\@xxx,\%yyy);
[このような配列のリファレンスを受け取り, リファレンスに格納された文字列について,
「loves」の後に記述されている好きな食べ物の単語を正規表現で取得し,
「papix -> meat」, 「boolfool -> sushi」のように表示するサブルーチン, love_foodを書いてみよう(love_food.pl)]
my $words_ref = [
'papix loves meat!',
'boolfool loves sushi!',
];
my $words_ref = ['papix loves meat!','boolfool loves sushi!']; sub love_food{ my $str = shift; for my $aaa(@$str){ if ($aaa=~ /(.+) loves (.+)!/){ print "$1->$2\n"; } } } love_food($words_ref);
[この$strに格納された文字列を, 置換を利用して, 「I love perl」に書き換えるようなコードを書いてみましょう(regexp_replace.pl)]
my $str = 'I love ruby';
my $str = 'I love ruby'; $str=~ s/ruby/perl/; print $str,"\n"; #変数を用いると my $str = 'I love ruby'; my $word1 = 'ruby'; my $word2 = 'perl'; $str=~s/$word1/$word2/; print $str,"\n";
[次のコードは, 標準入力から入力された文字列を, ひたすら$inputに代入するコードである.
...の部分を, 次の条件を満たすように書き換えてみよう(while_input.pl)]
while (chomp(my $input =
...
}
1.文字列が0の場合, ループを抜ける(lastを使って...)
文字列がperlないしPerlを含む場合, 「Find Perl!」と表示する.
文字列に大文字小文字問わず, pythonの文字列が含まれる場合, 「Find Python!」と表示する.
文字列にperlないしrubyないしpythonが含まれる場合, 「Love Programming!」と表示する.
sub say { my $str = shift; print $str,"\n"; } while (chomp(my $input = <STDIN>)) { if ($input eq 0){ last; } if ($input=~/perl/ or $input=~/Perl/){ say("Find Perl!") } if ($input=~/python/i) { say("Find Python!") } if ($input=~/perl/i or $input=~/ruby/i or $input=~/python/i){ say("Love Programming!") } }
2.文字列の先頭にpapixがある場合, 「Find papix!」と表示する.
文字列にHelloが含まれる場合, その後に続く単語xxxxを使って「Hello! xxxx!」と表示する.
例えば, 文字列に「Hello papix」が含まれる場合, 「Hello! papix!」と表示すればOKです.
sub say { my $str = shift; print $str,"\n"; } while (chomp(my $input = <STDIN>)) { if ($input =~/^papix.*/){ say("Find papix!") } if ($input=~/Hello(.+)/){ say ("Hello,$1") } }