• ベストアンサー

perl use strict エラーにならない?

perlの使い方を勉強しているのですが use strict;を記述すると 変数宣言が必要になるということですが 以下のように記述してもエラーになりません。 use strict;を記述すると my $a;がないと$a="Hello";で エラーになるのではないのでしょうか。 ---test.pl---- use strict; $a="Hello"; print $a; -------------- >test.pl Hello > (Windows7, ActivePerl)

  • Perl
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

$a と $b は sort で使うためにあらかじめ用意されてるため、エラーにならないので使わないほうが賢明です。次のようにすると、確認することができます。 use strict; print "\$main::a $main::a\n"; $a = "Hello"; print "\$main::a $main::a\n";

yam2012
質問者

お礼

$a,$b以外にしましたらエラーが報告されました。 ありがとうございました。 なお、 >次のようにすると、確認することができます。 ということで ---test.pl--- use strict; print "\$main::a $main::a\n"; $a = "Hello"; print "\$main::a $main::a\n"; ------------- を実行すると ------------- C:\test>test.pl $main::a $main::a Hello C:\test> ------------- という結果になったのですが これは何を確認したことになるのでしょうか。

その他の回答 (1)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

> C:\test>test.pl > $main::a > $main::a Hello $a と $b はパッケージに属したグローバル変数で、$a と $b の代わりに $main::a と $main::b としても参照できます。上記は、コードの開始時は空で、代入後はその値が表示されることを示しています。

yam2012
質問者

お礼

今後の参考にさせていただきます。 ありがとうございました。

