[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 05/09 17:29 / Filesize : 66 KB / Number-of Response : 262
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Perlコーディング初心者質問スレ Part 59



1 名前:nobodyさん [2009/02/16(月) 11:42:29 ID:gvPTpodw]
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ pc11.2ch.net/test/read.cgi/php/1218030872/

92 名前:nobodyさん mailto:sage [2009/02/21(土) 14:34:37 ID:???]
>>84
そういうのは考えたことが無かったな。
SUPER.pm使うぐらいしか思いつかない。

package main;
use SUPER;

my $obj = Child->new;
$obj->whoami; # child
$obj->super('whoami')->();

>>89
ユニークな値ならなんでもよし。

93 名前:nobodyさん mailto:sage [2009/02/21(土) 15:01:05 ID:???]
>>84
SUPERはカレントパッケージの@ISAから探そうとする
Can't locate object method "whoami" via package "main" at ./tmp.pl line 19.
と言われるようにカレントパッケージがmainなのでwhoamiは見つからない



94 名前:nobodyさん mailto:sage [2009/02/21(土) 18:31:27 ID:???]
>>92
同じ名前で呼び出すことにこだわるなら、必要なときに分岐できるように
ChildのCをさらにオーバーライドすると思う。
それか、別名で定義するか

95 名前:nobodyさん mailto:sage [2009/02/21(土) 18:32:52 ID:???]
訂正、Childのwhoamな

96 名前:nobodyさん mailto:sage [2009/02/21(土) 18:34:39 ID:???]
>>89
オブジェクトをハッシュにキーにしてはいけないと聞いたことがある。
何故かはしらね
オーバーロードしてるよきに困るからじゃないか?

97 名前:nobodyさん mailto:sage [2009/02/21(土) 20:18:48 ID:???]
一から作れるなら、こんな感じか。
PersonをインターフェイスにしてChildに多重継承させてもいいけど、
ちょっとゴチャつきそう。

package Person;
sub new {
my $class = shift;
return bless { @_ }, $class;
}
sub whoami {}

package Parent;
use base 'Person';

sub whoami { print "parent\n" }

package Child;
use base 'Person';

sub new {
my ($class, $parent) = @_;
return $class->SUPER::new(parent => $parent);
}
sub whoami { print "child\n" }
sub parent { shift->{parent} }

package main;

my $parent = Parent->new;
my $obj = Child->new($parent);
$obj->whoami; # child
$obj->parent->whoami; # parent

98 名前:nobodyさん mailto:sage [2009/02/21(土) 20:31:17 ID:???]
>>97
そういう形になりますか、ありがとうございます。


オーバーライドしたとき、元のメソッドを呼びたいときっていうのは、珍しいことでしょうか?

99 名前:nobodyさん mailto:sage [2009/02/21(土) 20:53:13 ID:???]
珍しいかどうかじゃなくて、設計の勉強しろよw

100 名前:90 mailto:sage [2009/02/21(土) 21:01:21 ID:???]
すみません、自己解決しました。
ファイルが
lib/haga/hoge.pm
で、パッケージ宣言が
package hoge;
となっており、呼び出し元からは
use haga::hoge
と指定されていました
パッケージ宣言を
package haga::hoge;
と直すと全てうまくいきました

しかし不思議なのは、パッケージ自体は使えたことですね
import関数だけが呼ばれないようでした



101 名前:nobodyさん mailto:sage [2009/02/22(日) 14:43:56 ID:???]
>>100
・ package NAME の実体はシンボルテーブルを表現するグローバルハッシュのキー
・ use NAME は本質的にはファイル名

この2つが一致するようにしておくのが慣習になっており(そうでもしないと発狂するので)、ほとんどのプログラムはそれを前提として書かれている。

use haga::hoge; は lib/haga/hoge.pm を見ており、import は package 宣言と同じ名前空間を見ている。
それは前述のようにハッシュなので、キーが見つからなければ黙って *自動生成* される。

use は正しいファイルを読み込み、package は指示された名前空間を設定し、内部的に import は仕様通り仕事を果たしており、問題は発生していないためエラーの類は出ない。

結論: あんまり不思議じゃありませんでした。


102 名前:nobodyさん mailto:sage [2009/02/22(日) 14:54:31 ID:???]
>>101
おお〜なるほど

為になります
ありがとうございました

103 名前:nobodyさん mailto:sage [2009/02/24(火) 03:40:08 ID:???]
Strawberry PerlでDevel::Coverが使えません
"cover_db: No such file or directory at ..."で死にます
似たような症状が出た人っていますか?

104 名前:nobodyさん mailto:sage [2009/02/24(火) 10:37:41 ID:???]
No such file or directory なんでしょ?

105 名前:nobodyさん mailto:sage [2009/02/26(木) 21:12:44 ID:???]
最近RPM化が流行っているようなのですが、一番良い方法はどれなんでしょうか。

106 名前:nobodyさん mailto:sage [2009/02/27(金) 02:14:12 ID:???]
「cpanモジュールの」という語を補完して考えると、cpan2rpmでいいんじゃまいか

107 名前:nobodyさん mailto:sage [2009/02/27(金) 21:23:42 ID:???]
>>106
> 「cpanモジュールの」という語を補完して考えると、cpan2rpmでいいんじゃまいか

Catalyst とか Sledge とかをインストールする場合とかどんなですか。

108 名前:nobodyさん mailto:sage [2009/02/28(土) 21:24:49 ID:???]
最近perlを始めたのでこのスレを読み始めました。
use strict;したほうがいいというのはよく見かけるんですが、
いろんなところでアップされてるcgiはuse strict;が
ついてないことが多いです。これはどうしてでしょうか。

109 名前:nobodyさん mailto:sage [2009/02/28(土) 21:48:56 ID:???]
大昔はuse strictしないことが多かった
最近ではuse strictしてないコードはマジキチ

あとさ、アルファベットは半角使おうぜ

110 名前:nobodyさん mailto:sage [2009/02/28(土) 22:24:27 ID:???]
>>108
納品前に strict と warnings は外してる。



111 名前:nobodyさん mailto:sage [2009/02/28(土) 22:41:55 ID:???]
>>108
use strict;を付けるとエラーが出るから付けないって人も居た。
本末転倒。

112 名前:nobodyさん mailto:sage [2009/02/28(土) 23:26:30 ID:???]
>>110
糞ソースだから、君ははじめから strict 付きで開発出来ないんだよね。
がんばれよ

>>108
strict 付きで動かなかったり、warnning 出るスクリプトは糞です。
過剰表現ではなくて。

113 名前:nobodyさん mailto:sage [2009/03/01(日) 00:40:14 ID:???]
まぁ〜た始まったよ

114 名前:偽者 mailto:sage [2009/03/01(日) 00:53:45 ID:???]
まあまあ、俺に免じて許してやって

JAPU

115 名前:nobodyさん mailto:sage [2009/03/01(日) 01:21:33 ID:???]
いろんなところのcgiじゃなくてcpanモジュール見なさい。
君が見てる「いろんなところのcgi」とやらは例外なくゴミだから。

116 名前:nobodyさん mailto:sage [2009/03/01(日) 02:49:23 ID:???]
BEGIN CHECK INIT ENDなどの特殊なメソッドについて調べたいんですが、なんてググったらいいですか?あと、perldocのどの項目見たらいいですか?

117 名前:nobodyさん mailto:sage [2009/03/01(日) 03:00:05 ID:???]
>>116
perldoc.jp/docs/perl/5.8.8/perlmod.pod

begin end check init block perl 辺りで。
PODをgrepした方が速いけどね。

118 名前:nobodyさん mailto:sage [2009/03/01(日) 03:21:26 ID:???]
はてなとかで、perlでキーワード検索して、perl書いてる人のブログを追っていくと良い。
その前に、初めてのPerlと続・初めてのPerlを読んだ方が良いかな。

119 名前:nobodyさん mailto:sage [2009/03/01(日) 16:15:08 ID:???]
use Moose;するとuse strict; use warnings;が含まれるので、
CPANでstrict, warnings使ってないじゃないか、
という揚げ足取りをされないために、念のため補足

120 名前:nobodyさん mailto:sage [2009/03/01(日) 16:27:40 ID:???]
Mooseだけど、
システム開発を本職でやってる人たちって、やっぱオブジェクトつくるときMooseつかってる人多いの?
俺は仕事の補助的にperl使ってるだけで、今はスカラをblessして使ってるけどMooseに切り替えて見ようかなとか検討中。




121 名前:nobodyさん mailto:sage [2009/03/01(日) 16:50:17 ID:???]
こないだ出たモダンPerl入門を少し立ち読みしてみたらいいと思う
けっこうしっかりとMooseについて纏められているよ

122 名前:nobodyさん mailto:sage [2009/03/01(日) 17:20:11 ID:???]
Moose の本って、1冊しかないの?

123 名前:nobodyさん mailto:sage [2009/03/01(日) 17:20:33 ID:???]
>>121
情報サンクス。
近くにその本置いてそうな本屋がないくらいど田舎なんで、
モダンPerl入門を森林組合に注文してみた。


124 名前:nobodyさん mailto:sage [2009/03/01(日) 17:50:25 ID:???]
>>122
Moose自体は2006年頃に初登場だから
比較的新しくてたぶん他にはないんじゃないかな
ブログとかにも情報なくはないよ

125 名前:nobodyさん mailto:sage [2009/03/02(月) 00:11:21 ID:???]
流れ的にこんな質問していいのか分からんけど
CGI.pmでクエリキーは得られるが値がundefになる。誰か助けて。

use strict;
use warnings;
use CGI;
my $query = new CGI->new();
my @params = $query->param();

print ''.$ARGV[0]."\n";
for my $key (@params)
{
print $key. "=";
print $query->{$key} || '';
}

$ perl cgitest.pl hoge=moge
hoge=moge
hoge=

環境はActivePerl 5.10.0/CGI.pm 3.41です。

126 名前:nobodyさん mailto:sage [2009/03/02(月) 00:15:02 ID:???]
new CGI->new();

こんな書き方初めて見たお(´・ω・‘)

127 名前:nobodyさん mailto:sage [2009/03/02(月) 00:31:20 ID:???]
>>124
perldoc CGI;
すれば一瞬で解るようなことなんだが。

まあ、取り敢えず$query->param($key)して落ち着け。
ハッシュで得たいならmy %query = $query->Vars();しとけ。

128 名前:nobodyさん mailto:sage [2009/03/02(月) 00:31:51 ID:???]
アンカーミス... OTL

129 名前:nobodyさん mailto:sage [2009/03/02(月) 00:35:54 ID:???]
>>120
Moouse/Mouseもハッシュベースじゃないオブジェクトは
(無理じゃないけど)アレだよ。
どうしても必要があるとき以外は、俺はハッシュベースにしてる。

で、Moose/Mouseだけど、OOにするのと同様に、
或る程度以上の規模のプロジェクトならありがたみが増すけど、
そうでなくて、かつ、現状で満足できているなら、
無理に使わなくても十分やってけると思う。

まあ、one liner用のooseとかもあるくらいだから、
ちっこいプロジェクトでも使いではあるけどね。

130 名前:nobodyさん mailto:sage [2009/03/02(月) 00:38:03 ID:???]
my $query = CGI->new->new;
こう解釈されるのか。
案外普通だ。



131 名前:nobodyさん mailto:sage [2009/03/02(月) 00:57:22 ID:???]
>>127
がーん、俺の使い方が間違ってたのか。
後付けになるけど今までActivePerl 5.6/CGI.pm 3.04を使っていて、>>125の書きかたでも通ってたんだ。
今までに作ったスクリプトは全部書き直しだなぁ。
どうもありがとうです。

132 名前:nobodyさん mailto:sage [2009/03/02(月) 03:09:00 ID:???]
>>125
ハッシュレフとアクセサが分かって無かったんだろうな。

> my $query = new CGI->new();

CGIがDamianの言ってることガン無視で組んでたからたまたま動いてると。


133 名前:nobodyさん [2009/03/02(月) 22:03:42 ID:bC9LrltQ BE:781119656-2BP(1028)]
my $input ="//commentA \n   var1 = 3 ; //commentB \n   varx = 8 ;";
my $src_regex = qr/((\n\s+)var1\s=[^;]+;.*)\n/;
my $dest = "\$1\$2varp = 5;\n";

$input =~ s/$src_regex/$dest/sg;

$1,$2を変数の中に入れると置換されないのは 仕様?

134 名前:nobodyさん mailto:sage [2009/03/02(月) 22:12:50 ID:???]
仕様。

135 名前:nobodyさん mailto:sage [2009/03/02(月) 22:46:57 ID:???]
>>133
今ひとつ掴めないが。

my $dest = q{"$1$2varp = 5;\n"};
$input =~ s/$src_regex/$dest/sgee;

136 名前:nobodyさん [2009/03/02(月) 22:50:15 ID:bC9LrltQ BE:911305875-2BP(1028)]
>>135
Evalするとエラ〜になりまつ

Scalar found where operator expected at (eval 1) line 1, near "$1$2"
(Missing operator before $2?)
Bareword found where operator expected at (eval 1) line 1, near "$2varp"
(Missing operator before varp?)
Use of uninitialized value in substitution iterator at ./s.pl line 15.


137 名前:nobodyさん [2009/03/02(月) 22:52:49 ID:bC9LrltQ BE:650933055-2BP(1028)]
>>135
早とちりしてた。 動きました。 なんで?

138 名前:nobodyさん [2009/03/02(月) 23:05:28 ID:jCf+CacP]
1: 自分はこういう事がしたい。
ぜろちゃんねるのスクリプトを使用した掲示板を設置し、
test070124 ttp://0ch.mine.nu/public/scripts/
そこにアップローダを備えて誰でも過去ログをアップすることが出来る板を
設置しようと考えました。ただアップするだけではなくインデックスも更新できる
ような仕様を目指しました。

2: それでこんな風にやってみたが・・・
それで無事に掲示板とphpのロダも設置し、問題なく動作。
インデックスを更新するには管理者がログインして更新しなければならず、
アップした人が外部からインデックスを更新できるように
remake.cgi ttp://a1or4qsl6.hp.infoseek.co.jp/okiba/index.html
というものを使いました。

3: こんなエラーが出て上手く行かなかった。
しかし、ローカルではすんなりとロダで上げる、インデックスの更新も
問題なかったのですが、鯖でやるとレス番がズレるという問題が発生しました。
パーミッションの設定もいろいろイジったのですがどうしてもレス番
がズレ、繰り返すうちに板全体がおかしくなるのです(あるはずのないスレが発生など)。

なにが問題なのかよいアドバイスをよろしくお願いします。


139 名前:nobodyさん mailto:sage [2009/03/02(月) 23:48:16 ID:???]
>>136
/sgee; のeは一個でeval()一個と同等。
$destの中身をevalを使って評価してる。

my $dest = q{"$1$2varp = 5;\n"};
$input =~ s/$src_regex/eval $dest/sge;

140 名前:nobodyさん mailto:sage [2009/03/03(火) 00:09:40 ID:???]
同等とは聞くけど、これはだめなんだよな?
$foo = q(huh?);
$foo =~ s/huh\?/die(q(huh))/e;
if ($@) {print q(died)}



141 名前:nobodyさん mailto:sage [2009/03/03(火) 00:10:50 ID:???]
そもそも () ってネスト出来たっけ?

142 名前:nobodyさん mailto:sage [2009/03/03(火) 00:53:19 ID:???]
>>140
期待してるのはこう?

my $foo = q(huh?);
$foo =~ s/huh\?/"die(q(huh))"/ee;
if ($@){ print q(died) }

eval()って書いたのは、eval EXPRを示したかっただけだから突っ込まないでくれ。
eval BLOCKとは異なることを言いたかった。

143 名前:nobodyさん mailto:sage [2009/03/03(火) 01:26:39 ID:???]
>>142
そうそう。
2個目のeからeval EXPRで外側を囲まれる感じとでも理解しておけばいいのかな?
どうもありがとう。

144 名前:nobodyさん [2009/03/03(火) 13:34:16 ID:YRhfBR/o]
OSXでperl開発をしているんですが、ある日突然@INCが変わってしまい、それまで動いていた
プログラムが動かなくなってしまいました。思い当たる節としてはport でgnuplotを入れた際に
偉い時間がかかったのでそのときに何か変更されたのではと思っています。
perl -le 'print for @INC'
/sw/lib/perl5
/sw/lib/perl5/darwin
/opt/local/lib/perl5/5.8.8/darwin-2level
/opt/local/lib/perl5/5.8.8
/opt/local/lib/perl5/site_perl/5.8.8/darwin-2level
/opt/local/lib/perl5/site_perl/5.8.8
/opt/local/lib/perl5/site_perl
/opt/local/lib/perl5/vendor_perl/5.8.8/darwin-2level
/opt/local/lib/perl5/vendor_perl/5.8.8
/opt/local/lib/perl5/vendor_perl
.
現在このようになっており、/Library/Perl/5.8.8などがサーチパスから外されています。
@INCを定義しているファイルってどこにあるんでしょうか。
もう、困るなあ。。

145 名前:nobodyさん mailto:sage [2009/03/03(火) 13:39:15 ID:???]
吸いません。自己解決しました。
2chに書き込むと解決する法則が発動したな。
she-bangで#!/usr/bin/env perlとしていたため、/usr/bin/perlではなく/opt/local/bin/perlが使われていました。
ナンタルチーヤ!
勝手にパールいれんな。

146 名前:nobodyさん mailto:sage [2009/03/03(火) 13:47:20 ID:???]
#!/usr/bin/env perl
こういう書き方がそもそも悪い

てゆか、ソースコードは1行独立で書こうよ。
文中に含まれると可読性悪い。

147 名前:nobodyさん mailto:sage [2009/03/03(火) 19:13:25 ID:???]
質問です。

静的なHTMLファイルのフォームから、cgiを叩いて、次のページを表示させるという、
至って普通なことをしているのですが、IEだと正しくHTMLが解釈されてページが表示されるものの、
operaとFirefoxでは、plaintextとして、ソースが表示されてしまいます。

cgiにお約束の一文も入れてから、HTMLを吐いています。
print "Content-type: text/html\n\n";

ヘッダの最初はこんな感じです。文字コードも間違いなくeucで出力されていることも確認しました。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=euc-jp">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta http-equiv="cache-control" content="no-cache">

</head>
<body>…</body>
</html>

operaとFirefoxでソースを保存しようとすると、なぜか表示されているtextではなく、cgiを叩いて失敗した
画面のソースが保存されてしまうため、仕方なく、表示されるtextをそのままコピペで.htmlで保存して、
operaとFirefoxで開いてみると、HTMLは正しく解釈されて表示されています。

なにかヒントになりそうなことがあれば、ご教示願います。

148 名前:nobodyさん mailto:sage [2009/03/03(火) 19:25:29 ID:???]
きっとなにか勘違いしてるだけだよ落ち着いて

149 名前:147 mailto:sage [2009/03/03(火) 19:29:13 ID:???]
自己解決しますた。
以前に書いたソースなので、自分でもよく覚えていないのですがw

print "Content-type: text/html\n\n";
の前に、printで出力している部分がありました…(デバッグ用だったのかなあ…)

150 名前:nobodyさん mailto:sage [2009/03/03(火) 19:30:06 ID:???]
>>417
俺ならまずtelnet(または同等のツール)でcgiを叩く



151 名前:nobodyさん [2009/03/03(火) 19:32:23 ID:x3eHsIxd]
ifの使い方が良くわかりません、点数でランク分けする処理を2つ行いたいのですが以下の2通りの書き方のうちどちらが正しいのでしょう?



if ($tensuua < 10) {$ranka = 3;} elsif (tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
if ($tensuub < 10) {$rankb = 3;} elsif (tensuub < 20) {$rankb = 2;} else {$rankb = 1;}

------------------------------------------------------------------------------------------


if ($tensuua < 10) {$ranka = 3;} elsif (tensuua < 20) {$ranka = 2;} elsif (tensuua < 30) {$ranka = 1;}
elsif ($tensuub < 10) {$rankb = 3;} elsif (tensuub < 20) {$rankb = 2;} else {$rankb = 1;}


152 名前:147 mailto:sage [2009/03/03(火) 19:33:00 ID:???]
>>150
それで気がつきますよね。
何故か、print "Content-type: text/html\n\n";の前に、出力している部分は
opera、FFで確認できなかったので、telnetで確認すべきでした。

というか、これは500エラーにならないんだろうか…

153 名前:nobodyさん mailto:sage [2009/03/03(火) 22:44:52 ID:???]
>>151
$が抜けてる所があるから、どちらも間違い。
直したとしても、要求仕様が分からないから判断できない。

154 名前:nobodyさん mailto:sage [2009/03/04(水) 01:10:40 ID:???]
あのーAcmeってネタモジュールですか?

155 名前:訂正 [2009/03/04(水) 06:49:37 ID:+iuw4LCF]
>>153
点数でランク分けする処理を2つ行いたいのですが($tensuuaと$tensuubの数値によってそれぞれに対応する$rankaと$rankbの中身を書き換える)以下の2通りの書き方のうち
どちらが正しいのでしょう? 以前にif→elsifとせずif→ifを並べたらバグって変数内の数値が出鱈目になったことがありました、そのときは2つ以上の条件を同時に満たした上、
書き換えられる変数が同じ名前でした。今回、上のソースだとif→ifと同じように間違っているのか、変数が違うから問題ないのかがわかりません。

if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
if ($tensuub < 10) {$rankb = 3;} elsif ($tensuub < 20) {$rankb = 2;} else {$rankb = 1;}

------------------------------------------------------------------------------------------
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua < 20) {$ranka = 2;} elsif ($tensuua < 30) {$ranka = 1;}
elsif ($tensuub < 10) {$rankb = 3;} elsif ($tensuub < 20) {$rankb = 2;} else {$rankb = 1;}

156 名前:nobodyさん mailto:sage [2009/03/04(水) 07:13:20 ID:???]
if もし○○ならば
elsif ○○ではなくて××ならば
elsif さらに××でもなくて△△ならば

というだけの話なのだが

157 名前:nobodyさん [2009/03/04(水) 07:46:56 ID:+iuw4LCF]
>>156
if ( $a > 10 ){なんか処理}
if ( $a > 20 ){なんか処理}
if ( $a > 30 ){なんか処理}
コレだと$aに30以上が入力されるとバグります

10 if a>10 then なんか処理
20 if a>10 then なんか処理
30 if a>10 then なんか処理
ベーシックだと順に処理されて行番号30の処理が優先されたと思います。

158 名前:nobodyさん mailto:sage [2009/03/04(水) 08:01:49 ID:???]
>>157
30以上が入力されるとバグりますって、例えば$aが40だったら$a > 10は満たされるからそこが実行されるに決まってるだろうがよ。


159 名前:nobodyさん mailto:sage [2009/03/04(水) 08:04:26 ID:???]
そこがっていうかそこもって言わないと分からないのか。

if ( $a > 10 ){なんか処理}
if ( $a > 20 ){なんか処理}
if ( $a > 30 ){なんか処理}

お前さんの例で言うなら、例えば$aが40だったら「なんか処理」は三つとも実行される。

160 名前:nobodyさん mailto:sage [2009/03/04(水) 10:14:27 ID:???]
if(10未満){処理}
elsif(10以上20未満){処理}
else{処理}




161 名前:nobodyさん mailto:sage [2009/03/04(水) 10:20:20 ID:???]
なんで小さい順に評価しようとするの?
大きい順に評価して if を並べりゃいいじゃない

162 名前:nobodyさん mailto:sage [2009/03/04(水) 10:26:43 ID:???]
(´・ω・`)?

163 名前:nobodyさん [2009/03/04(水) 12:01:34 ID:+iuw4LCF]
2つのifが同時に真になる場合バグが生じる場合もあるようなので、この現象を回避するにプログラムの修正を行いたいので2つのソースの書き方のうちどちらが正しいか教えて欲しいのです。
現在はすべてifでかかれているので正常に動作しません。
もし上でもよければ修正が容易なのですが下のようにしなければならないのならifが100個ぐらいあるのでフローチャートでも書かないとむりかなと思ってます。

ソースその1
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
if ($tensuub < 10) {$rankb = 3;} elsif ($tensuub < 20) {$rankb = 2;} else {$rankb = 1;}

------------------------------------------------------------------------------------------
ソースその2
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua < 20) {$ranka = 2;} elsif ($tensuua < 30) {$ranka = 1;}
elsif ($tensuub < 10) {$rankb = 3;} elsif ($tensuub < 20) {$rankb = 2;} else {$rankb = 1;}


164 名前:nobodyさん mailto:sage [2009/03/04(水) 12:04:07 ID:???]
条件と処理を一行にいくつも書くと読みづらくなるから改行をもっと工夫せい

165 名前:nobodyさん mailto:sage [2009/03/04(水) 12:20:59 ID:???]
>>163
レス読んでるの?
あれ読んで分からないの?

166 名前:nobodyさん mailto:sage [2009/03/04(水) 12:58:45 ID:???]
>>165
何番のレスですか?

167 名前:nobodyさん mailto:sage [2009/03/04(水) 13:18:26 ID:???]
とりあえずさ
何が要求仕様なのかもう一度整理しろ

んで、仮にこういうデータが来たらどう処理されるなってのを考えろ

168 名前:nobodyさん mailto:sage [2009/03/04(水) 14:37:04 ID:???]
>>167 了解
ソースその1で動作環境はウェブサーバーで仮に$tensuua=20と$tensuub=20が同時に入力された場合 if→ifの場合のエラーと同じ不具合がおこりえるのかどうか
教えてください。

ソースその1
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua > 10 and $tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
if ($tensuub < 10) {$rankb = 3;} elsif ($tensuub > 10 and $tensuub < 20) {$rankb = 2;} else {$rankb = 1;}

------------------------------------------------------------------------------------------
ソースその2
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua > 10 and $tensuua < 20) {$ranka = 2;} elsif ($tensuua < 30) {$ranka = 1;}
elsif ($tensuub < 10) {$rankb = 3;} elsif ($tensuub > 10 and $tensuub < 20) {$rankb = 2;} else {$rankb = 1;}

169 名前:nobodyさん mailto:sage [2009/03/04(水) 15:04:49 ID:???]
質問に偽装したいやがらせ

170 名前:nobodyさん mailto:sage [2009/03/04(水) 15:47:05 ID:???]
>>168
my ($tensuua, $tensuub) = (15, 15);
my ($ranka, $rankb);
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
if ($tensuub < 10) {$rankb = 3;} elsif ($tensuub < 20) {$rankb = 2;} else {$rankb = 1;}
print "a:$ranka b:$rankb\n";
これを実行すると、
a:2 b:2
こうなるわけだが、何か問題があるのか?



171 名前:nobodyさん mailto:sage [2009/03/04(水) 16:28:04 ID:???]
そもそもてめぇの言う不具合を示せよ
俺らはエスパーじゃねーんだよクソッタレ

172 名前:nobodyさん mailto:sage [2009/03/04(水) 16:43:38 ID:???]
use strict;

my $rankA = -1;
my $rankB = -1;

my $pointA = 5;
my $pointB = 56;

my @pointlist = qw/30 20 10/;
my @ranklist = qw/1 2 3/;


for(my $i = 0; $i < $#pointlist + 1; $i++){
  $rankA = $ranklist[$i] if $pointA < $pointlist[$i];
  $rankB = $ranklist[$i] if $pointB < $pointlist[$i];
}


print "point = $pointA / rank = $rankA\n";
print "point = $pointB / rank = $rankB\n";



173 名前:nobodyさん mailto:sage [2009/03/04(水) 16:45:26 ID:???]
書き忘れたことあった。

use strict;

my $rankA = -1;
my $rankB = -1;

my @pointlist = qw/30 20 10/;
my @ranklist = qw/1 2 3/;

# 上記までは変更しない
# 下の pointX を変更して動作を確かめてください

my $pointA = 5;
my $pointB = 56;

for(my $i = 0; $i < $#pointlist + 1; $i++){
  $rankA = $ranklist[$i] if $pointA < $pointlist[$i];
  $rankB = $ranklist[$i] if $pointB < $pointlist[$i];
}

print "point = $pointA / rank = $rankA\n";
print "point = $pointB / rank = $rankB\n";



174 名前:nobodyさん mailto:sage [2009/03/04(水) 16:47:31 ID:???]
for my $i (@pointlist){
  $rankA = $ranklist[$i] if $pointA < $pointlist[$i];
  $rankB = $ranklist[$i] if $pointB < $pointlist[$i];
}

の方がすっきりしない?

175 名前:nobodyさん [2009/03/04(水) 17:20:03 ID:bLGM+Am6]
$_SERVER["REQUEST_URI"] の質問

ローカルホストで簡易掲示板を作りあるページで $_SERVER["REQUEST_URI"] とやると
127.0.0.1/hoge/bbs/

鯖にあげてローカルホストでやった場所と同じところで $_SERVER["REQUEST_URI"] とやると
127.0.0.1/hoge/bbs/php/ となるのはなぜ?

問題はないんだけど後学のために教えてください。
phpは つい1週間前に入れたばかりで httpd でのテストです。

176 名前:nobodyさん mailto:sage [2009/03/04(水) 17:49:56 ID:???]
>>174
あっ、そうゆう書き方出来るんですね。


177 名前:nobodyさん mailto:sage [2009/03/04(水) 19:02:40 ID:???]
ごめん174は嘘

178 名前:nobodyさん mailto:sage [2009/03/04(水) 19:03:16 ID:???]
for my $i (0 .. $#pointlist){
  $rankA = $ranklist[$i] if $pointA < $pointlist[$i];
  $rankB = $ranklist[$i] if $pointB < $pointlist[$i];
}

179 名前:nobodyさん [2009/03/04(水) 19:08:07 ID:+iuw4LCF]
if ifの謎の不具合は本にも載ってないし原因もわからず・・・
>>51 でも書いたように
if () {}
if () {}
if () {}

if () {}
elsif () {}
elsif () {}
にすると直る。
バグの症状は変数の数値が壊れる。この不具合が起こったプログラムは修正済みで不具合時のソースは見当たらず。
不具合時の環境はlolipopレンタルサーバーでブラウザーから呼び出したとき。
現在は直した部分以外の変数が壊れる現象があり、プログラムには100個程度のifが使われていることから、前回と
同じ理屈で不具合が起きているのではないかと推測。
if () {}
elsif () {}
else {}
を2個組み合わせてもifまたはelsifの2個以上が同時に真になったときに同じ現象が起きたのではないのかと推測
その推測を元に質問いたしましたが、文書力が無いので伝わらず。これはもうあきらめるしかないっぽい、外注に
出します、色々とありがとうございました。
この質問とレスの番号の全て→ >>45-66 >>151 >>153 >>155-174 >>176-178


180 名前:nobodyさん mailto:sage [2009/03/04(水) 19:23:02 ID:???]
文章力とかじゃねぇよ
お前プログラム勉強する気あるのか?
ifとelsifの違いは>>156に書いてあるだろ

if(){}
elsif(){}
else{}

実行されるのはどれか1つだ


if(){}
if(){}
if(){}

実行されるのは0-3個のどれか





181 名前:nobodyさん mailto:sage [2009/03/04(水) 19:25:37 ID:???]
ふぐあいかっこわらい
こんだけ世界中で使われてるものの不具合がお前ごときに見つけられるわけがねーだろ

182 名前:nobodyさん mailto:sage [2009/03/04(水) 19:32:56 ID:???]
共用鯖で実験ですか…


氏ねよ



183 名前:nobodyさん mailto:sage [2009/03/04(水) 19:34:08 ID:???]
>>179

>>58にも書いてあるし
お前はそれに>>62でありがとうって返してる



184 名前:nobodyさん mailto:sage [2009/03/04(水) 19:41:31 ID:???]
つか、そんなもん100個くらい並べたくらいで壊れねーよ。

185 名前:nobodyさん mailto:sage [2009/03/04(水) 19:55:41 ID:???]
では1000個並べてみます><

186 名前:nobodyさん mailto:sage [2009/03/04(水) 20:00:39 ID:???]
すごいのが来ていたんだな。。。
まー「外注に依頼」という正解にたどり着いたのはいいことだ。

187 名前:nobodyさん mailto:sage [2009/03/04(水) 20:13:55 ID:???]
これは受託先がボッタくれそうでいいなあ・・

共用鯖で実験ならいつもやってますw
無限ループやらかして、何度自分でプロセス切った事やらw

188 名前:nobodyさん mailto:sage [2009/03/04(水) 22:04:05 ID:???]
共有鯖って、数十秒でキルされるんじゃないの?
そういう設定が普通だと思ってた

189 名前:nobodyさん [2009/03/04(水) 23:45:41 ID:4H3lqSU+]
ある文字列が対象の含まれていないときだけ実行させるにはどうすればよいでしょうか?
含まれていたときはスルーし、最後に実行させたいのですが。

こんな感じのときです

対象 hogehoge
検索 geh
含まれていたら print "NO";
含まれていなかったら他の条件へ。

190 名前:nobodyさん mailto:sage [2009/03/04(水) 23:53:18 ID:???]
>含まれていたときはスルーし、最後に実行させたいのですが。
ここがよくわからない

if ( $str =~ /geh/ ){
 print "NO";
}else{
 #他の条件
}




191 名前:nobodyさん mailto:sage [2009/03/04(水) 23:53:35 ID:???]
my $str = 'hogehoge';
my $search = 'geh';
if($str =~ /$search/){
print "NO\n";
}else{
....
}


192 名前:nobodyさん mailto:sage [2009/03/04(水) 23:53:59 ID:???]
含まれていたら終了






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<66KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef