4章 サブルーチン

Perlでもユーザ定義のサブルーチンを
作れるんだそうです。(さすがに当たり前?)


この章で今のところわかったこと。

  • 定義はsubで。
  • 定義は基本的にはグローバル。
  • 呼び出す時は&で。
  • 戻り値は、最後に行われた計算の結果。
  • 引数はローカルな配列@_に代入される。
  • サブルーチンが期待するより多くの引数は、無視される。
  • プライベートな変数を作る場合はmy演算子
  • local演算子は、実はグローバル変数でどうこう...*1



戻り値が「最後に行われた計算の結果」である、
という意味はわかりますが、まだ使い方がイメージできないですね。
自分で書けば慣れるかな。


my演算子は、今までstrictのエラーを避けるために
よく知らないで使っていましたが、
プライベートな変数(レキシカル変数*2)を定義するための
演算子だったんですね。:-)


引数は、その数や型がサブルーチンの定義の冒頭に
明記されるわけではなさそうなので、
わかりにくいな、と思ったら、
以下のような感じで冒頭に書くのがいい感じなんですって。

my($a, $b) = @_; #サブルーチンのパラメータに名前を付ける

これならわかりやすいや。


と、長くなってきたので 4.7.1 localとmyの違い までで
一旦区切ります。

*1:今知らなくてもいいことみたいなので、読みましたが深くは考えません。

*2:lexical variable

3.10 練習問題

一通り動かして、解答を参照。
...あれ、随分冗長な書き方だな。私。:-(
まだ全然わかってない感じ。
まぁ、これも慣れの問題ということで片付けておく。


以下、よくわかってなかった箇所。

  • print "@hoge\n"; #@hogeを横に並べて出力。最後に改行。
  • print sort ; #入力した文字列を1行に1個ずつ出力。

3.9 リストコンテキストでを使う

の再登場。
キーボードからの入力を受け付けてくれるようなのは
プログラム書きたくなるので嬉しい。:-)


入力を受け付けて、改行を削って表示するだけだと
こんなカンジかな?

#!/usr/bin/perl -w
use strict;

print "何でもいいので文字を入力して下さい。\n改行も使えます。\n入力終了後はCtrl+Zを押して下さい。\n";
chomp(my @lines = );
print @lines;

動く動く。
と、そんなことをやって練習問題へ。

3.8.2 スカラーを生成する式をリストコンテキストで使う

自動的に1要素のリストに変換される、と。

@fred = 6 * 7; #1要素のリスト(42)が得られる
@wilma = undef;#これも1要素のリスト(undef)が得られてしまう
@betty = ();#配列を空にする正しい方法

2番目と3番目の結果が異なることを注意。

3.8 スカラーコンテキストとリストコンテキストの続き

前回書きかけのまま
仕事が忙しくなってしまいました。
仕切りなおし。


最も重要だというこの章の趣旨は
「式は、置かれている場所によって、意味が変わることがある」
という点です。
これはCなどにはない*1、私にとっては新しい概念でした。


私のよく知っている言語たちは、
ファイルの冒頭で型を宣言して
それから逸脱するとコンパイラがエラーで返します。
細かいことを言えば色々ありますが、
私の中ではこういうイメージでした。


でもPerlでは、このコンテキスト(context)という概念で
この手間を省略しているようです。


考えてみれば、人間が通常の会話の中で、
「今から話すハシとは、橋ではなくて箸だよ」
なんて宣言しなくても、文脈でわかります。
要するにそういうことかな、と。


なんとも柔らかい言語ですね。Perlって。




以下、自分の中で反芻するために、
テキスト中の例文を書き写します。

@people = qw( fred barney betty );
@sorted = sort @people; #リストコンテキスト:fred, barney, betty
$number = 5 + @people; #スカラーコンテキスト:5+3で8になる

$fred = something; #スカラーコンテキスト
@pebbles = something; #リストコンテキスト
($wilma, $betty) = something; #リストコンテキスト
($dino) = something; #リストコンテキスト

#以下、somethingにスカラーコンテキストを提供。
$fred = something;
$fred[3] = something;
123 + something
something + 654
if (something) {...}
while (something) {...}
$fred[something] = something;

#以下、somethingにリストコンテキストを提供。
@fred = something;
($fred, $barney) = something;
($fred) = something;
push @fred, something;
foreach $fred (something) {...}
sort something
reverse something
print something

*1:私の知っている範囲で...

3.8 スカラーコンテキストとリストコンテキスト

ここが、この章で最も大切なセクションです。事実、この本の中で最も重要なセクションだといえるでしょう。あなたがPerlをうまく使えるか否かは、まさにこのセクションにかかっているといっても過言ではありません。だから、これまで流し読みしていた人も、ここから先に書いてあることを、きっちり頭にたたき込んでください。

流し読みしていたことがバレています。w
でも「この本で最も重要」とまで言われたら、
真剣に読みますよ。サスガに。
電車の中ですけど...