金曜日はPerlの日〜一日目

栄えある最初の言語はperlさんで行きたいと思います。
写経本は、「はじめてのPerl
初めてのPerlで。
環境構築は、もうやっちゃったので、ひとまずすっ飛ばします。
win2k+Active Perlです。
ほんとは、cygwinでやろうとしていたんだけど、CPANとやらが
動かなかったので、泣く泣くこっちに変えたのは内緒です。
でも、結局CPANとやらは動いてくれていないのも、
内緒です。
よくよく考えると、oracleインストールして、そいつのperl
パスが一番に通ってたのが原因だった気がするけどとりあえず、
写経程度はできる状態なので良しとします。

第1章 Perl入門

ざっくり飛ばします。

p21

1. Hello, world出してみました。
根本的に認識間違ってたのは、perlってインタラクティブ
使い方もできるかと思ってたけど、ファイルに書いて、それを実行しないと
駄目なのね。
active perlでは、

 #!perl

で書き始めるそうですな。
2.いわれるがままに実行。
3.やってみると、おー、2.の結果と、若干ちがう。
2.では、

  C

と表示されていた部分が、

  MATH::TRIG::TAN

となりました。
正規表現はようわからんので、とりあえず、
Perlを書いてみたってことで喜んどきます。ここでは。

第2章 スカラーデータ

おお、しょっぱなから、あまり聞きなれないお言葉です。
ほぼJavaしかわからん人間には縁遠い言葉です。
ただ、C言語スカラーって言葉に触れた気がしますが。
スカラーは単純に比較できるわけないじゃんみたいな話があったようななかったような。まぁ、そこでも意味は理解してないわけだから、どうでもいいんですが。

2.2 数値

これも飛ばします。眠くなるので。
おいおい使っているうちに、参照しながら出ないと、
このあたりの一覧覚えられるような許容量はおつむにないので。
ただ、目に留まったのは、べき乗でしょうか。

 2**3

で、

 2^3

だそうです。というか、ここでtexが使えることの方に感激してみたり。

2.3 文字列

ほうほう。文字列リテラルは、シングルクォートと、ダブルクォートの
2種類書き方ができるわけですか。
で、ダブルクォートのときは、なかに変数いれてもそれのなかの
データを展開してくれますよと。
このへん、Javaな感覚しか持ってないと、何か気持ち悪く感じちゃいますね。
どこまでが変数かわかりにくい場合もでてくるやん、とかっておもいます。
まぁ、この後そういう場面もでてきたら、また、立ち戻るということで。

2.4 警告メッセージ
 #!perl -w

でいっぱい警告してもらおー。

2.5 スカラー変数

きましたね。ちょっと前後しましたけど。
どうも、Javaになれていると、変数名のあたまに

 $

があるのが気持ち悪いです。なんでつけなきゃならんの?と感じてしまう。
なれると、変数って一目でわかるからいいね。っておもうようになるのでしょうか。この辺の言語仕様がいまいち好きになれないのが、スクリプト言語の習得に
気合が入らない要因だったりしますが。いや、たいしてこだわるようなとこじゃないのはわかってるんですよ。ほんとに。
ただ、どーも、ソースを見てて、読む気がうせるというか、なんというか。。。
生理的な趣向の問題ですね。今回はぐっとがまんして、進みます。

2.5.2 代入
2.5.3 二項演算子

まぁ、ほぼこの辺はどの言語もおなじなのでしょうか。
なんでも2項演算子があるとも限らないとは思いますが。
あと、文字列連結演算子

 $hoge = $hoge . 'ですよ';

なのは、ちょっと目新しいかったです。

2.5.4 print演算子

む、む、む。演算子
関数とはいわないのですか?
この辺、考え方がちがうのか、まだ良くわかんないですね。
あと、カンマ区切りで値を複数渡せちゃうところとかも、生理的にちょっと駄目です。
2.5.5 スカラー変数を文字列の中に展開する
先走って先ほどいいましたが、

 $meal = "brontosaurus steak";
 print "fred ate a $meal";

で、

 fred ate a brontsaurus steak

と表示されるのですね。
当然、

 print "fred ate a $meal someday"; # これは上記と同じ動きをする。
 print "fred ate a $mealsomeday";  # $mealsomedayって変数は宣言されてないので、この場で宣言されて、undef(nullと同じなのかな?)で初期化される。

なわけですが、これってデバッグ大変じゃないですか?
$mealsomedayは初期化されていない時点でエラー出してほしいし、
""のなかにかけるのも、

 print 'fred ate a ' . $meal . ' someday';

の方がわかりやすい気がするんだけどな。
手早く書きたいときとかこっちになれると便利なのかな。
あと、ダブルクォートのほうが、スカラー変数展開のための解析が
入る分処理効率はシングルクォートより遅くなることになるのかな。
だから不用意にダブルクォートを使わない方がいいのだろうか。
そうか、

 print 'fred ate a $meal someday \n';

