• 締切済み

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"; } } よろしくお願いいたします。

  • kooru
  • お礼率60% (6/10)
  • Perl
  • 回答数3
  • ありがとう数2

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

そうそう, my や our は変数全体にしか適用できないので, 挙げられた例では「そこに入れる適切なものは存在しない」というのが正解のような気がします. あらかじめ my なり our なりで定義しておいた方が無難.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

my はレキシカルスコープを持つ変数を作る. our はグローバル変数に対してレキシカルにアクセスする. local はグローバル変数 (の一部) に対し, 一時的に値を代入する.

kooru
質問者

お礼

お礼が遅くなってしまい、申し訳ありません。 ありがとうございます! myに関しての使い方はわかるのですが、our,localに関してはネットを検索してもいまいちよくわかっていませんでした。 まとめてくださって少しわかった気がします。 もしよろしければお時間のあるときに、our,localの使い分けがわかるようなプログラム例を簡単に教えていただければ幸いです。 よろしくお願いいたします。

  • mflow
  • ベストアンサー率63% (42/66)
回答No.1

最初にループの外で宣言しておくのでは何か不都合があるのでしょうか。 my @a; for ( my $x=0; $x<$n; $x++) { my $b= $x*2+1; $a[$x]=$b; }

kooru
質問者

お礼

みなさま、ありがとうございます。 本当は、配列変数名の中に変数をいれたものを、いくつか(数はデータによって異なる)ループを使って定義し、その変数を他のループ内で操作したいと考えていました。 (実際には、前の質問 QNo.2510402 で書かせていただいたとおり、 ループ x: 1-3 ループ y: 1-2 ${"answer$x"[$y]}=入力値 ←??    ループ閉 y ループ閉 x ----------------- と書き、理想は以下のように定義し、その後他のループでこれらの値を操作したいと思っていたのです・・・。 answer1[1] answer1[2] answer2[1] answer2[2] answer3[1] answer3[2] ) x の値の数は、用いるデータによってことなるので、ループの中でしか 定義できないと思っていたのですが・・・ perlに配列の配列があるということを教えていただき、配列を外で宣言することで解決しました! ありがとうございました!

