質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

2782閲覧

あるときから変数の前にmyを付けないとエラーとなる。

trm

総合スコア117

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2018/02/21 01:09

編集2018/02/21 02:15

ある程度スクリプトを作ってきたのですが、あるときから、変数の前にmyを付けないとエラーとなってしまうようになりました。そこで変数の前にmyを付けるとmyが必要ないとエラー表示されたり、myを付けているのにmyと付いていないとエラーが出ます。一体何なんなんでしょう?この解決策をお願いします。

use strict; use warnings; use utf8; use CGI; my $query = new CGI; use CGI qw(:standard); use File::Copy; #binmode STDIN, ':utf8'; #binmode STDOUT, ':utf8'; #binmode STDERR, ':utf8'; #use strict; #use warnings; #use DBI; #use DBD::SQLite; #追加use #use utf8; #use CGI; #$query = new CGI; #use CGI qw(:standard); #use File::Copy; #binmode STDIN, ':utf8'; #binmode STDOUT, ':utf8'; #binmode STDERR, ':utf8'; #use strict; #use warnings; #追加use終了 #binmode STDIN, ':encoding(cp932)'; #binmode STDOUT, ':encoding(cp932)'; #binmode STDERR, ':encoding(cp932)'; my $syouhinkensaku = $query->param('syouhinkensaku'); my $dir = "syouhin"; chdir $dir or die "Cannot change working directory $dir: $!"; my @file = glob "*"; #@syouhinfile=join(",", @file)"\n"; my @syouhinfile=join(",", @file); #$abc = "kensakuitiji.txt"; #open(OUT, ">> $abc") || die("ファイルを追記モードで開けませんでした"); #$msg2 = "@file\n"; #print OUT $msg2; #close(OUT); if($syouhinkensaku ne ""){ my $i=index(my @syouhinfile,my $syouhinkensaku); my $j=$i; while(1){ my $sub = substr(my @syouhinfile, my $i, 1); if(my $sub eq ","){ last; my $i=$i-1; } } $i=$i+1; while(1){ my $sub = substr(my @syouhinfile, my $j,1); if(my $sub eq ","){ last; my $j=$j+1; } } $j= $j-1; my $k=$j-$i-1; my $sub2 = substr(@syouhinfile, $i, $k); } print "Content-type: text/html\n\n"; print<<"HTML"; <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>検索ヒット</title> </head> <body bgcolor="#000066" text="#ff0000" link="#0000ee" alink="#0000ee" vlink="#551a8b"> <form action="b5.cgi"> <form> my @syouhinfile<br> my $sub2<br> <input type="submit" onclick="location.href'b5.cgi'" value="NEXT"><input type="reset" value="RESET"> </form> <br> <br> </body> </html> HTML exit;

上述のコードをデバッグすると、my $sub2 にmyが付いていないとエラーになります。

use strict; use warnings; use utf8; use CGI; my $query = new CGI; use CGI qw(:standard); use File::Copy; #binmode STDIN, ':utf8'; #binmode STDOUT, ':utf8'; #binmode STDERR, ':utf8'; #use strict; #use warnings; #use DBI; #use DBD::SQLite; #追加use #use utf8; #use CGI; #$query = new CGI; #use CGI qw(:standard); #use File::Copy; #binmode STDIN, ':utf8'; #binmode STDOUT, ':utf8'; #binmode STDERR, ':utf8'; #use strict; #use warnings; #追加use終了 #binmode STDIN, ':encoding(cp932)'; #binmode STDOUT, ':encoding(cp932)'; #binmode STDERR, ':encoding(cp932)'; my $syouhinkensaku = $query->param('syouhinkensaku'); my $dir = "syouhin"; chdir $dir or die "Cannot change working directory $dir: $!"; my @file = glob "*"; #@syouhinfile=join(",", @file)"\n"; my @syouhinfile=join(",", @file); #$abc = "kensakuitiji.txt"; #open(OUT, ">> $abc") || die("ファイルを追記モードで開けませんでした"); #$msg2 = "@file\n"; #print OUT $msg2; #close(OUT); my $i; my $h=0; my @sub2; if($syouhinkensaku ne ""){ while($i!=-1){ my $i=index(@syouhinfile,$syouhinkensaku,$h); my $j=$i; while(1){ my $sub = substr(@syouhinfile,$i, 1); if($sub eq ","){ last; my $i=$i-1; } } $i=$i+1; while(1){ my $sub = substr(@syouhinfile,$j, 1); if($sub eq ","){ last; my $j=$j+1; } } $j=$j-1; my $k=$j-$i-1; my $l=my $l+1; $sub2[$l] = substr(@syouhinfile,$i,$k); my $h=$i+1; #$i=-1; } } print "Content-type: text/html\n\n"; print<<"HTML"; <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>検索ヒット</title> </head> <body bgcolor="#000066" text="#ff0000" link="#0000ee" alink="#0000ee" vlink="#551a8b"> <form action="b5.cgi"> <form> @syouhinfile<br> for(my $m=1;my $m=my $l;my $m++){ $sub2[my $m]<br> } <input type="submit" onclick="location.href'b5.cgi'" value="NEXT"><input type="reset" value="RESET"> </form> <br> <br> </body> </html> HTML exit;

上述のコードをデバッグすると、
my $l=my $l+1;
のmyを取るとmyが必要と表示され、myを付けるとmyが必要ないと表示されます。そして
for(my $m=1;my $m=my $l;my $m++){
$sub2[my $m]<br>
}
の$m と$lに myがついているにもかかわらず、myが付いていないとエラーが表示されます。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/02/21 01:19

該当のソースコードをご提示願います。エラーメッセージについても「つけていないときのエラー」「つけたときのエラー」 両方ご提示願います。これだけでは見ているほうは何も分かりません。
trm

2018/02/21 01:36

了解しました。
m.ts10806

2018/02/21 02:30

「あるとき」前後にやったことは分かりますか?そこが解決のヒントになるように思います。
guest

回答1

0

ベストアンサー

Perl

1use strict;

これがついていることで、宣言されていない変数を使おうとするとエラーになるのです。
参考

my は local などと同様に宣言時に必要なものなので、スコープ内で2回以上同一変数名に対して my を使ってはいけません。

投稿2018/02/21 02:30

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trm

2018/02/21 02:42

有難うございました!なにとぞ今後も宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問