nanoaでPerlを学習 その2 strictプラグマwarningsプラグマ

時間がたつとどうやって書いてたのかすら忘れますね.何のために書き始めたのかも忘れてしまってますが...

use strict;
use warnings;

今回はstrictプラグマ,warningsプラグマです.プラグマっていうのは,コンパイラに与えるヒントです.そのプラグマの中でも一番よく見るプラグマがこのふたつです.とても重要なおまじないです.いまどきこのふたつがないコードはありえないと思います.書いてないように見えても使われていることもあります.とりあえず書いておけ,でもokです

strictプラグマは「厳格な」プログラムを書く手伝いをしてくれるし,warningsプラグマは問題が起こりにくいプログラムを書くための「警告」をしてくれます.Perlを使うプログラマには非常に心強い武器になると思います

strictプラグマ

strictプラグマは3つの厳格さを適応します

  • vars(安全でない変数)
  • subs(ベアワード)
  • refs(シンボリックリファレンス)
vars(安全でない変数)

どんな変数が安全かわかれば,安全にプログラムが書けます.strict varsによって安全だと見なされる変数を使いましょう

これで全部ではないですがこれぐらい覚えておけばしばらくは大丈夫です.もっというと変数はとりあえずmyで宣言しとけということです.ここでの宣言とは使うための準備です

$foo = 1;#これはダメ
my $hoge = 1;#myで宣言
our $global = 'for all';#ourで宣言
subs(ベアワード)

ベアワードはbareword.つまり裸の単語です.ベアワードは単独で置かれた単語で,関数など他の意味に解釈されないもののことです

$x = nofunc;#ダメ
$x = 'nofunc';#文字列ならこう
$x = func();#関数呼び出し

関数呼び出しは引数がなくても()カッコをつけておくといいと思います

許可されている特別な文脈もあります

  • ブレース中の単独のベアワード
  • => 演算子の左側のベアワード
# =>の左側はok
my %hash = ( yesterday => 'futomaki', today => 'curry', today => 'unknown' );

$dinner = $hash{today}#{}でクォートされている
refs(シンボリックリファレンス)

シンボリックリファレンスとは変数の名前を変数に入れて,変数にアクセスすることです.実際にはこんな感じです

$hoge = 'foo';

$ref = 'hoge';#変数の名前を変数に入れる
print $$ref;#strict refsではエラー

これはよく陥りがちではないでしょうか.こういうコードを書こうとしたことがあります…….こういう書き方がなぜ悪いのでしょう?

ひとつは,この書き方はグローバル変数にしか使えないからです.この書き方をするためにグローバル変数を使う,なんてことをしてはいけません.グローバル変数はしばしばプログラムに混乱をもたらします

もうひとつは,これはたいていの場合ハッシュで解決できるからです.

my $hoge = 'yesterday';
my %hash = ( yesterday => 'futomaki', today => 'curry', today => 'unknown' );

print $hash{$hoge};# futomaki $hogeでアクセスできた!

シンボリックリファレンスを使うことが役に立つこともあります.それでも基本的にはstrictは有効にしておきたいのでno strict 'refs';などと一時的に無効にする方法を使っていたりします.詳しくは書きませんがnanoaのコードでも使っていますよ

use warnings

Perlには数多くの警告があるのですが,それを制御するためのプラグマです.警告が出るというのは,問題になる可能性のある書き方をしているということです.なんかいろいろ警告出てるからこのプラグマを使わないで消しちゃえ!というのはやめた方がいいと思います

あえてこの使い方をしているという場合は,strictと同じようにno warnings という一時的に無効にする書き方もあります

さいごに

このふたつを書くことでモダンなPerlが始まるような気がします.とりあえず書いておいて損はありません

今回のを書いてから某所で書く方がいいかと思いましたが,まあこのまま続けます