関連する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 に付いて

    ●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
  • 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
  • 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
  • join と split で文字列を操作する場合

    にんにちは、 うまく解決する方法を思いつかないので、質問させてください。 以下のスクリプトを実行すると、a から z を * で join して、 その後、* で split するかなと思ったら、split は正規表現として とらえるためでしょうか、エラーになります。 #! /usr/bin/perl -w use strict; my $a = '*'; my $b = join $a , ('a'..'z'); print "$b\n"; my @result = split /$a/,$b; print "$_\n" foreach @result; exit(); $a = '\*'; にすると、split したときに、 余計な \ が残ってしまいます。 任意の(書く時点では分からない)いろんな文字列で 連結したり分割したりする場合のスマートな方法が ありましたら、教えていただけませんか? Perl 5.8 です。お願いします。

    • ベストアンサー
    • Perl
  • これは動いてくれますか??

    最小二乗法のプログラムを作ってみたのですが、 これで動きますか?? データを読みとった後から、つまり途中からなのですが・・・ $ndata、$x,$yはデータから読み取った値でこの前で使われています。 #!/usr/bin/perl # test1.pl use strict; use warnings; my $X = $x[$ndata] my $Y = $y[$ndata] my $sg =0; my $sg1 =0; my $sg2 =0; for($i; $i < $ndata;$i++;){ $sg1 = $sg1 + ($X)**2; $sg2 = $sg2 + ($X); } $sg = $ndata * $sg1 - ($sg2)**2; my $a =0; my $a1 =0; my $a2 =0; my $a3 =0; my $a4 =0; for($i; $i < $ndata;$i++;){ $a1 = $a1 + ($X)**2; $a2 = $a2 + ($Y); $a3 = $a3 + ($X); $a4 = $a4 + ($X)*($Y); } $a = ( $a1*$a2 - $a3*$a4 ) / $sg my $b =0; my $b1 =0; my $b2 =0; my $b3 =0; my $b4 =0; for($i; $i < $ndata;$i++;){ $b1 = $b1 + ($X)*($Y); $b2 = $b2 + ($X); $b3 = $b3 + ($Y); } $b = ( $ndata*$b1 - $b2*$b3) / $sg $Y = $a + ($b * $X) my $sgy =0; my $sgy1 =0; my $sgy2 =0; for($i;$i < $ndata;$i++){ $sgy2 = $sgy2 + ($Y-$a - $b*$X)**2 } $sgy1 =$sgy2 /($ndata - 2) $sgy = sqrt( $sgy1 ); my $sga =0; my $sgb =0; $sga = $sgy * sqrt( $a1 / $sg ) $sgb = $sgy * sqrt($ndata / $sg ) print "パラメータA=$a,パラメータB=$b./n"; print "Aの誤差は$sga、Bの誤差は$sgb./n";

  • Perlのmyとourについて

    myとourの違いが、飲み込めません。 以下、当方の環境とします。 【コード(1) ファイル名は read.pl とする】 #!/bin/perl use strict; use warnings; my @filelist = <abc*.log>; foreach my $i (0 .. $#filelist){ open(IN, "$filelist[$i]"); my @alltxt = <IN>; sub f_readlines { my $export=0; foreach my $strings(@alltxt){ $export .= $strings; } return $export; } 【コードの説明と前提】 これは、read.plを実行すると、同じディレクトリにある、「abcで始まり .logで終わるファイル」のすべてを引数として、 同じ処理を繰り返すコードです。 実行時のカレントディレクトリには、abc001.log、abc002.log、abc003.logという3つのファイルが存在します。 abc001.log には aaaaaaa という文字列が書き込まれています。 abc002.log には bbbbbbb という文字列が書き込まれています。 abc003.log には ccccccc という文字列が書き込まれています。 【コード(1)の実行結果】 $ ./read.pl aaaaaaa aaaaaaa aaaaaaa 【現状と当方の考え】 このコードの本来の目的は、存在するファイルの数だけ、その中身を順次読みだす、というものです。 ですので、コード(1)の実行結果は $ ./read.pl aaaaaaa bbbbbbb ccccccc になってくれないといけないのです。 しかし、 my @alltxt = <IN>; の行を our @alltxt = <IN>; に書き換えると、うまくいきました。 ネットを見ていると、myはスコープの範囲が限定的で、ローカルな変数のようで、 グローバル(どこでも変数として取り出せる)なものが our、というように読み取れます。 foreach の処理の中で宣言した my @alltxt ですから、 ファイルの数だけ、毎回 @alltxt の中身の値は変わるはずです。 それが、変わってくれず、初回に@alltxtに読み込んだ aaaaaaa だけが、ファイルの数だけ 出力されてしまいます。 【質問したいこと】 (1)myを使って代入した変数の中身は、同じスコープ内で作成した関数からは読みだせないのか? (2)それならば、なぜ初回のaaaaaaaは、読み出せているのか? 以上よろしくお願いします。

  • ハッシュリファレンスの未定義

    サブルーチン/ハッシュリ/ファレンスで悩んでいます。 my (@r); $r[1]{"A"} = "1-A"; # 代入 &s(\@r); print $r[1]{"A"},"\n"; # 参照 print $r[2]{"B"},"\n"; # 参照 サブルーチン側でできない。 # sub s() { my ($c)=@_; @$c[1]->{"A"} = "1111-AAAA"; # もちろん代入できる @$c[2]->{"B"} = "2-B"; # 代入 これができない(ハッシュリファレンスの未定義エラー) } サブルーチン側で新規ハッシュのところに代入ができないのですが どのようにすればいいのでしょうか。

    • ベストアンサー
    • Perl
  • 正規表現の書き方に困っております。

    あるSQLのダンプを変換するプログラムをPerlで書いているのですが、 うまく正規表現が書けなくて困っております。 データの途中に,が有ると、うまくいきません。 ''の中に囲まれた,は無視するという正規表現を書きたいのです。 また、'''B'も正しく処理できれば、完璧です。 #!/usr/bin/perl use strict; use warnings; #my $a = qq{'A','B',1}; --> うまくいく  ['A']['B'][1] #my $a = qq{'A,','B',1}; --> うまくいかない ['A] ['] ['] my $a = qq{',','''B',1}; --> もっとうまくいかない ['][']['] if($a =~ /(.+?),(.+?),(.+?)/){ print "[$1]\n"; print "[$2]\n"; print "[$3]\n"; }else{ print "ERR!\n"; } exit; __END__

    • ベストアンサー
    • Perl

専門家に質問してみよう