sironekotoroの日記

Perl で楽をしたい

Perl入学式 2018 in東京 秋開講 第1回 落穂ひろい

msys2・ターミナル(黒い画面)編

スライドの入力例の先頭にある $ マーク

この $ は一般ユーザー権限でコマンド入力待ちになっていることを示すものです。
UNIXLinuxには権限といった考え方があり、一般ユーザーとスーパーユーザー(管理者,root)とで実行できるコマンドに差があります。
書籍やスライドにある先頭の $ は入力する必要はないです(というか、手元のターミナルに既に表示されているはず

スーパーユーザーの場合には、先頭に # と表示されます。

whoamiはユーザー名を表示するコマンド、su -は一般ユーザーから管理者ユーザーになる時のコマンドです。
先頭の $# に変わっています。

f:id:sironekotoro:20181104141155g:plain

以前に入力したコマンドをもう一度使いたい

キーボードの キーを押すことで、過去に入力したコマンドが出てきます。

長いファイル名を入力するのが大変

キーボードの TAB キーを押すことで、ファイル名が補完されます。

長いファイル名のファイルを作成し、それを削除する時に先頭のファイル名先頭の a のみを入力してTABキーでそれ以降を保管しています。

f:id:sironekotoro:20181104135513g:plain

ターミナルの画面が入力した文字や、実行結果で埋まってきた・・・

clear コマンドで画面がきれいになります。

CUIは寡黙

コマンドが成功した場合には特に応答を返さないことが多いです。
エラー時にはエラーメッセージを表示します。

OSの歴史編

プログラミング言語の系統図

www.levenez.com

Plotter ってのをクリックすると一枚のPDFで表示されます。重いので注意。
Perlは1987年に誕生しています。

書籍だと、この本が簡潔にまとまってて良いです。もちろんPerlも載ってます!

www.socym.co.jp

詳説! Hello world

!/usr/bin/env perl
use strict;
use warnings;

print "Hello world!";

1行目:#!/usr/bin/env perl

いきなりわかんないですよね・・・ということで定番書籍にご登場願います。

#!/usr/bin/perl
(中略)

Unixシステムでは、テキストファイルの最初の2文字が #!shebang:シバンまたはシェバンと発音します)だったら、その後ろに続くものが、ファイルの残りの部分を実際に実行するプログラムの名前になります。このケースでは、そのプログラムは usr/bin/perl に格納されています。

はじめてのPerl 第7版 電子版 14p

この上記の例だと、「このファイルは /usr/bin/perl で実行してくださいねー」とシステム(Unix)に伝える行、と思ってください。

ですので、この行を適当に書き換えると、Unixはどのプログラムで実行して良いか分からず、エラーになったり異なる応答をします。
macOSで実行してみました。

  • 1行目を存在しないプログラム名(SuperDuperMiracleLanguage)にした場合
    #!/usr/bin/SuperDuperMiracleLanguage
  $ perl hello.pl  
  Can't exec SuperDuperMiracleLanguage at hello.pl line 1.

そんなプログラム無いから実行できないよ、とエラーが出ます。

  • 1行目を別のプログラム言語にした場合 #!/usr/bin/ruby
  $ perl hello.pl  
  hello.pl:2:in `<main>': undefined local variable or method `strict' for main:Object   (NameError)

rubyとしてファイルを実行したけど、rubyが2行目の use strict の解釈でエラー、と出ます。

では/usr/bin/env perl って?

再度定番書籍にご登場願います。

Unixシステムの中には、 #! 行に次のように書くと、perlを探してくれるものもあります。

#! /usr/bin/env perl

はじめてのPerl 第7版 電子版 14p

ということで、Unix環境の中からPerlを探してくれることを期待して書く行なのでした。

2行目:use strict;

厳密な書式を定めたり, 未定義の変数を警告するといった効果があります

変数については第2回でやるので、そこで説明します。

3行目:use warnings;

望ましくない記述を警告してくれる効果があります。

例えば、use warnings の無い、このようなプログラムで実験してみます。

#!/usr/bin/env perl
use strict;

print;

実行します。

$ perl hello.pl
$ 

エラーは出ません。
print 文ですが、なにをprint、表示するのかの指定が無いプログラムです。

しかし、これは正しいprint文でしょうか?何も表示しないなら、不要な行なのでは?

こういったあやしい記述を警告してくれるのが use warnings です。

#!/usr/bin/env perl
use strict;
use warnings;

print;

実行します。

$ perl hello.pl
Use of uninitialized value $_ in print at hello.pl line 5.

エラーが出ます。
エラーの内容は「未定義の暗黙の変数使ったな!」ってやつなのですが、「エラーが出たんでどっか直さないとダメなんだな」くらいでokです。

4行目:(空白行)

Perlでは空白文字であるスペースやタブは無視されます。
そのため、これらの空白文字を使ってプログラムを読みやすくすることができます。

5行目:print "Hello world"

・・・古来、というか1989年の「プログラミング言語C 第2版(訳書訂正版)によるとこうです。

https://pbs.twimg.com/media/DrID3ibUcAAWXbK.jpg

ちなみに、すごい驚いたんですが、Perlちょっとやってると、Cのプログラムが読めます。書けないけど。びっくり。

練習問題(1), 練習問題(2)

TMTOWTDIのモットー通り、いろいろな書き方があります。

  • 普通の書き方
print "Perl-Entrance\n";
print "2018/10/27\n";
print "Gotanda\n";
print "Tokyo\n";
  • 1行で書いてみる
print "Perl-Entrance\n2018/10/27\nGotanda\nTokyo\n";
  • 偏屈な書き方
print "Per";
print "l-Entrance\n20";
print "18/10/27\nGot";
print "anda\nTokyo\n";

上記3つとも同じ出力になります。

  • 練習問題(2)の引き算
print 2018 - 1987;
  • 練習問題(1)と練習問題(2)の引き算も含めて1行で・・・ってのは第1回の範囲では無理かなー?
    第2回でやる文字列連結演算子 . (ドット) と計算部分をカッコで囲む方法を使います。
print "Perl-Entrance\n2018/10/27\nGotanda\nTokyo\n" . (2018 - 1987) . "\n";