なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

「初めてのPerl」を読んでいて、「へぇ」だったこと。

注意:このエントリは初めてのPerl(リャマ本)を読んでの、きわめて個人的なメモです。*1
すっごく初歩的なことも書いてます。
かつ、まったく体系的な記述じゃありません。


こんなメモを読んでくださった奇特な方、
そして、「その解釈間違ってる」とか「今はそんなことやらない」とかいうご指摘をいただける神のような方、歓迎いたします。



2章 スカラーデータ

数値の桁区切りとして_(アンスコ)が使える。

3章 リストと配列

STDINは改行ごとに1つ入力を受け取る。よって、2つの入力を受け取るときは、

$p1 = ;
$p2 = ;

となる。

@p

で、改行入れながら複数入力。Unix系ならCtrl+D、Windows系ならCtrl+Zで入力終了。


配列の扱い

@array[0]  = "aaa"
@array[99] = "xxx";

とか、いきなりインデクスに大きな値やると、その数値までのundefな要素が作られる。


配列の要素数を数えるのに、負のインデクス指定が使える。
負のインデックスは後ろから数える。
-1は最後の値。
ほかのインデックスも使えるが、実質は-1以外の負の数は使われない。


qwで、複数要素に対してシングルクオートで囲むのと同じことをやってくれる。
これ、「書く人」のことを、思いっきり考えてくれている言語だなーって思う。
シングルクオートとかダブルクオートとかで囲んだ文字列リスト作るのって、カナリ不毛な作業だし。


リストの取り扱いが、なんてしなやかなんだ!
リスト代入、push/pop、shift/unshift、
まだ50ページしか読んでいないのに・・・。


$_はforeachでループ変数を省略したときにループ変数として機能する。

chomp(@array=);

おまじないのように覚えておく。

4章 サブルーチン

サブルーチンは、Procedure(戻り値なし)とfunction(戻り値あり)を区別しない。
最後に評価した式の結果が、戻り値となる。


って、めんどくさいことになってないか。
「retrun」でいいじゃない。
戻り値を使うか使わないかは、使う人に任せる、ってことなのか?
→returnもちゃんとあるのね。可読性を考えると、retrunを使ったほうがよさそう、と思うのは、
 Perlの流儀ではないらしい。解りきっているところでreturnと打つのもムダだと。
 returnを明示的に書くときは、即値返しやundef返しなど、理由があるときだけでよいと。

今度は@_でサブルーチンへの引数リストを扱うとな。
my($a,$b) = @_;
で、リスト代入でルーチンローカルの明示的変数に格納すると扱いやすい、と。


localはグローバルである!めんどくせ。
localで変数宣言したルーチンの中で格納した値は、そこから呼び出した子供のルーチンの中からアクセスすることができる。
myで変数宣言したルーチンの中で格納した値は、そこから呼び出した子供のルーチンの中からはアクセスできない。グローバルで宣言されている場合、グローバル側で格納した値が子供のルーチンの中で読み出される。


サブルーチンへの引数リストに制限がない!
サブルーチン側で、引数リストを明示的に宣言する必要がないっ!
サブルーチン側が想定している引数の数以上のリストを渡しても無視するっ!
他の言語を使っている人からすると衝撃的。
なんて緩やかな、しなやかな言語なんだろう。


組み込み関数と同じサブルーチン名を宣言できるっ!
こんなの絶対はじくでしょ、他の言語なら。


1〜1000までの値をサブルーチンに渡すのに、

&ルーチン名(1..1000)

とな。
ふむふむ。これは他言語のfor文で大体サポートしているが、サブルーチンに使えるというが重要か。

意外と、練習問題はポイントついてくるなあ。
標準回答時間が迫ってくると焦る。


というわけで、4章まで読了。

*1:メインはPL/SQLJavaはちょっとかじった程度の筆者がPerlという言語に触れた印象を書いてます。