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")
  }
}