Perl入学式の練習問題をおさらいする (第1回と第2回分)

第1回の2部

[print命令を複数個使って, あなたのプロフィール(名前, 年齢, 大学etc...)を表示するスクリプトを書いてみよう]

print "私の名前は\@oisiusです\n";  
print "年齢は39歳です\n";  
print "大阪府に住んでます\n";


[2015からあなたの生年の西暦を引き算して, 満年齢を表示してみましょう]

print "私の年齢は、",2015-1976,"歳です\n";  

第2回

[Hello, Worldという文字列を出力する(hello.pl)]

print "Hello World\n";  

[自分の名前, 年齢, 身長などの情報をそれぞれname, age, heightといったスカラ変数に格納し,それらの値を出力する (profile.pl)]

my $name = "\@oisius";  
my $age = 39;  
my $height=169;  
print "$name/","$age歳/","$heightセンチ\n";    

[標準入力から0以外の整数を2つ読み込み,それらを四則演算(+, -, *, /)した結果を上の例のように出力する(calc.pl)]

print '1つ目の数字をどうぞ >';  
chomp(my $num1=<STDIN>);  
print '2つ目の数字をどうぞ >';  
chomp(my $num2=<STDIN>);  

print "$num1+$num2 -> ",$num1+$num2,"\n";  
print "$num1-$num2 -> ",$num1-$num2,"\n";  
print "$num1*$num2 -> ",$num1*$num2,"\n";  
print "$num1/$num2 -> ",$num1/$num2,"\n";  

@_papix_さんの回答下記。そっか。xとyでいいし、明示してあげるといいのか。
https://github.com/perl-entrance-org/workshop-2014-02/blob/master/question/calc.pl


[端末から文字列を一つ入力し, その文字列が$answerと一致したらOK, 外れたらNGと表示します(question_word.pl)]

print "type a word\n";
my $ans = "good";

chomp(my $str =<STDIN>);

if($str eq $ans){
   print "OK\n";
}else{
   print "NG\n";
}

[端末から数字を一つ入力し, その数字が$answerと一致したらOK, $answerより大きければtoo big, 小さければtoo smallと表示します(question_num.pl)]

my $ans=99;
chomp(my $num=<STDIN>);

if ($num==$ans){
  print "OK\n"; 
}elsif($num>$ans){
  print "too big\n";
}elsif($num<$ans){
  print "too small\n";
}

入力した値が, $answerから-5〜+5の範囲内(例えば, $answerが10なら, 5〜15)の場合, nearと表示するようにしてみましょう

my $ans=99;
chomp(my $num=<STDIN>);

if($num==$ans){
  print "OK\n"; 
}elsif($num>$ans){
  if($num-$ans<=5){
    print "near\/";
  }
  print "too big\/";
}elsif($num<$ans){
  if($ans-$num<=5){
    print "near\/";
  }
  print "too small\n";
}

あえてifの中にifを書いたけど、よくない?

if($str==$ans){
  print "正解\n"; 
}elsif($str>$ans && ($str - $ans) <=5){
  print "near\/";
}elseif(str>$ans){
  print "too big\n";
}elsif($str<$ans && ($ans - $str) <=5){
  print "near\/";
}

[配列@arrayにを使って3つの文字列を格納し, これを「文字列として」ソートしたものを出力する(sort.pl)]

my @array;
for my $i(0..2){
  print "type a word->";
  chomp($array[$i]=<STDIN>);
}

my @sort=sort @array;
print "@sort\n";


[1から100までの数字について, 以下のようなルールに従って表示を行う(fizzbuzz.pl)]
(その数字が3で割り切れるならFizz,5で割り切れるならBuzz,3でも5でも割り切れるならFizzBuzz)

for my $i(1..100){
  my $msg="";
  if ($i % 3 == 0){
    $msg.="Fizz";
  }	
  if ($i % 5 == 0){
    $msg.="Buzz";
  }
  if ($msg ne ""){
    print "$i ==> $msg\n";
  }
}

@tomchaさんの回答下記。値があるかないかの聞き方なるほど。スマート!
https://github.com/perl-entrance-org/workshop-2015-02/blob/master/answer/osaka/tomcha/fizzbuzz.pl

if($outstr){
    print "$outstr\n";
}else{
    print "$i\n";
}

第2回の復習問題

https://github.com/perl-entrance-org/workshop-2015-02/blob/master/src/practice.md

[端末から文字を入力し, その文字を表示する(stdin.pl)]

print "type a word->";
chomp(my $str=<STDIN>);
print "---> $str\n";

[1から100までの値を配列に格納し, その配列の全ての数値を足した結果を出力する(sum.pl)]

my $sum;
for my $i(1..100){
  $sum+=$i;
}
print "$sum\n";

[標準入力により数値を一つ読み込み, その数値を階乗した値を出力する(factorial.pl)]

print "正の数を入力して->";
chomp(my $num=<STDIN>);
my $total=1;

if ($num>0){
  for my $i(reverse(1..$num)){
    $total*=$i;
  }
  print "$total\n";
}else{
  print "err\n";
}

配列を使う・・・↓

chomp(my $num=<STDIN>);
my @array;
my $total=1;

$array[0]=$num;
if ($num>1){
  for my $i(1..$num-1){
    $array[$i]=$num-$i;
  }
  for (@array){
    $total *= $_;
  }
  print "total->$total\n";
}

0の階乗は1?


for文で1個目だけ違う処理の場合、for文の前に入れていいもの?

[標準入力により数値を一つ読み込み, その数値が偶数なら"even", 奇数なら"odd" という文字を出力する(even_or_odd.pl)]

print "数を入力して->";
chomp(my $num=<STDIN>);

if ($num%2==0){
  print "even\n";
}else{
  print "odd\n";
}