とすると、

 fred ate a $meal someday \n

と表示されるのね。最後の改行文字が悲しいけど。
そうなると、明示的な宣言をしないことを避けるために。
ダブルクォート禁止ってのもありかも。
そうなると、Perlのよさが失われそうな気もするけど。

2.5.6 演算子

まぁ、ここもおいおい。覚えられないし。

2.5.7 比較演算子

おお!
数値比較と文字列比較は違う演算子があるのか。
JavaだとStringのインスタンスメソッドだっけか?
よくよく考えると、インスタンスに紐づいてる必要もあるのか?
と、こんどは逆に思ってみたりしますね。

2.6 if

特に変わりなし。

2.6.1 bool

+ undef は false
+ 数字の 0 はfalse、それ以外はtrue
+ 空文字列(' ')、ゼロをあらわした文字列('0')はfalse、それ以外の文字列はtrue

いや、かなりいやーん、な感じが漂いますね。
bool型は内実が、int型の0と1なんかで処理されていようと、
あったほうが人間様にはわかりやすいと思うのですが。
記憶力のない人間はこれだけのルールも覚えられないです。
最後の空文字だとか、'0'だとかとっても気持ち悪いです。

2.7 標準入力
 $line = ; #標準入力からのデータを変数$lineに格納

なかなか面白い文法ですね。
なんか、他の文法となじんでないような感じがしてとってもいい!
自分は'<>'に違和感を感じるのでしょうか。
Javaジェネリクスのときもかなり浮いた感じをうけましたね。そういえば。

2.8 chomp演算子

最後の改行文字を削除する演算子ですか。
もう独自色が色濃くなってきましたね。
そいわれると、改行文字はJavaのときはどうしてたっけ?
Readerのメソッド変えて、改行文字含むかどうか変えれるんだっけ?
webアプリばっかりで、入出力なんてもう組めなくなってますな。

chompに話をもどすと、

  • 演算子であること
  • 戻り値が削除した改行文字であること

が、ひっかかりましたね。

printにしても、グローバルな関数のことを演算子perlではよぶという認識で間違っていないのでしょうか。
なんか、トンチンカンなこといってそうで怖いですが。
で、それに渡した変数の指す実体の改行文字がなくなることになるようですが、
これって、新たな改行文字のない実体を作ってそっちへ参照を切り替えてるのでしょうか。それとも、元の実体から、改行文字を削除しているのでしょうか。
これまたトンチンカンなこといってそうで怖いですが。
自分の感覚だと、chompの戻り値で改行文字が削除された文字列が帰ってくると
ちょっと気持ちよかったりしたのですが、まあいいや。

2.10 未定義値 undef

undef は、javaの null とはちがうのかな?
nullだと、単純に参照するアドレスが入ってない認識なんですが、
undefも同じこと?

2.11 defined関数

null判定用の関数ですね。勝手に、undefとnullを同値にしちゃってますが。
ここでよくわかんないのが、
defined : 関数
undef : 演算子
と呼ばれていること。
なんか、関数と演算子はやっぱり違いがあるのかなー。
まだみえないなー。

2.12 練習

1. 2πrの値を求める問題。rは、12.5だそうで。折角なので、標準入力から
 値を取れるようにしちゃいます。

 #!perl -w
 $r = ;
 print 2*3.141592654*$r;

2.は!しまった。著者の意図をくみ取れなかった。
3.間に

 if( $r < 0 ){
    $r = 0;
 }

を入れてみる。
4.

 $first_number = ;
 $second_number = ;
 print "result is $first_number*$second_number\n\";

とすると、

 2 #最初に2を入力
 3 #次に3を入力
 result is 2*3

だって。あたりまえか。

$first_number = ;
print "first numuber is $first_number\n";

$second_number = ;
print "second number is $second_number\n";

print 'result is ' . $first_number * $second_number ."\n";

とすると、ちゃんと表示するけど、ちょっと改行の書き方が悲しい気が。
他にきれいな書き方ありそうですが。

あと、最初の値入力されて、すぐにその文字を表示するようにしているのですが、面白いことに、二個目の値の入力処理の方が先に来て、
それを入力したら、どっちの値も表示処理が始まるようになりました。
こんな感じ。

2
3
first numuber is 2

second number is 3

result is 6

実行環境に依存するのかな?
5.

#!perl -w

$word = ;
print "word is $word\n";

$count = ;
print "$word\n"x$count;

と得意げにやると、以上に改行が多い結果が。。。
ああ、標準入力だと最後に改行コードが入ってくるから、
何も改行はしなくていいのね。。。orz
一日目はこの辺で。。。