フェムトセカンド #七味とーがラジオ / @melonsode

The Destination is unknown. The Journey is the Reward.
Author: 野澤真一 / NOZAWA Shinichi , version 2.0220330 / Podcast: 七味とーがラジオ / twitter: @melonsode

ゼロからプログラミング講座: 2013年アーカイブ

[告知]今週土曜日!ゼロからはじめるプログラミング講座 #3

|

カテゴリ:

ゼロからプログラミング講座(Perl) #3 @越谷 いよいよ土曜日です。 参加希望の方は、下記のURLで参加表明をお願いします。

ゼロからプログラミング講座(Perl) #3 @越谷

お願い・注意点

  • 毎回ノートPCのためのコンセントが足りなくなるので、延長ケーブル、テーブルタップがあったらもってきてください!
  • 初めて参加する方は、第一回、第二回の資料をもとに自習をお願いします
  • 今回の会場は、前回と同じ中央市民会館ですが、部屋が違います!
  • 本編前の補習の時間は「3F 和室 茶華道室さくら」です!(14時~17時)
  • 本編は「5F 第四会議室」です!

自習・復習用資料

第一回 環境構築 / Hello, Worldの出力(print) / 変数

第二回 配列・ハッシュ・if文(条件分岐)・for文(ループ)・my

はじめて参加するかたへ

はじめて参加する方で、自習に不安があるかたは、野澤までご連絡ください!できる限りフォローします。

メモ

  • 現在の参加者 13人(主催者含む)
  • うち、zusaar 12名、他 1名
  • 初参加 6名

使用する資料

callhistory.csv

ゼロからはじめるプログラミング講座(Perl)@越谷 第2回

| | トラックバック(1)

カテゴリ:

ゼロからはじめるプログラミング講座 第2回 講義ノート

  • 2013.9.4 書きかけリリース
  • 2013.9.19 一応、完成

配列を思い出す

配列の定義のしかた

