blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_0

Perl use「 strict 」プラグマ (0x35)

Perl use「 strict 」プラグマ (0x35)

目次 - Perl Index



Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x35 回。

Perl 、制約と誓約のプラグマ「 strict 」について。




あなたがそれを望むなら ...



Perl は、とても寛容なプログラミング言語だと言います。

それは他のプログラミング言語と比較してのことですが、他の言語に精通している訳ではない僕にとって、その感触は掴むことが出来ません。

それでもかろうじて、僕がその初歩を学んだ C 言語と比較すれば、いたるところに自由があることを感じます。

自由 ( Freedom ) は一見良いものの様に思いますが、なぜそれが自由であるのか、その事由を知らない状態では、大きなストレスを感じることもあります。

反対に、制約に縛られる (自由に制限がある) ことは、面倒で退屈である反面、それに従順である限り安心で快適な場合があります。

「 完全な自由は真の退屈だ 」という様な話もあるので、何が良いのかを一概に決定することはできません。

Perl のスローガンは「 There is more than one way to do it. (TMTOWTDI : やり方はひとつじゃない) 」です。

自由度の高い Perl は、多種多様な方法を許容しますが、もしあなたが「 制約を望む 」なら、それもまた許容します。そういう方法も「 ひとつのやり方 」だからです。

あなたが制約を望む場合、Perl では「 strict 」というプラグマを利用します。これは、自由な気風の Perl に対して、少しだけ厳しい制約を提供します。

use strict プラグマ



英語の「 strict 」は、「 厳しい 」や「 厳格な 」という意味を持ちます。

日本語と英語をつなぐ 」というブログで教えてもらいましたが、その語源は「 ぴんと張られた紐 」なのだそうです。

「 str 」という文字列自体が「 ぴんと張った 」という意味を持っているとも書いてあります。興味深いですね。

Perl の「 strict 」プラグマは、ですから、ぴんと張られた「 厳格な 」枠組みを提供します。

「 厳格な 」といっても、 strict プラグマは「 安全でない構文を制限する 」ものなので、本質的に厳格な言語に比肩する「 厳格さ 」を演出出来るというわけではありません。

それでも strict プラグマは、 Perl プログラミングをカジュアルにこなすエンジョイ勢に対しては、十分に厳しい制約を提供します (「 strict 」は「 relax 」の反対の意味を持つ言葉です) 。

「 プラグマ 」とは、「 Perl warnings プラグマで怪しげな部分に 警告 を出す (-w の代替) (0x15) 」で説明した様に、 Perl のコンパイラに対して指示を出す機能です。

warning プラグマは、「 怪しげな部分に警告を出す 」様に指示をしましたが、今回の strict プラグマは、「 より良いルールを "強制" する 」様に指示を出します。

use strict プラグマの初歩的な具体例



例えば strict プラグマは次の様に動作します。


my $foo = "abc";

$bar = def;

print "$foo\n$bar\n";


まず、use warnings も use strict もない状態で実行してみます。結果は次の通り何の問題もありません。

abc
def


次に、use warnings を指定して実行してみます。結果は次の通り警告が表示されますが、一応 print 文も実行されています。

警告文の意味は「 クォーテッドされていない文字列 "def" は将来衝突するかもしれません 予約語と 」です。

Unquoted string "def" may clash with future reserved word at yourfile.pl line n.
abc
def


最後に、use strict も併せて指定してみます。結果は次の通りコンパイルエラーが発生します。この場合プログラムは動くことが出来ません。

Global symbol "$bar" requires explicit package name at yourfile.pl line n.
Global symbol "$bar" requires explicit package name at yourfile.pl line n.
Bareword "def" not allowed while "strict subs" in use at yourfile.pl line n.
Execution of yourfile.pl aborted due to compilation errors.


表示されるメッセーは「 グローバルシンボル "$bar" は必要とします 明示的なパッケージ名を. 」と「 裸のワード"def" は許可されません "strict subs" では. 」です。

それから「 yourfile.pl の実行は 中止されました コンパイルエラーが原因で. 」と続きます。

「 明示的なパッケージ名が必要 」は、グローバル変数に対しての注意です。これは「 my 」や「 our 」等の修飾子を使って変数を宣言しなければならないという意味です。

「 裸のワード 」だと注意されているのは、クォートされていない文字列です。「 strict sub 」の「 sub 」は、strict プラグマが持つ 3 つの制約のうちの 1 つです。

strict プラグマは「 refs 」,「 vars 」, 「 subs 」の制約を「 use strict "vars"; 」の様に選択的に利用することが出来ます。「 use strict; 」の様に何も選択されない場合は、すべての制約が適用されます。

今回の「 裸のワード 」を禁止しているのは「 subs 」の制約だということが Perl のメッセージから読み取れます。

3 つの制約



第 1 に「 subs 」の制約は、既に確認した通り、「 裸のワード 」を禁止することです。perldoc には「 詩的な最適化を禁止 (this disables the poetry optimization) 」するとありますが、少し意味がわかりません。

第 2 に「 vars 」の制約は、our, use vars, my で宣言されるか、完全に修飾された変数以外を認めません。「 明示的なパッケージ名 」を求めるものがこれです。ただし、「 $_ 」や「 @_ 」のように予め準備されている変数は対象からはずれます。

また、変数名「 $a 」と「 $b 」は「 Perl 「 sort 演算子 」でリストデータの並びをコードポイント順に並び替える (0x2a) 」で確認した様に、sort 演算子による特別扱いがあるため、これも対象外です。

第 3 に「 refs 」の制約は、シンボリックリファレンスを認めません。シンボリックリファレンスは、"リファレンス" という機能の一部ですが、これについては追々学習します。

strict プラグマは「 レキシカルスコープ 」を持っているので、選択的に制約を掛けるブロックを指定することも出来ます。また、「 no strict 」というフレーズを使えば、特定のブロックのみ制約を取り除くことも出来るそうです。これも追々学習します。

0x35 -> 0x36 へ



多くの Perl プログラマは use strict を指定することを推奨しています。特に 1 画面に収まらないプログラムを書く場合は、単純なタイプミスや思いもよらない危機の回避に役立つからです。

そういう訳で僕は、これから書く Perl のプログラムでは、その冒頭に「 use warnings 」と「 use strict 」を書くこととします。今後僕が例として提示するコードにも、その表示の枠外に両者が書かれています。


参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。

目次 - Perl Index





















同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