Perl入学式 in大阪 第2回 〜構文基礎編〜(まとめ)(逐次追記していきます。)(2019/06/09)

2023年10月22日

<!DOCTYPE html>



blog2.md


1. Perl 入学式 2 回目

  • 前回の復習

    • Hello World を画面に出力してみよう♪
      #!/usr/bin/env perl
      use strict;
      use warnings;
      

      上記おまじない三行は必ず入れるようにする。
      perl -wc program.pl とすると構文チェックをしてくれる。
      -wc を行わなくてもおまじないが書いてあるのでプログラム実行時に -wc を行ったときの様なメッセージをプログラム実行時に表示してくれる。

  • 講義&実習

    • スカラー変数

      print "Hello, World!\n";
      
      my $foo;
      
      $foo = 'tomcha';
      

      "" で囲むと制御文字を認識して処理してくれる。
      ” で囲むとそのままの文字として認識し制御文字などそのまま出力される。

    • 四則演算

      #!/usr/bin/env perl
      use strict;
      use warnings;
      
      my $i = 5 + 3;
      my $j = 10 % 3;
      
      print "5 + 3 = $i\n";
      print "10 / 3 のあまり $j\n";
      
      my $foo = 4;
      my $bar = 2;
      my $result;
      
      $result = $foo + $bar;
      
      print '$foo + $bar = ';
      print "$result\n";
      
      $foo = 100;
      $bar = 2;
      
      $result = $foo - $bar;
      
      print '$foo - $bar = ';
      print "$result\n";
      
      $foo = 100;
      $bar = 2;
      
      $result = $foo ** $bar;
      
      print '$foo べき乗 $bar = ';
      print "$result\n";
      
      $foo = 100;
      $bar = 2;
      
      $result = $foo / $bar;
      
      print '$foo ÷:bar = ';
      print "$result\n";
      
      my $min = 150;
      
      my $hour;
      
      $result = $min % 60;
      $hour = ( $min - $result ) / 60;
      
      print "$hour 時間 $result 分\n";
      
      # 簡略的な演算方法
      
      $foo = 4;
      $foo = $foo % 3;
      
      print "$foo\n";
      
      $foo = 4;
      $foo %= 3;
      
      print "$foo\n";
      
      # インクリメント・デクリメント
      $foo = 100;
      
      $foo++;
      
      print "$foo\n";
      
      $foo--;
      
      print "$foo\n";
      
      # 後置・前置
      $foo++;
      print "$foo\n";
      --$foo;
      print "$foo\n";
      

      べき乗計算や加減乗除など普通の計算式を書く事が出来る。

    • 文字列連結

      #!/usr/bin/env perl
      my $foo = 'hoge';
      my $bar = 123;
      my $baz = $foo . $bar;
      

      . ( ドット ) を用いる事によって文字同士を連結させて表示させることが出来る。

    • 計算

      #!/usr/bin/env perl
      print  1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
      print "\n";
      
      print 100 - 200;
      print "\n";
      
      print 1000 + ( 1000 * 0.08 );
      print "\n";
      
      print 5 * 2 * 3.14;
      print "\n";
      

      変数を用いない色々な計算方法。

      #!/usr/bin/env perl
      use strict;
      use warnings;
      
      my $pizza = 10;
      
      print '$pizza / 5' . "\n";
      print $pizza / 5;
      print "\n";
      
      print $pizza % 5;
      print "\n";
      

      計算式を表示する方法。

    • 標準入力

      print "Your Name ?";
      my $name = <STDIN>;
      
      chomp $name;
      
      print $name . "!\n";
      
      print "Your OS ?";
      my $name = <STDIN>;
      
      chomp $name;
      
      print $name . " is useful OS!\n";
      

      STDIN は, 最初に全部入力を受け取ってから処理される。

      #!/usr/bin/env perl
      use strict;
      use warnings;
      
      print "num1?";
      my $str1 = <STDIN>;
      chomp $str1;
      
      print "num2?";
      my $str2 = <STDIN>;
      chomp $str2;
      
      print "tashizan : ";
      print $str1 + $str2;
      print "\n";
      
      print "hikizan : ";
      print $str1 - $str2;
      print "\n";
      
      print "kakezan : ";
      print $str1 * $str2;
      print "\n";
      
      print "warizan : ";
      print $str1 / $str2;
      print "\n";
      

      標準入力による加減乗除。

      ls -l
      合計 32
      -rw-r--r-- 1 root root 361  6月  8 16:29 2019 calc.pl
      -rw-r--r-- 1 root root 102  6月  8 15:21 2019 compare.pl
      -rw-r--r-- 1 root root 147  6月  8 14:09 2019 hello.pl
      -rw-r--r-- 1 root root 166  6月  8 16:16 2019 hello.stdin.pl
      -rw-r--r-- 1 root root 185  6月  8 15:39 2019 sansuu1.pl
      -rw-r--r-- 1 root root 152  6月  8 15:53 2019 sansuu2.pl
      -rw-r--r-- 1 root root 271  6月  8 14:25 2019 sclar_practice.pl
      -rw-r--r-- 1 root root 932  6月  8 15:16 2019 text.pl
      

      コマンドラインの標準入出力の結果を標準出力に渡して加工する。

      ls -l | perl -ape 's/^/aaa /'
      aaa 合計 32
      aaa -rw-r--r-- 1 root root 361  6月  8 16:29 2019 calc.pl
      aaa -rw-r--r-- 1 root root 102  6月  8 15:21 2019 compare.pl
      aaa -rw-r--r-- 1 root root 147  6月  8 14:09 2019 hello.pl
      aaa -rw-r--r-- 1 root root 166  6月  8 16:16 2019 hello.stdin.pl
      aaa -rw-r--r-- 1 root root 185  6月  8 15:39 2019 sansuu1.pl
      aaa -rw-r--r-- 1 root root 152  6月  8 15:53 2019 sansuu2.pl
      aaa -rw-r--r-- 1 root root 271  6月  8 14:25 2019 sclar_practice.pl
      aaa -rw-r--r-- 1 root root 932  6月  8 15:16 2019 text.pl
      

      先頭を aaa に置き換えて表示する。

      ls -l | perl -anE 'say $F[8]'
      
      2019
      2019
      2019
      2019
      2019
      2019
      2019
      2019
      

      8 行目を抜き出す。

      ls -l | perl -anE 'say $F[9]'
      
      calc.pl
      compare.pl
      hello.pl
      hello.stdin.pl
      sansuu1.pl
      sansuu2.pl
      sclar_practice.pl
      text.pl
      

      9行目を抜き出す。

    • 条件分岐 ( if 文 )

      my $foo = <STDIN>;
      
      chomp $foo;
      
      if( $foo == 1 ) {
          print "OK\n";
      
      } else {
          print "NG\n";
      
      }
      

      標準入力によって処理を分ける。
      chomp は必ず入れるようにする。
      ↑ 改行が認識されてうまく判定が行えない場合がある。

      #!/usr/bin/env perl
      use strict;
      use warnings;
      
      my $answer = "perl";
      
      print "何か文字を入力?";
      my $str = <STDIN>;
      
      chomp $str;
      
      if( $str eq $answer ) {
          print "OK\n";
      
      } else {
          print "NG\n";
      
      }
      

      文字列比較を行う場合には eq'' を使って比較を行う。

      #!/usr/bin/env perl
      use strict;
      use warnings;
      
      my $answer = 10;
      
      my $user = <STDIN>;
      
      chomp $user;
      
      if( $answer == $user ) {
          print "OK\n";
      
      } elsif( $user > $answer && $user - $answer <= 5 ) {
          print "near too big\n";
      
      } elsif( $user > $answer ) {
          print "too big\n";
      
      } elsif( $user < $answer && $user - $answer <= 5 ) {
          print "near too small\n";
      
      } else {
          print "to small\n";
      
      }
      

      数当てゲーム、ユーザの入力した数値によって答えの数値に大きいか小さいかヒントを与えるプログラム。


perl