配列の基本は、全体を「丸いカッコ " ( " と" ) "」で囲う。中の要素は、文字列ならシングルクォート( ' )で囲う。ダブルクォートで囲ってもいいけど、それを使うのは、変数展開をするときに適している。数字なら、クォートで囲う必要はない。

# 配列の基本形 - 配列のシジルは@ 
@eras = ('明治', '大正', '昭和', '平成');

# 別にダブルクォートで文字列を囲んでもいい
@eras = ("明治", "大正", "昭和", "平成");

この他に、カッコやクォートを書くのがめんどくさい場合に、qwというのがある。

# カッコやクォートを書くのがめんどくさかったら
@eras = qw/明治 大正 昭和 平成/;
@eras = qw!明治 大正 昭和 平成!;
@eras = qw{明治 大正 昭和 平成};

qw は quote words の略で、words(単語)をクォートして(囲って)ね、という意味。普通は、qw/単語1 単語2 単語3../と、始まりと終わりをスラッシュ( / )でくくるけど、ここの文字は他の文字でもよい。例えば、 | とか ! とか # とか $ とかでもOK。かなりいろいろな記号が許容される。また、4種類のカッコのペア () と{} と [] と <> でもよい。

この qw// の記法はクォートとカンマを省略できるメリットの他に、もう一ついいことがあって、それは、クォートの記号のエスケープをしなくてすむというところ。

例えば、「明治」という単語の中が、(なぜか)「明'治」となって、「明」と「治」の間に、シングルクォートが入っていたとしよう。それを配列に入れようとすると、「明」と「治」の間のシングルクォートは、単語をくくっているクォートとは別なんだよ、と示すために、前にバックスラッシュ(円マーク)をつけないといけない。(下記のように)

@eras = ('明¥'治', '大正', '昭和', '平成');

これを、「エスケープする」というのだけど、こういうことが増えてくると、くくるためのクォートなのか、単語の中に(たまたま)含まれているクォートなのかを判別して、エスケープしていくのが、煩雑になってくる。

しかし、qw// の場合は、くくる文字がシングルクォートではないので、エスケープする必要が生じない。

@eras = qw/明'治 大正 昭和 平成/;

じゃあ、文字の中にスラッシュ( / )が入ってしまったら?そうしたら、 / 以外の文字でくくってやればいい。

@eras = qw!明'治 大/正 昭和 平成!;

このように、エスケープする必要が生じたら、それをしなくていいように囲う文字を造作もなく変えることができるので、 qw// は便利なのである。

配列の要素を呼び出すには

配列は、何番目の要素かを指定してやることで、その要素を呼び出すことができる。

たとえば、

print "$eras[0] ¥n"; # 「明治」とでてくる

注意しなくてはいけないのは、最初の要素は1番目ではなく、0番目であるということ。それから、添字は [ ] という角カッコで囲むこと。(違うカッコの形、たとえば { } だと違う意味になってしまいNG)

表示するのは、

print "$eras[0] ¥n"; # 明治
print "$eras[1] ¥n"; # 大正
print "$eras[2] ¥n"; # 昭和
print "$eras[3] ¥n"; # 平成

とやればいいけど、もっとたくさんの要素数になったら大変。どうする?→ループを使おう

for 文

C言語っぽい書き方

#    はじめ おわり 1ステップ進んだら
for ( $i = 0; $i < 4; $i++ ){
    print " $eras[ $i ] ¥n ";
}

#解説
for ( 条件式 ){
 ループ1回の処理内容
}

最初の $i = 0 は、$i という変数を 0 という値にしていて、初期化の意味合い。2番目は、このループが継続される条件を示していて、この場合だと、4より小さければ続行。3番めの $i++ は $i を1増やすという意味。ちなみに、$-- は1減らす。

このループを日本語にしてみると、

最初は $i は 0
$i は 4より小さいので { } の処理をする
終わったら $i を 1増やす→ $i は 1 になった!
ループの先頭に戻ってくる
いま $i は 1 で、 4より小さい→ループ続行
{ } の処理をする
終わったので $i を 1 増やす→ $i は 2 になった!
ループの先頭に戻ってくる
(中略)
$i を 1増やす→ $i は 4 になった!
ループの先頭に戻ってくる
いま $i は 4 で、 4より小さくない!→ループ終了

という感じである。 { } の中では、条件式で使った $i を使用している。

print " $eras[ $i ] ¥n ";

これは、 $i 番目の添字の要素を表示するという意味になっており、$i は1ずつ増えていくので、ループがまわるごとに1個ずつ要素が表示されていくことになる。

foreachを使うやり方

C言語ライクなfor文は、配列の添字を1個ずつずらしていくことで、 一個ずつ配列の要素を取り出していく方法だった。 この方法だと、添字( $i )をわざわざ用意して、それを一個ずつ増やしていくという ことをしなくてはならないし、 添字の始まりはいくつで、終わりはいくつという”境界条件”について、 考えなければ書くことができない。

添字を使う書き方は、慣れてしまえばどうということはないかもしれないが、 やはり煩わしいのではないか。

その煩わしさから開放される書き方が foreach文による書き方だ。

実は、for文とforeach文はPerl的には等価なので、以下のコードはforeachと書いてあるところを、forと書いてもらっても全く問題ない。

foreach $jidai ( @eras ){
    print $jidai, "\n";
}

#解説
foreach 要素 ( 配列 ){
    ループ一回分の処理
}

配列という入れ物の中から、要素を一個ずつ取り出していって、 中身がなくなったらそれで終わり、というイメージである。 わざわざ始まりと終わりを指定するコードを書かないで済むので、 個人的に書いていて楽だと感じる。

今回は、@erasから要素を一個取り出したら、$jidaiという変数でそれを受け取ったが、 変数名は自由につけて構わない。

ちなみに、要素を受け取る変数名は、省略してしまってもいい。 その場合は、「 $_ 」という特殊変数に要素がセットされる。

foreach ( @eras ){
    print $_, "\n";
}

if文

今度は条件分岐のための構文の、if文である。

例えば、平成という年号は1989年にはじまるので、 もし1995年生まれだったら平成生まれだし、1980年生まれだったら昭和生まれだということになる。

その人が平成生まれか昭和生まれか、プログラムで判定するプログラムを書いてみることにする。

print 'Born year?:';

$b_year = <STDIN>;

chomp( $b_year);

if( $b_year < 1989 ){
        print "Showa!\n";
}else{
    print "Heisei!\n";
}

最初は、「生まれた年は?」と聞いてるつもりで、「Born year?」と表示し、 その直後で、入力を受け付けるようになる。()受け取った入力の改行コードを削るのが chomp($b_year) で、このあたりは第一回でやったのでそちらを参照してほしい。

$b_year という変数に何年生まれかの数字(おそらく19ではじまる4桁の数字)が格納されていて、それが if文 の条件式にはいる。

if( $b_year < 1989 ){
        print "Showa!\n";
}

「 $byear < 1989 」は$byearの値が1989よりも小さい、という意味で、 この式が正しければ、つまり、$b_yearに入っている数字が1989より小さければ、 そのあとの { } で囲まれたブロックが実行される。今回は、単純に「 Showa!」と表示するだけである。

if文 は、単にこれだけでも成立する。

しかし、これだけだと、1989以降の値を入力した人には何も表示されなくて切ないことになってしまう。そこで、 else という分岐を加えて、先の「$b_yearの値が1989よりも小さい」という条件に合致しない場合は、こちらのブロックを実行せよ、と支持している。

今回は、1989以上の数字が入力された場合は、「 Heisei! 」と表示するようになっている。

if( $b_year < 1989 ){        # 1989より小さかったら
        print "Showa!\n";  # 昭和!
}else{                               # そうじゃなかったら
    print "Heisei!\n";           # 平成!
}

このように、if文はelseと同時に使うことが多い。

そして、もう一つ、if と else の他に、 elsif というものがある。

elsif

注意点は、「 elseif 」でも「 else if 」でもなくて、「 elsif 」だということである。

先の、 if - else の場合は、「条件Aが真ならばこれこれ、そうでなければそれそれ」、という二者択一的な分岐だった。elsifを用いると、「条件Aが真ならばこれこれ、(条件A、は真ではないけど)条件Bが真ならばあれそれ、そうでなければそれそれ」と分岐の選択肢を増やすことができる。

1989年に生まれた人は、生まれた日によっては、平成生まれかもしれないし、昭和生まれかもしれないので、もし、1989と入力されたときは、即「平成!」とレッテルを貼るのは不正確である。ということで、以下のように修正をした。

if( $b_year < 1989 ){
    print "Showa!\n";
}elsif($b_year == 1989){
    print "Showa or Heisei!\n";
}else{
    print "Heisei!\n";
}

今度は、 elsif( $b_year == 1989 ) という条件が加わった。今度は、$b_yearが1989に一致したら、という意味になる。イコールが2つつながる( == )と数字として一致するという意味になります。

「 $b_year == 1989 ($b_yearが1989と一致するという条件式)」と「 $b_year = 1989 ($b_yearに1989という値を代入)」は「 = 」が一個あるかないかの違いしかありませんが、意味がまったく違うので、注意しましょう。

練習:for文とif文を組み合わせる

配列の宣言の仕方として、 こんなのもあります。

@years = ( 1970 .. 2013 );

#上は下と等価
@years = ( 1970, 1971, 1972, 1973, (中略), 2010, 2011, 2012, 2013 )

1970 .. 2013 と書くことで、1970から1ずつ増やして2013までの連続した数字の配列をあらわすことができます。何十もの要素をもつ配列ですが、こんなに簡単に表現できてしまいます。

これを使って、 1970年から2013年までを1年ずつ表示し、それが平成か昭和か判定するプログラムを書いてみます。

@years = (1970..2013);

for $y ( @years ){
    if( $y < 1989){
        print "$y : Syowa !\n";
    }elsif( $y == 1989){
        print "$y : Syowa or Heisei !\n";
    }else{
        print "$y : Heisei !\n";
    }
}

forのブロックの中に、if文で条件分岐し、条件ごとに違った文字列を出力しています。 自力で書くことができたでしょうか?

ハッシュの練習

ハッシュは前回触れましたが、もう一度ハッシュを扱う練習です。

ハッシュとは、キーとバリュー(値)がペアになっている変数の集まりのことです。

例えば、平成は1989年からで、昭和は1926年から、大正は1912年からで、明治は1868年から、という風に、年号と始まりの年のペアをそれぞれキーとバリューと考えた時に、それを表現するハッシュを書いてみます。

%era_year = (   'Heisei' => 1989,
                'Syowa' => 1926,
                'Taisyo' => 1912,
                'Meiji' => 1868
             );

これは見やすくするために、複数行にわけて書いていますが、一行にしてしまっても構いません。

また、キーとバリューを結ぶ記号として「 => 」を使っていますが、 実は、単にカンマでもOKです。奇数目の変数がキーで偶数目がバリューだとPerlは解釈できるからです。しかし、人間の目にはわかりずらいので、たいていは「 => 」を使って書きます。

#一行にしちゃってもOK(でも見にくい)
my %era_year = ( 'Heisei' => 1989, 'Syowa' => 1926, 'Taisyo' => 1912, 'Meiji' => 1868 );
# => 使わなくてもOK(でも見にくい)
my %era_year = ( 'Heisei', 1989, 'Syowa', 1926, 'Taisyo', 1912, 'Meiji', 1868 );

キーは文字列なので今回はシングルクォートで囲んでいますが、 ダブルクォートで囲んでもいいですし、 実は文字列が一定の条件(ハイフンをふくまないなど)をみたせば、 クォートを省略することができます。 Perl は => という記号を目印に、その左側は文字列であると判断できるからです。

バリューの方は、その変数の性質(数字なのか文字列なのかオブジェクトなのか変数なのか)によって、適切にクォートをつけたりしてください。

ハッシュとfor文を組み合わせる練習

今度は、ハッシュと先ほど練習したfor文の練習です。

「(年号)は(西暦)年から始まります」

という文を、次々に表示するコードを書いて下さい。

ハッシュのキーは keys という関数を使うと、キーだけを一括して取り出し、配列にすることが出来ます。 そのキーの配列をfor文で回して、ハッシュの値を次々に取り出して行きます。

@era = keys %era_year;

for $jidai (@era){
    print "$jidai は $era_year{$jidai} にはじまります。\n";
}

use strict と my

ここまでやってきて、プログラムが動かない!という場面に何度も遭遇したと思いますが、変数名を打ち間違えていたというケースがけっこう多かったように見受けられます。

例えば @era と書くところを @ear と書いてしまったり、$eras[$i]と書くところを@eras[$i]と書いていたり。

そのようなたかが1文字違うだけでも、Perlはまったく違うものとして扱うため、プログラムは止まってしまいます。そして、人間の目には1文字の違いは見落としがちで、なぜプログラムが動かないのかわからずに煩悶しがちです。

そういうミスを回避するために、「 use strict; 」を使います。

use strictを使うと、変数は、使う前にあらかじめ宣言することが必要になります。use strictの使い方は、単に、ファイルの中に 「 use strict; 」と一行書くだけです。各場所はどこでもいいのですが、たいていはソースコードの一番上、シバン行のすぐ後に書きます。

#!/usr/bin/perl

use strict;

my $words = 'Hello, World';
print $words, "\n";

上のコードでは、 $words という変数の前に my というものがくっついていることに気づいたと思います。

my を変数の前に書くと、「この変数名をこれから使います!」という宣言になります。「私の」という意味のmy です。(似た言葉に our があります)

先ほどのハッシュのコードは、use strictすると、下記のように書かないと動きません。

use strict;

my %era_year = (    'Heisei' => 1989,
                    'Syowa' => 1926,
                    'Taisyo' => 1912,
                    'Meiji' => 1868
                 );

my @era = keys %era_year;

for my $jidai (@era){
    print "$jidai は $era_year{$jidai} にはじまります。\n";
}

こうすると、何が嬉しいのでしょう? my という文字を打つ手間が増えるだけじゃないかと思うかもしれませんが、そうではありません。

use strictすると、宣言をした変数しか使えなくなるため、 @eraと書くべきところで @earと書いてしまったら、Perlがエラーメッセージを吐いてくれるようになります。

@eraは宣言されていますが、@earは宣言されていません。なので、宣言されていない @earが突然でてきたら、Perlは、「そんな変数を使うなんて聞いてない」とプログラムを停止し、エラーを出力します。

そのようにエラーがでてくれば、プログラマは、すぐにどこかでミスをしたことに気付くことができます。もし use strict をしていないと、@earと書いてあっても、ひとまずはプログラムが止まることなく動いてしまうので、プログラマはミスに気付くのが遅くなります。

use strictすると、他にもいろいろと"厳しく"なるのですが、その厳しさは、どれもプログラマを助けてくれるためなので、今後はuse strict; を必ず書くようにして、変数には my をつけて宣言してから使うようにしましょう。

ゼロからプログラミング講座(Perl) #2+補講@越谷 開催しました。

|

カテゴリ:

あ、告知してなかった・・・・。

先日、7月に「ゼロからプログラミング講座」を開催しましたが、
その際に、二回目の開催を希望していただけたので、
8/31に第二回を開催いたしました。

#2もつつがなく開催でき、その後の懇親会も
楽しい時間となったので、ほっとしております。

人数は、第一回が5名だったのが、
第二回は10名に増えました。(ありがとうございます)

第二回は次のような時間割でした。
14:00 〜 15:00 準備(机移動とか) (2名)
15:00 〜 17:00 第一回の補講    (5名?)
17:00 〜 19:00 第二回の本編    (10名)

第一回の補講は、最初は、マンツーマンで、「わからないところはどこですか?」と
聞きながらやっていたのですが、人数が4,5人になって
同じことの繰り返しになってきたので、
講義形式に切り替えて、第一回の内容をおさらいしました。

第二回本編は、for文とif文の扱い方をやりました。
と、同時に、配列の扱い方とハッシュの扱い方も絡めて、
講義を進めました。
内容は、別エントリにまとめる予定です。
(しかし、すでに記憶が薄れておる・・・)

自分としては、進むスピードが(一部の人にとっては)のろすぎるのではないかと
ずっと気になっていたのですが、終了後に聞いてみると、
思いの外、遅すぎるという意見はなかったようなので、ほっとしました。
(もう少しはやくてもいいという意見はありましたが)

業務に役立つPerl」の著者である木本さんも参加してくださって、
ものすごく驚きました。

講座の終了後は、たまたま同じ日にすぐ近くで開催されていた、
川辺のジャズコンサートがあり、そこに出店が3軒(居間人さん、ココチーノさん、エルカミーノさん)あったので、
ジャズの音楽を聞きながら、しばしみんなで缶ビールやジュースを片手に
タコスを食べて歓談しました。
(イスがなかったので、立ち食い!)

歓談が一段落し、家が遠い方が帰られたあと、
移動して、近くにあったイタリア料理のお店に移動しました。
そこでまた、楽しく飲んだり食べたりしました。

マニアックなサーバーのセキュリティの話とか、
OSの仮想化の話がでたかと思えば、
なぜか高齢化の話しとか移民の受け入れの話とかもでたりして、
そうやって話題がIT関連以外のところにも振れたのが、
個人的には面白かったです。

第三回は10月の初旬の土曜日(おそらく10/3)を予定しています。

もっと参加してくれる人が増えるといいな〜と思う反面、
これ以上増えると、マネジメントできなくなりそうっていうのがあり、
また、第三回から参加だと、さすがに補講が大変そうというのもあり。

でも、今度、いくつかのイベントに、プログラミング講座の宣伝にいこうかとも
考えていたりもする。


ゼロからはじめるプログラミング講座(Perl)@越谷 第一回

以下、メモです。時間を見つけて、加筆修正する予定です。

前提

  • 参加者の方には下記の準備をしてきてもらっています。
  • 教えるプログラミング言語はPerlという言語です。
  • まったくの初心者歓迎
  • プログラミングを学ぶ時の一番最初にして最大の障害である、「環境の構築」を一緒にやります
  • 反響をみて、第二回以降を開催
  • 場所は越谷

準備

Perl入学式の第二回資料を印刷して持ってきてもらう。

Mac の人

  • テキストエディタをインストールしてきてもらう
  • テキストエディタは使い慣れているものがあれば、それでOK
  • テキストエディタというものがどういうものかわからない人にはSublime Text 2というエディタを紹介
  • http://www.sublimetext.com/

Winの人

  • VMWare Playerをインストールし、その上に仮想化したUbuntuをインストールしてきてもらう
  • インストールのやり方は下記のPerl入学式の下記スライドを参照
  • http://www.slideshare.net/papix/perl-1
  • インストール後はUbuntuを全画面で表示する設定や、ダッシュボードのアイコンを整理したりしてもらっておくほうが良かった

講座内容

ターミナルとテキストエディタ

ターミナル(Ubuntuは"端末"と呼ぶ)と、 テキストエディタを開いてもらう。

テキストエディタは、Macの場合、Sublime Text 2、 Ubuntu の場合は デフォルトで入ってる gedit。

以降、Perlの話よりもターミナルの使い方がメイン。

which perl

which perl
  • perlがどこにあるか
  • (どのPerlを使っているか)
  • そもそもPerlが入っているか

確認できる。

/usr/bin/perl

想定される反応はこういうもの。(環境によって異なるが)

ディレクトリの構成について解説

ls コマンド

今いるディレクトリのファイル・ディレクトリ一覧を表示するコマンド

  • ls
  • ls -l パーミッションや所有者名など詳細を表示
  • ls -a 「 . 」ではじまる隠しファイルも表示
  • ls -la -lと-aをあわせたもの

など。lsはlistの略。他にもオプションがある。

cd コマンド

  • cd [行きたい場所]

change directoryの略 とりあえず、

cd /

とやって、一番上の階層「 / 」に行ってもらって、 それからユーザーのデフォルトの場所まで戻ってきてもらった。

lsを使っていまいる場所にどんなディレクトリがあるか探ったり、 tabキーを打ってコマンドの補完をしたり、 ↑キーを使ってコマンドの履歴を呼び出したりする練習。

下記のコマンドで一発で戻れる

cd ~/

「 ~ 」このニョロのマークはチルダと読む

Hello, World を書いて保存

やっとPerlの話になる。

プログラム初心者のはじめの一歩、Hello, Worldを表示するプログラムを書く。 テキストエディタで下記のように書く。 最初は、改行文字( ¥n あるいは バックスラッシュn)はなしで。

#!/usr/bin/perl

print "Hello, World";

そして、これを適切な場所に保存する。 今回は、Document(あるいは書類)というディレクトリに 「sample.pl」という名前で保存してもらった。 (この操作はGUIで行う)

そして、先ほどの cd コマンドや ls コマンドを駆使して、 ターミナル上でそのファイルを見つけ出し、実行してもらう。

sample.plの実行

sample.plが置いてあるディレクトリまで移動できたら、

perl sample.pl

とやって実行してもらう。

Hello, Worldの解説

1行目はシバン行(シェバン行)と呼ばれているが、 おまじないとしておく。

最初は、行末の改行文字なしで実行してもらい、 改行文字がないと結果がどうなるかを実感してもらった。 それから、改行文字あり。

#!/usr/bin/perl

print "Hello, World¥n";
  • Hello, World を囲っているのはダブルクォート(シングルクォートではない)
  • 全部半角文字でうつ
  • print と「 " 」の間にはスペースを必ず入れる

それから、ダブルクォートをシングルクォートにするとどうなるか、実験。 シングルクォートにすると、変数展開しないため、¥nは改行にならず、 そのまま¥n(えんまーくえぬ)と表示されるのを確認。

プログラムを実行するもうひとつの方法

実は

perl sample.pl

とやって実行する場合は、最初の一行のシバン行(#!/usr/bin/perl)はいらない。 なぜなら、実行するときに、perlと打っているから。

そして、次のようにも実行できる。

./sample.pl

しかし、現状では「Permission Denied(権限がありません)」と表示されて、実行できない。

権限を変更する方法 chmod コマンド

  • 読み、書き、実行の3種類の権限の組み合わせ
  • 読み = read = r, 書き= write = w, 実行 = execute = x
  • user, group, otherの3種類の実行者分類
  • 権限を変更するのは chmod コマンド
  • change mode
  • userに実行権限を付与するとき:chmod u+x sample.pl
  • 権限をなくすとき:chmod u-x sample.pl
  • u+xとかではなく、644とか755とか数字で表現することもできる

和暦(平成)を西暦 に変換するプログラム

Hello, Worldができたところで、変数の扱いを知るために、 与えられた数字を西暦に変換するプログラムを作る。

#!/usr/bin/perl

$jyear = 25;
$year = $jyear + 1998;

print "$year¥n";

これを実行すると、「2013」という答えが返ってくる。
意味合いとしては、入力された数字を平成の年だと解釈して、 それを西暦に変換してる。

もう少し、結果をわかりやすくするために、下記のように加工。

#!/usr/bin/perl

$jyear = 25;
$year = $jyear + 1998;

print "平成 $year 年は $year 年です。¥n";

こうすると、「平成 25 年は 2013 年です。」という結果がでてくるようになる。

値を入力できるようにする(標準入力を受け取る)

いまの状態だと、平成21年が西暦何年か、平成3年が西暦何年か調べるために、 いちいちプログラムを書き換えなければならない。 そこで、平成何年を調べたいかプログラムに尋ねさせて、それに答えて(数字を入力して)結果を出力するという風に変更する。

#!/usr/bin/perl

print "平成?";
$jyear = <STDIN>;
$year = $jyear + 1998;

print "平成 $jyear 年は $year 年です。¥n";

こうすると、「平成?」と画面に出た後に入力待ちになり、 そこに数字を打ち込んでエンターを押す(例えば20)と、

平成 20
年は 2008 年です。

という結果になる。

ここで、結果が二行になってしまっているのは、表記ミスではなく、実際にそうなってしまう。

この場合は、20と打った後にエンターキーを叩くので、そのエンターキーによって入力された改行がそのまま反映されてしまうからである。

その余分な改行を取り除くにはchompという関数を使う。

#!/usr/bin/perl

print "平成?";
$jyear = <STDIN>;
$year = $jyear + 1998;

chomp( $jyear );
print "平成 $jyear 年は $year 年です。¥n";

こうすると、余分な改行は出てこない。

  • STDINはStandard Inputのこと。日本語だと標準入力。
  • これを書くと、ターミナルの入力を受け付ける
  • STDINを囲んでいるくの字カッコ( < と > )は見た目のためではなく意味がある
  • STDINという文字列は予約されていて、他の用途では使えない
  • STDINの他に、STDOUT, STDERRというのがある

変数とは

変数とは文字列とか数値とかを1個格納するもの。

上記のプログラムでは、$jyearと書かれているところに、例えば25と書けば、実行できるがそうすると、別の数字で実行したいときに全部書き換えなければいけない。

しかし、変数でおいておけば、その変数に値を代入する行だけ書き換えればよい。

今回のコードでは、和暦の数字を格納するための変数の変数名として「$jyear」という変数名を使った。jyearの j はJapanのJのつもりだったが、j を l (エル)とか i (アイ)とかと見間違える人が多かったし、そのあとで出てくる、「$year」という変数と1文字しか違いがなく、それも間違いのもとなので、 $jyear という名前の付け方は良くなかったようだ。

というわけで、 $jyear という変数名はやめて、 $input という変数名にしましょうと提案、実際に書き換えてもらった。

#!/usr/bin/perl

print "平成?";
$input = <STDIN>;
$year = $input + 1998;

chomp( $input );
print "平成 $input 年は $year 年です。¥n";

ポイントは、$jyearだったところで、全て、残らず、書き換えることである。1個でも漏らしたり、スペルミスをすると、動かない。(動くかもしれないが、望む挙動をしてくれない。)

Perlにおける変数名は、先頭に必ず「 $ (ドルマーク)」がつくこと。これが、他の言語とは異なる特徴で、他の言語の場合、こういうマークは一切つかない。

配列、ハッシュ

変数の次は配列とハッシュ。配列は値を複数持つもの。

@array = ('John', 'Taro', 'Hanako');

このように、表現する。変数と違い、先頭の文字は「 @ (アットマーク)」である。 配列にアクセスするときは何番目の要素かを指定してアクセスする。

$array[0] だったら John
$array[1] だったら Taro
$array[2] だったら Hanako

ということになる。注意することは、1番目からはじまるのではなく、0番目から始まるということ。

ハッシュは、配列の時は添字(何番目の要素か)という情報をもとにアクセスしたが、それだと不便なときがある。そういうときに、キーワードになる文字列でアクセスできるようなキーと値のペアのことである。

%hash = ( 'Taro' => 'Japanese', 'John' => 'American');

この場合、Taro と Japanese という文字列がペアになっている。 要素にアクセスするときは次のようにする。

$hash{'Taro'} とすると Japanese という値が出てくる

配列とハッシュで注意することは、まず、個々の値を呼ぶときは先頭の文字が@や%ではなく、変数と同じ $ になっていることである。

配列:@array 配列の要素:$array[0]

 ハッシュ:%hash ハッシュの要素:$hash{'Taro'}

次に、カッコの形も重要である。配列は添字を書き込むときに、角カッコで囲む。一方、ハッシュの時は弓カッコで囲む。

配列の要素:$array[0] ← 添字 0 は [  ] で囲われてる

 ハッシュの要素:$hash{'Taro'} ← キー'Taro' は { } で囲われてる

配列を使ってみる

@array = ('Yamada', 'Tanaka', 'MyName', 'Suzuki');

上のような配列を与えられた時に、自分の名前を表示するようにする。 (私の名前は MyName です)

解答:

#!/usr/bin/perl

@array = ('Yamada', 'Tanaka', 'MyName', 'Suzuki');

print "私の名前は $array[2] です¥n";

ポイントは

  • 添字は3ではなく、2である(0番目からはじまる)
  • ダブルクォートでくくる

そのほかに、確認として、ダブルクォートをシングルクォートに変えてみたり、 「"私の名前は" . $array[2] . "です¥n" 」と文字列を分割し、 ピリオドを使って結合してみたりしました。

第一回はここまで〜

その他

  • 今回の参加者は6名(自分含む)
  • 会場費 500円いただいた
  • 会場代 3500円(午後・夜間使用料+電源代)
  • 電源が遠く、テーブルタップのコンセントが足りず
  • 携帯の電波は良好
  • スクリーンなかったけどプロジェクタはきれいに映った
  • プロジェクタのアダプタの問題で、 ターミナルとテキストエディタを実際に移す様子を見せられなかった
  • 前日に参加を決めた方がおり、連絡が間に合わずUbuntuがない状態で参加
  • dankogaiさんのサーバーを使用 http://colabv6.dan.co.jp/lleval.html
  • 終了後は、サンシティの地下のお店(るーぱん)で懇親会
  • 懇親会は5名参加(割り勘で1200円程度)

このカテゴリの年別アーカイブ

プロフィール

月別アーカイブ

全アーカイブ

フェムトセカンド1.0


メールを送る(故障中)