msys2・ターミナル(黒い画面)編
スライドの入力例の先頭にある $
マーク
この $
は一般ユーザー権限でコマンド入力待ちになっていることを示すものです。
UNIXやLinuxには権限といった考え方があり、一般ユーザーとスーパーユーザー(管理者,root)とで実行できるコマンドに差があります。
書籍やスライドにある先頭の $
は入力する必要はないです(というか、手元のターミナルに既に表示されているはず
スーパーユーザーの場合には、先頭に #
と表示されます。
whoami
はユーザー名を表示するコマンド、su -
は一般ユーザーから管理者ユーザーになる時のコマンドです。
先頭の $
が #
に変わっています。
以前に入力したコマンドをもう一度使いたい
キーボードの ↑
↓
キーを押すことで、過去に入力したコマンドが出てきます。
長いファイル名を入力するのが大変
キーボードの TAB キーを押すことで、ファイル名が補完されます。
長いファイル名のファイルを作成し、それを削除する時に先頭のファイル名先頭の a
のみを入力してTABキーでそれ以降を保管しています。
ターミナルの画面が入力した文字や、実行結果で埋まってきた・・・
clear
コマンドで画面がきれいになります。
CUIは寡黙
コマンドが成功した場合には特に応答を返さないことが多いです。
エラー時にはエラーメッセージを表示します。
OSの歴史編
プログラミング言語の系統図
Plotter ってのをクリックすると一枚のPDFで表示されます。重いので注意。
Perlは1987年に誕生しています。
書籍だと、この本が簡潔にまとまってて良いです。もちろんPerlも載ってます!
詳説! 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版(訳書訂正版)によるとこうです。
ちなみに、すごい驚いたんですが、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";