• ベストアンサー

use strictを宣言してlocal変数を使うには?

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

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

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

> なんか、よい本などあればご紹介していただけたら、ありがたいなと、思います。 私は以前、文法が Perl とかなり似ている C/C++ で仕事をしていたので、覚える時にはリファレンス(「CGI&Perlポケットリファレンス」技術評論社)くらいしか必要ありませんでした。 そのため、入門書として推薦できる本を残念ながら知りません。 変わりに技術系書籍のレビュー(?)サイトを紹介しますので、そちらで良さそうな本にあたりをつけて、書店で実際に見ながら選ばれるとよいと思います。

参考URL:
http://www.1point.jp/~book_2ch/webprog/perl.html
ctpsys
質問者

お礼

leaz024 さん ありがとうございます。 参考書の紹介のお願いまでしてすみませんでした。 ご紹介いただいた、サイトは大変よいサイトでした。 ありがとうございます。

その他の回答 (1)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

> サブルーチンの中で my だと、その下の{ } > ブロックではmyで宣言したローカル変数がスコープされないので > localを使うのではないかと思いますが、 これって試されました? my 変数は、ネストした内部のブロックでも利用できますよ。 利用できないのは、呼び出した先の関数の中です。 また、呼び出し先の関数で利用したい場合でも、引数として値またはリファレンスを渡すのが一般的で、local変数を使う機会はあまりありません。 それでも local を使いたい場合、local で利用する変数をグローバル変数として宣言しておかなければなりません。 ・Perl5.0x にはグローバル宣言の方法がないので、パッケージ修飾をした変数を利用します。(パッケージ修飾した変数は、use strict 環境でも宣言なしで利用することができます。) ・Perl5.6 以降では our を使って、グローバル変数を宣言することができます。

参考URL:
http://www.context.co.jp/perlinfo/tech-notes/
ctpsys
質問者

お礼

leaz024さん ありがとうございます。 私の本の読み間違いです。 { }の中だと思ったのですが、関数〔サブルーチン)の中なんですね。 まだ初心者なのでいろいろ勘違い、等もしています。 今後ともよろしくお願いします。 なんか、よい本などあればご紹介していただけたら、ありがたいなと、思います。

関連するQ&A

  • Perlの変数宣言について

    PHPを毎日書いている者ですが、たまたまPerlのメールフォームをカスタマイズ しなければならなくなりました。 use strict宣言がある場合、変数はmyまたはlocalで宣言しなければいけないようですが、 サブルーチン内に sub form { ・・・ my ($form_value,$error_list) = @_; ・・・ print $error_list{'inquiry_type1'} としたところ、 Global symbol "%error_list" requires explicit package name at ・・・ と、宣言が無い場合に出るというエラーが出ました。 $error_listには、inquiry_type1は入っているはずなのですが、どのような 宣言をすればよいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • 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
  • 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
  • "use strict" を使っての定数宣言

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

    • ベストアンサー
    • Perl
  • 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
  • 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
  • strictなPHP

    PHPではPerlで言うところの use strict に相当するものはあるのでしょうか? (変数宣言しないでコーディングできちゃうのが何か気持ち悪くて…)

    • 締切済み
    • PHP
  • 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 スカラー変数とするには・・・

    初心者PERLプログラマーです。 独学で身の回りにPERL仲間がいないため、質問させてください。 スカラー変数を使用してモジュールをuseしたいのですが、どうしてもできません。調べてみましたが検索力の無さからか見つからず… 現在のコードをはしょって書きます ----------------------- my $a = "Hoge"; use $a; my $b = new $a(); $b->run; ----------------------- $aの部分を変数にせず、use Hoge;と書くとうごくので、変数にしたことによるエラーだと思います。 $aを"$a"としてみたりしてもダメでした。 わかるかたご教授いただければ幸いです。

    • ベストアンサー
    • Perl
  • use strictを用いた際のmy,our,local の使い分け

    perl-5.6.1でuse strictを使っていますが、 あるループで定義した変数値を、その後にでてくるいくつかのループで 参照したい場合は、my,our,localのどれを用いればよいのでしょうか? 例えば、 for ( my $x=0; $x<$n; $x++) { my $b= $x*2+1; ??? @a[$x]=$b;  ← our? local? } と定義をし、その後幾つかのループで以下のように参照する場合です。 for (my $z=0; $z<$n; $z++) { if ($z == ($n-1)) { print $a[$z], "\n"; } else{ print $a[$z], "\t"; } } よろしくお願いいたします。

専門家に質問してみよう