- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!技術的雑談-use strictを使いましょう
!!環境
*perl全般(多分、よっぽど古いperlのVersionではない限り)
!!現象
*perlでscriptを書いているときに原因不明のバグが出る。
*とにかく思ったとおりに動かない。
!!対処
とりあえず、プログラムの先頭に「use strict;」の1行を入れる習慣をつけましょう。
perlはデフォルトの状態で、変数の宣言が自動的に行われるようになっています。
例えば、
1: #!/usr/bin/perl
2:
3: $abc = 'aaaa';
4:
5: $acb = $abc . ' hohohoho!';
6:
7:print "$abc\n";
というプログラムがあったとします。
(実際は行番号は入力しません。)
これは、実行すると、
aaaa
という出力があります。
「あれ? ' hohohohoho!'はどこ行っちゃったの?」
と思われるかもしれませんが、よく見てください。$'''acb'''に対して文字列を追加しています。
でも、コンパイラは何も問題にしていません。
それは、
*3行目で「$abc」という変数を確保し、'aaaa'という文字列を代入する。
*5行目で「$acb」という変数を確保し、$abcの内容に' hohohohoho!'を付け足して代入する。
*7行目で$abcの内容(='aaaa')を画面に出力する。
という流れになっているためです。
で、'''use strict;'''の出番です。
use strict;とは、「厳密な文法チェックを有効にする」とマニュアルにはあります。
具体的には、
*変数の宣言を強制する。
*使用する変数のスコープ(有効範囲)を厳格に求める。
が行われます。(本当はそれだけじゃないんですが…。)
先ほどのプログラムの2行目に「use strict;」と入れて、再度実行すると、今度は以下のようにエラーが出ます。
Global symbol "$abc" requires explicit package name at test.pl line 3.
Global symbol "$acb" requires explicit package name at test.pl line 5.
Global symbol "$abc" requires explicit package name at test.pl line 5.
Global symbol "$abc" requires explicit package name at test.pl line 7.
Execution of test.pl aborted due to compilation errors.
これの意味は、
*Symbole(=変数) "$abc"は厳密なパッケージ名を要求されます。(=厳密にパッケージ名を指定しないと使わせません。)
です。
変数の使用宣言を行う前に変数を自動宣言して使わせようとするとuse strict;配下ではエラーになります。
これを回避するには「my」などの局所化演算子をつけます。
myというのは、「今、この宣言のあるスコープのパッケージ名前空間にXXXXという変数を宣言する。」という意味です。
特殊な場合を除き、「use strict;配下ではmyをつけて宣言をしないと変数は使えない。」と覚えておいてください。
先ほどのサンプルプログラムでmyを使うべき箇所は3行目になります。
3: $abc = 'aaaa'; → my $abc = 'aaaa'; に修正。
でも、そうすると今度は5行目のエラーが残ります。
プログラム本来の意図から言うと、ここは$abcの打ち間違えですから、変数名を$acb→$abcに直します。
直し終わったサンプルを以下に示します。
1: #!/usr/bin/perl
2: use strict;
3: my $abc = 'aaaa';
4:
5: $abc = $abc . ' hohohoho!';
6:
7: print "$abc\n";
これを実行すると、
aaaa hohohoho!
と、本来狙ったとおりの出力を得る事ができます。
「せっかくperlは変数宣言なしで変数を使えるのに!」と思うかもしれませんが、1画面に収まらないようなプログラムを書いたり、不要なデバッグを減らすためにもuse strict;をつけてからプログラムを書く習慣をつけることをお勧めします。
!!履歴
2006/6/20 -- 初版
[[技術的雑談]]へ戻る
!!突っ込み
*good - 名無しさん (2016年04月14日 16時35分07秒)
{{comment}}
[[技術的雑談]]へ戻る
{{trackback}}
[[技術的雑談]]へ戻る