関連するQ&A

  • Perlで use strict して our変数

    Perl 初心者です。初めて質問します。 test_sub.pl で宣言した変数を test_main.pl から参照したくて悩んでいます。 環境 : WindowsXP / ActivePerl 5.14.2 -------------------- * test_sub.pl -------------------- #!/usr/bin/perl use strict; our $hoge = 'HOGE'; 1; -------------------- * test_main.pl -------------------- #!/usr/bin/perl use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; -------------------- これを実行すると、 Global symbol "$hoge" requires explicit package name at C:/public_html/cgi-bin/test_main.pl line 7.\r というエラーが出ます。 require する前に、test_main.pl のほうで our($hoge); と宣言したり 参照する際に print $main::hoge; とパッケージを指定したりすればいけるのですが、 これらをしないとできないものなのでしょうか。 use strict; を書かなければ最初のソースでも動くのですが use strict は書きたい… 継承のようなことをしたいのです。 ちなみに以下試してみたソースです。 -------------------- * test_main.pl -------------------- #!/usr/bin/perl ######################################## # NG use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; ######################################## # OK our変数を宣言しておくといける =pod use strict; our ($hoge); require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## # OK 参照する際にパッケージ名を指定すればいける =pod use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $main::hoge; =cut ######################################## ######################################## # NG =pod use strict; use base qw(test_sub); print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## -------------------- * test_sub.pm -------------------- #!/usr/bin/perl package test_sub; use strict; our $hoge = 'HOGE'; 1; -------------------- NG パタンはどちらも Global symbol "$hoge" requires explicit package name のエラーとなります。 もしご存じの方がいらっしゃいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • use strictが効かない (PERL)

    たびたびお世話になっております。 PERL version 5.14.2 をWindows 7 のコマンドプロンプトから起動して使っています。 use strict; と一行目に書くと 宣言されていない変数があれば拒絶されるとのことで #!/usr/bin/perl use strict; use warnings; $a = 10; print "$a\n"; というスクリプトを書きました。が、すんなり動いてしまいます。 use strict; は どうすればうまく効くのでしょうか。 ご指導お願いします。

    • ベストアンサー
    • Perl
  • Perlでuse strictと %inの共存

    use strictを使うと、変数の使用に厳密にチェックしてくれるので、便利だと思い使いましたが、ReadParse後の%inを利用する場合に宣言されていないエラーが表示されます。意味的には正しいですが、$in{'test'}など CGIで受け取った内容が扱えなくなるので、困っております。何か解決方法は有るのでしょうか? use strict; require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; my $x = $in{'md'};

    • ベストアンサー
    • Perl
  • use strictを宣言してlocal変数を使うには?

    Perl初心者です。初歩的な質問ですが、 サブルーチンの中で my だと、その下の{ } ブロックではmyで宣言したローカル変数がスコープされないので  localを使うのではないかと思いますが、 それだと、use strictではエラーになります。 こんなときどう処理したらよいのでしょうか。

    • ベストアンサー
    • Perl
  • Perl の use strict に付いて

    ●HTML <html><head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>テスト5(UTF-8)</title> </head> <body> <form action="test5.cgi" method="post" > <input type="text" name="f1" value="" size="80"> <button type="submit" >送信</button> </form> </body></html> —————————————————————————————————————— ●Perl #!/usr/bin/perl #use strict; ※問題の行1 use warnings; use CGI; print "Content-type: text/html\n\n"; print "<meta charset=\"UTF-8\">\n"; # POST / GET パラメータを取得------------------------- my $q = new CGI; # パラメータ名を指定して取得する my $param1 = $q->param('name1'); my $param2 = $q->param('name2'); # FORM値の取得----------------------------------- # 全てのパラメータを取得する for my $param_name ($q->param) { print $param_name . ' = ' . $q->param($param_name) ; print "<br>\n"; ${$param_name} = $q->param($param_name); ※問題の行2 } #------------------------------------------------- print "テスト<hr>\n"; print "$f1<br>\n"; exit; —————————————————————————————————————— 【質問】 「※問題の行1」+「※問題の行2」 = エラー 「※問題の行1」のみ = 正常に動きます 「※問題の行2」のみ = 正常に動きます 「※問題の行1」の「use strict; 」と 「※問題の行2」の「${$param_name} = $q->param($param_name); 」 をどう書き換えれば、二つとも記述したまま正常に動くのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • "use strict" を使っての定数宣言

    "use strict" プラグマを使ったスクリプト内で、 ・定数(グローバルかつ不変) ・グローバル変数 を宣言するには、どのようにすればいいのでしょうか。 windows 2000, ActivePerl 5.6.1

    • ベストアンサー
    • Perl
  • perl use strict; と ファイルハンドルについて

    perl use strict; を使うと、単純なエラーが防げると認識していますが、下記スクリプトでは役に立たなかったようで、このエラーを探すのに苦労しました。 他にも、どこかのサブルーチンでsortを使ったスクリプト中で、$aを使った時もおかしな挙動をしたことがあります。 use strict;の使い方は正しいと思うのですが、エラーを出してはくれないものでしょうか? また、このようなエラーをしないために安全なプログラムの書き方はありますか? use strict; open(F,"<file.txt"); while(<F>){ &abc($_); } close(F); sub abc(){ my $str = shift @_; open(F,">>file2.txt"); print F $str; close(F); }

    • ベストアンサー
    • Perl
  • Perlを始めたんですが

    プログラミングを始めようと思ってPerlをしているのですが プログラムを書いて開くとすぐに画面が消えてしまいます ActivePerlというのはいれてあります 書いたプログラムはこんなものです use strict; use warnings; print "Hello world";

    • ベストアンサー
    • Perl
  • strict と require と グローバル変数

    また基本的なことをお伺いします。 ↓メインスクリプト(main.pl) ------------------------------ #!perl use strict; require("x.pl"); print "X = $x\n"; ------------------------------ ↓サブスクリプト(x.pl) ---------------------- our $x = "XXX"; ---------------------- これをそのまま、main.plを実行すると、 Global symbol "$x" requires explicit package name at main.pl line 4. のようにエラーが出ます。 この対処として、色々試したのですが、 例えば、次のようにすれば、とりあえず回避はできました。 ↓メインスクリプトにて、 ------------------------------ #!perl use strict; our $x; ←★ここで宣言を入れておく。 require("x.pl"); print "X = $x\n"; ------------------------------ <質問です> 1)この回避策は妥当でしょうか。他に正しい方法がありましたら、教えてください。 2)そもそも、use strictは、requireの展開よりも先に実行されてしまうものでしょうか。 以上、よろしくお願いします。 Win-2000sp4+ActivePerlのV5.8.7で使っています。

    • ベストアンサー
    • Perl
  • use strictとは

    use strict;と書いた行でエラーになっているようです。 strict.pmが無いからでしょうか? strict.pmはjcode.plみたいに、使いたい人がググってダウンロードしてサーバに置くものなんでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう