トップページphp
1001コメント311KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/02/16(月) 11:42:29ID:gvPTpodw
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1218030872/
0160nobodyさん2009/03/04(水) 10:14:27ID:???
if(10未満){処理}
elsif(10以上20未満){処理}
else{処理}
0161nobodyさん2009/03/04(水) 10:20:20ID:???
なんで小さい順に評価しようとするの?
大きい順に評価して if を並べりゃいいじゃない
0162nobodyさん2009/03/04(水) 10:26:43ID:???
(´・ω・`)?
0163nobodyさん2009/03/04(水) 12:01:34ID:+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;}
0164nobodyさん2009/03/04(水) 12:04:07ID:???
条件と処理を一行にいくつも書くと読みづらくなるから改行をもっと工夫せい
0165nobodyさん2009/03/04(水) 12:20:59ID:???
>>163
レス読んでるの?
あれ読んで分からないの?
0166nobodyさん2009/03/04(水) 12:58:45ID:???
>>165
何番のレスですか?
0167nobodyさん2009/03/04(水) 13:18:26ID:???
とりあえずさ
何が要求仕様なのかもう一度整理しろ

んで、仮にこういうデータが来たらどう処理されるなってのを考えろ
0168nobodyさん2009/03/04(水) 14:37:04ID:???
>>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;}
0169nobodyさん2009/03/04(水) 15:04:49ID:???
質問に偽装したいやがらせ
0170nobodyさん2009/03/04(水) 15:47:05ID:???
>>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
こうなるわけだが、何か問題があるのか?
0171nobodyさん2009/03/04(水) 16:28:04ID:???
そもそもてめぇの言う不具合を示せよ
俺らはエスパーじゃねーんだよクソッタレ
0172nobodyさん2009/03/04(水) 16:43:38ID:???
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";

0173nobodyさん2009/03/04(水) 16:45:26ID:???
書き忘れたことあった。

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";

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

の方がすっきりしない?
0175nobodyさん2009/03/04(水) 17:20:03ID: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 でのテストです。
0176nobodyさん2009/03/04(水) 17:49:56ID:???
>>174
あっ、そうゆう書き方出来るんですね。
0177nobodyさん2009/03/04(水) 19:02:40ID:???
ごめん174は嘘
0178nobodyさん2009/03/04(水) 19:03:16ID:???
for my $i (0 .. $#pointlist){
  $rankA = $ranklist[$i] if $pointA < $pointlist[$i];
  $rankB = $ranklist[$i] if $pointB < $pointlist[$i];
}
0179nobodyさん2009/03/04(水) 19:08:07ID:+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
0180nobodyさん2009/03/04(水) 19:23:02ID:???
文章力とかじゃねぇよ
お前プログラム勉強する気あるのか?
ifとelsifの違いは>>156に書いてあるだろ

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

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


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

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

0181nobodyさん2009/03/04(水) 19:25:37ID:???
ふぐあいかっこわらい
こんだけ世界中で使われてるものの不具合がお前ごときに見つけられるわけがねーだろ
0182nobodyさん2009/03/04(水) 19:32:56ID:???
共用鯖で実験ですか…


氏ねよ

0183nobodyさん2009/03/04(水) 19:34:08ID:???
>>179

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

0184nobodyさん2009/03/04(水) 19:41:31ID:???
つか、そんなもん100個くらい並べたくらいで壊れねーよ。
0185nobodyさん2009/03/04(水) 19:55:41ID:???
では1000個並べてみます><
0186nobodyさん2009/03/04(水) 20:00:39ID:???
すごいのが来ていたんだな。。。
まー「外注に依頼」という正解にたどり着いたのはいいことだ。
0187nobodyさん2009/03/04(水) 20:13:55ID:???
これは受託先がボッタくれそうでいいなあ・・

共用鯖で実験ならいつもやってますw
無限ループやらかして、何度自分でプロセス切った事やらw
0188nobodyさん2009/03/04(水) 22:04:05ID:???
共有鯖って、数十秒でキルされるんじゃないの?
そういう設定が普通だと思ってた
0189nobodyさん2009/03/04(水) 23:45:41ID:4H3lqSU+
ある文字列が対象の含まれていないときだけ実行させるにはどうすればよいでしょうか?
含まれていたときはスルーし、最後に実行させたいのですが。

こんな感じのときです

対象 hogehoge
検索 geh
含まれていたら print "NO";
含まれていなかったら他の条件へ。
0190nobodyさん2009/03/04(水) 23:53:18ID:???
>含まれていたときはスルーし、最後に実行させたいのですが。
ここがよくわからない

if ( $str =~ /geh/ ){
 print "NO";
}else{
 #他の条件
}
0191nobodyさん2009/03/04(水) 23:53:35ID:???
my $str = 'hogehoge';
my $search = 'geh';
if($str =~ /$search/){
print "NO\n";
}else{
....
}
0192nobodyさん2009/03/04(水) 23:53:59ID:???
含まれていたら終了
0193nobodyさん2009/03/05(木) 00:02:54ID:PCYMuwfz
>>190
>>191

>>191で行ってみます。それをしたかったんです。
0194nobodyさん2009/03/05(木) 00:09:14ID:PCYMuwfz
あれ?違いますね。

含まれていないときに終了させ、含まれている時にはスルーすることをしたいのですが。

$str = 'hogehoge';

if ( length($str) ne '8' ) {
print "no";
}
elsif {
geh が含まれていないとき
print "no";
}
elsif {
他の条件1
print "no";
}
elsif {
他の条件2
print "no";
}

else {
実行
print "oK";
}

こういうことです。
0195nobodyさん2009/03/05(木) 00:16:13ID:???
含まれていたら print "NO"って書いてたやん

処理が逆なら真偽ひっくり返したらいいだけ
0196nobodyさん2009/03/05(木) 00:26:06ID:PCYMuwfz
>>195
>含まれていたら print "NO"って書いてたやん

間違えていました。正しくは含まれていないときに実行したいのです。

真偽をひっくり返すとは?
0197nobodyさん2009/03/05(木) 00:28:58ID:???
if(!条件)もしくはunless(条件)
0198nobodyさん2009/03/05(木) 00:41:15ID:PCYMuwfz
こういうのは出来ないんですよね?

$str = hogehoge;
if ( $str != ~/geh/) {
print "NO";
}
0199nobodyさん2009/03/05(木) 00:45:44ID:???
>>198
$str = hogehoge;
if ( $str !~ /geh/) {
print "NO";
}
0200nobodyさん2009/03/05(木) 00:49:56ID:???
if($str !~ /geh/){
  〜処理〜
}


!~ は 一致したときに偽となります。
なので、!~ で一致しなければ真となります。
0201nobodyさん2009/03/05(木) 01:01:50ID:PCYMuwfz
>>199>>200
出来ました。
ありがとうございました。
0202nobodyさん2009/03/05(木) 02:37:44ID:???
2chでもそうですけど書き込み確認画面ってありますよね?
あれってどうやっているんですか?2つcgiを用意するのか
もしくは1つでやっているんでしょうか?
0203nobodyさん2009/03/05(木) 02:41:58ID:???
1つでも2つでもどうとでもできる
0204nobodyさん2009/03/05(木) 06:51:21ID:???
簡易掲示板チャットをやっているんですがユーザーへの禁止語句にエラーが出てしまうのです。
原因を調べてみた結果「ー」がその原因だったことが判明しました。
ソースはこんな感じなんですがどうすればエラーが出ないようになるでしょうか?

if( $NG =~ m/$subject/) {
print '禁止ワードです';
}

文字コードはShift-JISでj-code.plなどは使用していません。よろしくお願いします。
0205nobodyさん2009/03/05(木) 08:28:19ID:???
/\Q$subject/でいけるっしょ
0206nobodyさん2009/03/05(木) 08:36:47ID:???
>>205
そんなやり方があるんですね。ありがとうございます。
軽くググってましたが \Q***\E を使うといいらしいですが\Eで閉じる必要はないのでしょうか?
0207nobodyさん2009/03/05(木) 08:39:30ID:???
閉じてもいいよ
クウォートメタの効果を途中で止めたいなら\Eで閉じなきゃいけないけどこの場合はないから閉じなくてもいい
0208nobodyさん2009/03/05(木) 08:41:08ID:???
>>207
なるほど〜。
>>204の例だと if{ } の間だけ効果を発揮するということでしょうか?
0209nobodyさん2009/03/05(木) 08:58:56ID:???
いやいや
/\Q$subject[a-z]\d/みたいにクウォートメタしたいものの後に正規表現使う場合には
/\Q$subject\E[a-z]\d/こう書かいて閉じておかないと、パターンマッチではなく
$subjectの内容直後に"[a-z]\d"という文字があるときしかマッチしなくなるということ
02101792009/03/05(木) 16:49:09ID:9GnY8N9B
外注に出したら100万と見積もられましたが100万はきついのでやはり自分で勉強したいのですが
IFの使い方に特化した本ありませんか?
0211nobodyさん2009/03/05(木) 16:56:24ID:???
そんな本あるかよ
0212nobodyさん2009/03/05(木) 16:57:13ID:???
>>210
君はプログラムに手出ししない方がいいと思う。
0213nobodyさん2009/03/05(木) 16:59:45ID:???
http://books.livedoor.com/item/659088
どうぞ
0214nobodyさん2009/03/05(木) 17:05:25ID:???
ていうか近視眼的な解決策しか求めないからいけないんだよね。
0215nobodyさん2009/03/05(木) 17:06:52ID:???
どうせならこのぐらいのボケかたがいい
http://www.amazon.co.jp/gp/product/images/B001QWUZ9W/ref=dp_image_0?ie=UTF8&n=465392&s=books
0216nobodyさん2009/03/05(木) 17:08:19ID:???
>>210
キミは
英語を勉強しようとして、「if」 しか解説してない本を探せると思うか?
日本語を勉強しようとして 「あ行」 しか解説してない本を探せると思うか?
0217nobodyさん2009/03/05(木) 17:09:07ID:???
http://ec2.images-amazon.com/images/I/61%2B5RCVUK-L._SS500_.jpg
こういったリンクの方がうれしい
0218nobodyさん2009/03/05(木) 17:26:32ID:???
これってレディスコミック?中身が見たいw
0219nobodyさん2009/03/05(木) 17:50:16ID:???
IFに特化した本ワロタwwwwww
0220nobodyさん2009/03/05(木) 17:58:01ID:???
必要な情報はもう全部ここで答えられてるから
それ見て勉強するか100万払うこったな

面倒くさいからもう来んな
0221nobodyさん2009/03/05(木) 19:52:11ID:???
週間 ifの全て

創刊号は演算子優先順位一覧表がついて、590円!
0222nobodyさん2009/03/05(木) 19:52:52ID:???
さすがにネタだろ
ネタじゃないなら、もうソースも恥部もさらけ出せよ
0223nobodyさん2009/03/05(木) 20:40:48ID:???
多分、リアルで高校生とか中学生とかなんだろう。Perlってホントに初心者向けの本ってないからなあ。PHPと違って。
0224nobodyさん2009/03/05(木) 20:43:15ID:???
古い内容でよければ、ネットにいくらでも解説あるよな
0225nobodyさん2009/03/05(木) 20:53:49ID:???
ifって古いとかどうこうじゃないけどな
0226nobodyさん2009/03/05(木) 21:32:14ID:???
>>221
たけーよw
0227nobodyさん2009/03/06(金) 00:19:12ID:???
>>179
if文を100個も並べるようなコードは、おそらくif文などほとんど使わずに書けると思うよ。
コード以前に、仕様定義を日本語で整理することに頭と時間使った方が結局近道。
どういう処理をさせたいか日本語で表せない(他人に伝えられない)のにコーディングできるはずがない。

例えば
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua > 10 and $tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
のコードは、$tensuua == 10 のとき、意図しない結果となると思う。
条件式は、混乱するんだったら、表を書いてでも整理すべし。
0228nobodyさん2009/03/06(金) 00:29:04ID:???
100万ww俺今から外注始めるwwwww
0229nobodyさん2009/03/06(金) 01:14:19ID:???
俺なら70万でやってやるよw
0230nobodyさん2009/03/06(金) 01:57:58ID:???
5万
NCNRでお願いします。
0231nobodyさん2009/03/06(金) 05:12:13ID:???
ちょうど俺液晶買い換えたいと思ってたんだよね
3万でいいよ
0232nobodyさん2009/03/06(金) 13:15:46ID:???
今月給料が少なかったから手付50万円で月々の保守10万円で年間契約で受け持つよ
制作は規模にもよるけど3ヶ月以内を約束で。
0233nobodyさん2009/03/06(金) 14:24:55ID:???
IFって何かと思った。
なんかのフレームワークかな?とか。

……俺だけ?
0234nobodyさん2009/03/06(金) 14:28:56ID:???
>>233
君を入れて3人だけだね。
0235nobodyさん2009/03/06(金) 18:09:13ID:???
俺はインターフェイスの設計かとオモタ
0236nobodyさん2009/03/06(金) 22:21:27ID:???
【月刊ifの全て】
創刊号 ifブロック特集
第2号 elseブロック特集
第3号 elsifブロック特集
第4号 unlessブロック特集
第5号 whileブロック特集
第6号 untileブロック特集
第7号 forブロック特集
第8号 if修飾詞特集
第9号 unless修飾詞特集
第10号 while修飾詞特集
第11号 until修飾詞特集
第12号 for修飾詞特集
第13号 if演算子(?:)特集
第14号 範囲演算子(..)特集
第15号 範囲演算子(...)特集
第16号 論理積演算子(&&)特集
第17号 論理和演算子(||)特集
第18号 論理積演算子(and)特集
第19号 論理和演算子(or)特集
第20号 排他的論理和演算子(xor)特集
第21号 grep関数特集
第22号 evalブロック特集
第23号 Switchモジュール特集
最終号 はじめてのPerlプログラミング
0237nobodyさん2009/03/06(金) 23:18:44ID:???
創刊号は
if の歴史
からいこうぜ
0238nobodyさん2009/03/06(金) 23:27:43ID:???
付録は何ですか><
0239nobodyさん2009/03/06(金) 23:36:05ID:???
2号からはおいくらですか?
0240nobodyさん2009/03/07(土) 00:03:23ID:???
つか2年後に初めて入り口とかw
まともにやってたら中級の入り口に立ってるはずなのにw
0241nobodyさん2009/03/07(土) 02:52:57ID:???
付録「ifとiff」

0242nobodyさん2009/03/07(土) 02:58:51ID:???
>240
むしろツッコミどころは第23号じゃね?
0243nobodyさん2009/03/07(土) 14:31:06ID:???
お前らの大好きな perl-users.jp で書けばいいじゃん。
0244nobodyさん2009/03/07(土) 14:53:41ID:???
>>243
なにそれ?
0245nobodyさん2009/03/07(土) 15:05:38ID:???
ぐぐれ
0246nobodyさん2009/03/07(土) 18:31:27ID:???
Switchモジュール特集は今すぐ始めてくれて構わないんだぞ?
0247nobodyさん2009/03/07(土) 22:21:11ID:???
>>243
あそこは頑張ってて好きだぜ。perl学ぶならここ見ろ、ってのが出来るのはいいことじゃね
0248nobodyさん2009/03/08(日) 01:43:51ID:???
import関数は何をするものですか?
0249nobodyさん2009/03/08(日) 11:38:53ID:???
Switchはクックブックに少し載ってるよね
0250nobodyさん2009/03/08(日) 13:14:22ID:???
>>247
ああいうのは、5年後10年後に負の遺産になるのが常だからなあ。
0251nobodyさん2009/03/08(日) 21:55:46ID:???
口で言うだけより行動する方がかっこいいし
あの辺のクラスタは10年経ってもずっとやってそう
0252nobodyさん2009/03/08(日) 22:16:42ID:???
5.10のgiven,when,defaultって手もあるな
0253nobodyさん2009/03/09(月) 00:06:15ID:???
>>251
何というか、君は腰巾着だな。ひとり立ちせえよ。
0254nobodyさん2009/03/09(月) 00:38:08ID:???
>>253
煽りたいんですね、わかります
0255nobodyさん2009/03/09(月) 01:19:00ID:???

$hogeがaとb以外のときに実行するには

if ($hoge ne 'a' or $hoge ne 'b' ){
 print "oik";
}

で合ってますか?
0256nobodyさん2009/03/09(月) 01:26:29ID:???
>255
その場合だと、「a以外」または「b以外」のときに真となるので、常に成立することになる。
「aまたはb」という条件式を作り、それをさらに否定するといい。
0257nobodyさん2009/03/09(月) 01:27:09ID:???
andにするだけでいいだろ
0258nobodyさん2009/03/09(月) 01:28:42ID:???
これ、新しいAAみたい → oik
orじゃなくて、andじゃないとマズくね?
0259nobodyさん2009/03/09(月) 01:30:03ID:???
被ってるし。床に横になってギター弾いてるみたいんだよなー → oik
0260nobodyさん2009/03/09(月) 01:40:09ID:???
olkはokの誤植です。。。

$hoge = 'c';

if ($hoge ne 'a' and $hoge ne 'b' ){
 print "ok";
}

なら ok で、このとき $hoge = 'b' ならなにもしないんですよね?
■ このスレッドは過去ログ倉庫に格納されています