Perlコーディング初心者質問スレ Part 39
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
04/11/27 11:35:03ID:DJwiGeFM【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0892nobodyさん
05/01/22 00:40:13ID:???スイスイスーダララッタ、スラスラスイスイスイ♪
0893nobodyさん
05/01/22 09:44:47ID:e2M6eLer可能ですか?
0894880
05/01/22 10:18:03ID:6KUU/iOaありがとうございます。あの後自分のpcでppmで再インストールして関係のある
ファイルを確認しました。やはり揃っていたみたいで>>883の言うとおりにlibに
もう一つ渡したらperl -c では成功しました。
しかし何故かブラウザでは500エラーです。
ローカルではブラウザでもちゃんと動作するのに何が原因かわかりませんので、
とりあえずcarpモジュールに頼ってみましたが、何故かエラー内容を出力してくれません;
サーバはactiveperl5.8.1です。
BEGIN {
use CGI::Carp qw(carpout fatalsToBrowser);
carpout(STDOUT);
if ( defined $ENV{'REMOTE_ADDR'} && $ENV{'REMOTE_ADDR'} ne '127.0.0.1' ){
use lib サーバパス;
}else{
use lib ローカルパス;
}
}
宜しくお願いします。
0895nobodyさん
05/01/22 10:40:15ID:???CGI::CarpのfatalsToBrowserが有効になる前にエラーに
なってるのがいちばんありそうだな。置き方が悪いとか
#!〜のあたりがおかしいとか。
鯖のエラーログを見るのが一番早いと思うのだが。
0896nobodyさん
05/01/22 10:48:00ID:???0897880
05/01/22 10:54:56ID:6KUU/iOa#!〜の部分は問題ないです。置き方が悪いかはわかりませんが、
既に稼動させてるCGIは5-6個ありますので、そのときと同じ手順ですので
問題ないかと思うのですが・・・
共用サーバでもエラーログってユーザごとにみられるんですか?
通常どこらへんにあるのでしょうか?
>>896
以前は@INCにpushしてた名残なのです。
0898880
05/01/22 11:14:58ID:6KUU/iOa0899nobodyさん
05/01/22 12:18:08ID:XoEEKIhN入力フォームのテーブル幅の変え方(Perlに記述する$〜〜)
を教えていただけないでしょうか?
書き込んだ後の、表示される記事のテーブル幅の変え方は分かったのですが
入力フォームがどうしても分かりませんでした。
どうぞヨロシクお願いいたします
0901nobodyさん
05/01/22 15:42:18ID:6KUU/iOa/home/public_html/lib/
というフォルダの中に自作・他作モジュールが混在していて、
libフォルダのなかにもさらに色々なフォルダがあるとします。
中身はもちろんモジュールです。
そういうときに一発で@INCにlibディレクトリから下位層全てを加えるというような
命令を出したいのですが無理でしょうか?
use lib '/home/public_html/lib/';
これでは中のフォルダまでは認識されないみたいなので(windowsでは認識する?)。
いちいち
use lib ('/home/public_html/lib/','/home/public_html/lib/CGI');
などとしないといけないみたいで面倒です。libにオプションでも付けれるかと思いましたが、
perl.docにはそのようなことは書いてありませんでしたし。
エロイ人お願いします。
0904901
05/01/22 17:04:29ID:6KUU/iOaありがとうございます。
ところで
/home/usr/site/lib
などにあるPerlの標準付属モジュールなどはどうやって@INCに追加されているのでしょうか?
モジュールがインストールされたときに自動的にPerl本体のオプションファイル
みたいなものに書き込まれているんでしょうか?
0905nobodyさん
05/01/22 17:11:46ID:???エロイ人はhttp://sakura01.bbspink.com/hneta/に集まってます。
0907901
05/01/22 19:03:50ID:6KUU/iOaそういう意味ではないのですが;
>>906
@INCの中身を見る限りでは大元だけを登録していて、CGIフォルダなどの個別は
してませんよね。
かわりに
multi treed ...なんとかっていう文字がくっついてるんですよね。
それを付けることによりUNIXがこのファイルより下位層という意味を
汲み取っていたりするんですかね?
0908nobodyさん
05/01/22 19:07:38ID:???Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/
0909nobodyさん
05/01/22 19:32:17ID:???perl.cのS_init_perllib()関数で定義してる模様。
実際の各定数(ARCLIBとか)は環境によって定義するファイルが異なっている。
/win32/config_H.vc(win32 VC用?)では
#define ARCHNAME "MSWin32-x86-multi-thread"/**/
のように定義されてる。
0910nobodyさん
05/01/22 19:48:29ID:???localtime関数で得た時間を配列に代入し、昔に同じようにして配列に代入した値から時間差を秒単位求めたいのですが、
掛け算しまくって秒になおすのを考えたのですが、ほかにもっと良い方法はありませんか?
0913nobodyさん
05/01/22 21:12:15ID:???0914nobodyさん
05/01/22 22:07:43ID:???time() を教えずに localtime() だけを教えている書籍やWWWページが
結構ありそうだな
0915nobodyさん
05/01/22 23:03:28ID:???求める関数はtimeで、これはいわゆるunix timeという
1970年1月1日0時0分0秒GMTからの秒数を返す。こっちの
方が足し算引き算もそのままできてコンピュータには
扱いやすい。
しかしそのままでは人間には扱いにくいので見慣れた
年月日時分秒に分解してくれるのがlocaltimeと
いうわけだ。こっちは本来はlocaltime(<unix time>)
という形で引数を与えて使うのだが、式を省略した
ときはtimeの値(=現在の時刻)が与えられたことに
なる。
というのをはしょってlocaltimeだけ教えられるとこう
いう悲劇を生むのだろうなぁ。
0916nobodyさん
05/01/23 00:00:38ID:???思いどおりにできました
分かりやすい解説ありがとうございました
0917nobodyさん
05/01/23 00:38:29ID:vqv+/2ig簡易的な計算のプログラムを作ってみたんですがうまく動作しません。
ちょっと見て頂き、不具合等御指摘下さい
特定の計算式で、入力(1項目だけセレクトボックスにより選択)した数値を計算するものです。
ソース
http://tool-ya.ddo.jp/2ch/trash-box/contents.jsp?file=20050123003423509.txt
URL
http://sr-cafe.chu.jp/kok/calc.html
0918nobodyさん
05/01/23 00:43:17ID:???スレ違い
自作CGIを評価するスレ
http://pc5.2ch.net/test/read.cgi/php/1049514428/
0920nobodyさん
05/01/23 18:54:50ID:5kSUsj4gどなたかお願いします。
htmlのページから
< a href="abc.cgi">A氏</a>
< a href="abc.cgi">B氏</a>
というようなリンクでabc.cgiを呼び出した時、abc.cgi側で、
A氏、B氏のどちらのリンクで呼び出されたかを判断するに
は、どうすれば良いでしょうか?A氏で呼ばれた場合と、B氏
で呼ばれた場合で処理を変えたいのですが。。
という質問に対して、
< a href="./abc.cgi?name=A">A氏</a>
< a href="./abc.cgi?name=B">B氏</a>
という回答を頂いたのですが、
abc.cgi側で、このAとBをどのように参照してよいか分かりません。
フォームの値とかは$name = $form{'name'};という感じで変数に
代入して参照できると思うのですが、上記の場合はど記述すれば
よいでしょうか?
0923nobodyさん
05/01/24 10:28:19ID:Yl+XYDvu連続送信すると携帯キャリアによっては全部受信するまでに1日近くかかってしまいます。
このスクリプトはメルマガを携帯用に分割して送信するためのものなのですが、
何とか正常に受信できるようにしたいです。
少し感覚を空ければ多少はマシになるかなと思うのですが、Perlでは
プログラムの実行中に「1分間停止」みたいな命令はだせないのでしょうか?
0924nobodyさん
05/01/24 10:41:34ID:Yl+XYDvu0925nobodyさん
05/01/24 10:46:31ID:???ただし cron か何かで起動するならいいが、
CGI で実行中に1分も sleep すると
タイムアウトで kill される恐れがあるので
気を付けてな
0926923
05/01/24 13:54:19ID:Yl+XYDvuそれは知りませんでしたm(_ _)m
とりあえず10秒ずつ休ませるだけで問題なく受信できるようになりましたので、
大丈夫だと思います。
0927nobodyさん
05/01/24 14:38:48ID:KnbcSRWW$test{"hoge.hage.2ch"}
$test{"hoge.hage.3ch"}
$test{"qwerty.foo"}
$test{"shige.hage"}
…というような、キーをドット区切りの組み合わせにした連想配列を使っているのですが
キーの頭が共通のものを一度に削除する方法はあるんでしょうか?
上の例だと$test{"hoge.hage"}、$test{"hoge.hage.2ch"}、$test{"hoge.hage.3ch"}
を削除する方法です。
0929nobodyさん
05/01/24 15:15:44ID:KnbcSRWWああ、そんな方法があったんですね!ありがとうございます。
ついでに連想配列のキーは数千単位(或いはもっと)であるのですが
速度や効率の面ではどの程度から気にすべきでしょうか?
0930nobodyさん
05/01/24 15:28:07ID:???$test{"hogegege.hage"}
$test{"hogehage.hage"}
のようなhogeを含むものを全部消してしまいますかね?
正規表現で対応すればいいのかな。
#実際のプログラムだと不特定の数字を使っているので
#1と11と111が出てきたりします
0931nobodyさん
05/01/24 16:09:11ID:???あとスライスをまとめてdeleteした方が速いかも。
delete @test{grep /^hoge\./, keys %test};
とか。
あるいは$test{'hoge'}->{'gege'}->{'hage'}の
ようにすれば delete $test{'hoge'} 一発だけど
他の処理のからみもあるので大局的にこれがいい
かどうかはわからん。
0932nobodyさん
05/01/25 00:00:05ID:???if(X()){ return; }
if($a == 0){
A; X(); B; X(); C; X(); D; X();
$a = 1;
}elsif($a == 1){
E; X(); F; X(); G; X(); H; X();
$a = 2;
}elsif($a == 2){
・・・・・・・・・・・
}
return;
}
これを実行するとBの直後でsub Xに戻るとA→B→C→D→C→Dと
実行されなかった部分が繰り返されてしまうんですが、
最後の実行されなかったC→Dは繰り返さずに
A→B→C→Dだけまた繰り返すにはどうしたらいいんでしょうか?
returnの数や位置がいけないのかな・・・必ず残った分が実行されてしまうんです。
なにとぞご教授の方よろしくお願いします。
0933nobodyさん
05/01/25 00:17:27ID:???0934nobodyさん
05/01/25 00:32:09ID:???釣りじゃないんす。
まじで初心者なもんで原因が分からないんで教えてください。
X();はある障害が起こってないか常に確認をする為にこまめに入れてます。
ABCDEFGH....と順調に動作させたいんですが、
もし障害のXが起きたら$aの値の最初に戻って繰り返しをしたいんですが・・
0936932
05/01/25 02:24:52ID:???色々試して何度も実行してますが、解決法が分かりません。
知識0に近い状態からこういうものを作らなければいけなくて
lastとか入れたり色々試したんですがダメで何日も苦闘してます。
初心者って書いてあったんで最終的に質問してみたんですが、
ダメデスカ…。
0937nobodyさん
05/01/25 02:31:44ID:???それ以前に
>sub X{ # ← X の中で
>if(X()){ return; } # いきなり X 呼んだら無限ループになるだろ
0938932
05/01/25 02:46:47ID:???丸い物体が迷路を進むものでテンキーの2468で前後左右に進んで
それをsendKeyで送って進みます。
sub X{
if(cmpBmp(X, Y, "$DIR/abcチェックポイント.bmp")){ return; }
チェックポイントの黄色い点を画像認識でマッチングさせてそこで
つっかかってるようなら最初$aの値に戻るっていう風にしたいんです。
画面内でつっかかると自動的にstart位置に戻ります。
でもこの場合、Bの直後に戻ってもABCDCDのように残った部分もループしてしまって
うまく迷路を進むことができず、結局次のEの地点まで行けないのです。
0939nobodyさん
05/01/25 02:50:22ID:???0941nobodyさん
05/01/25 04:59:16ID:???やりたい事は分かった。
要はマッチングの部分と一連の流れを一つにまとめてサブルーチンにしたいわけだな?
それも別の場所でも使うと。
そ れ は 無 理
もっとスリムに書く方法があるべ?ほら。もっと簡単に思いつくぞ?
0942932
05/01/25 05:23:55ID:???ですよね・・ヒントありがとうございます。
>>939
スレ汚し失礼しました。
>>941
>要はマッチングの部分と一連の流れを一つにまとめてサブルーチンにしたいわけだな?
>それも別の場所でも使うと。
はい、その通りなんです。でもやっぱ無理なんですね。
他に方法・・・思いつきませぬ。。
とりあえずサブルーチンの事は後に置いといて考えてみます。
どうもでした。
0943nobodyさん
05/01/25 23:39:11ID:???0944nobodyさん
05/01/25 23:42:52ID:???0945nobodyさん
05/01/26 12:09:54ID:???テンプレがめっちゃ少なくなってる。
テンプレ見に来たのに。
なんでやねん。
しかもム板のコピーだし。
さらに932はム板でもわけの分からん質問してるし。
ほとんどマルチだし。
なんでやねん。
0946nobodyさん
05/01/26 12:13:41ID:/LVNqA6M<body>以前と</body>以降を取っ払って、
一行ずつ、「img要素を画像へのリンクに置き換える」などの処理を与える、という処理をさせて、
push(@dat,"$data\n");
で@配列に放り込んで、
print "@dat[$lines..$line]";
で表示という仕組みにしているのですが、
($lines..$line は、文字数などで計算して18kbで収まるようにしてる部分で、この部分はうまく動作しています。)
ソース表示で見てみると、各行文頭に半角スペースが二つ入っているんです。
@配列に入れる直前に、
$data = substr($data,3);
と、前2byte分削ってみたら<h1>foo</h1>がh>foo</h1>になってしまいました。
普通に使う分には問題ないですが、
pre要素でのマーク付けの際は、
<pre>foo
bar
hoge</pre>
のbar、hogeそれぞれの文頭の半角スペース二個が描画されてしまいます。
原因わかる方、お教え願います。
0948nobodyさん
05/01/26 12:46:04ID:???0949nobodyさん
05/01/26 12:59:38ID:???それが一番の早道ですよね。
@に入れる直前の時点では文頭の半角スペースがなかったようなので、よくわかりません。
>>948
$a = @a
とすると、配列の行数が出るので、""で括らなきゃいけないと思い込んでました。
とったら一個減りました。
あと一つなんですが、もうちょっと頑張ってみますです。
有難う御座いました。
0950946
05/01/26 13:05:30ID:???どこでかわからないんですが、文頭に半角スペースが入ってました。
>>947
「@に入れる直前の時点では文頭の半角スペースがなかったようなので」
とか間違った生意気な発言をしてしまい申し訳ありませんでした。
念のため、もう一度試してみたら見付かりました。
有難う御座いました。
0951nobodyさん
05/01/26 13:21:00ID:???全く理解しないで書いてる香具師が多いってことなのかねぇ...
0952946
05/01/26 13:44:53ID:???私、ですか?
私が@配列に入れた理由は、
header
body中身
footer
のbody中身を18KBで分割するために、@配列に入れました。
なんかおかしいでしょうか?
全て独学なので、間違った使い方をしている可能性は高いですが。
0953nobodyさん
05/01/26 16:15:11ID:???サイト構築に際して重要なのは「構造」か!?「内容」か!?はたまた「理念」か!?
お馬鹿なWEB職人達の寒い議論は今日も止まらない。
ものすごろく頭の悪い発言をしてくさい5
http://pc5.2ch.net/test/read.cgi/hp/1106209097/105-
0954nobodyさん
05/01/26 16:28:44ID:???たとえば文字列リテラルに配列を埋め込むことについては
perldata(1)に
配列変数は、ダブルクォート文字列中で、配列のすべての要素を変
数 $" 中に示す区切文字 (デフォルトはスペース) でつなげて展開
されます。 以下は同値です:
$temp = join($",@ARGV);
system "echo $temp";
system "echo @ARGV";
と説明されているのだが、これを理解していればそのような間違いは
普通しないし、仮にやってしまったとしてもおかしいと分った段階で
これに思い当たりそうなものだということ。
0956nobodyさん
05/01/26 22:18:17ID:NprQarfg0957946
05/01/26 22:47:36ID:???理解以前にそれ、読んでませんでした。
なんとなく始めて、なんとなく出来上がったので、
問題にぶち当たってから調べる、という非効率的な学習の仕方をしてました。
一度、ちゃんと仕様とか読んだ方がよさそうですね。
0958nobodyさん
05/01/27 02:43:34ID:???「KEN丁のせい」と思え
0960nobodyさん
05/01/27 07:05:12ID:???特殊変数がきちんと解説されている本やサイトって少ないしね。
0961nobodyさん
05/01/27 08:27:17ID:???print $hoge,"\n";
print $hoge."\n";
みたいな書き方もあるけど、
print "$hoge\n";
って書いたほうが単純で分かりやすい。
たぶんこういう記法に慣れてるせいで、リストの時も同じような書き方をしてしまうんだと思う。
0962nobodyさん
05/01/27 11:29:00ID:???これって何かの頭文字ですか。
0963nobodyさん
05/01/27 12:38:56ID:???EOD: End Of Data
ならわかるがEOMはしらん
0964nobodyさん
05/01/27 12:48:59ID:???EOF: End of file
EOM: End of message
0966962
05/01/27 13:02:45ID:???でもそうなると「EOMで挟む」っぽい構造になるのが気持ち悪いですね。
見た目的に。
0967nobodyさん
05/01/27 13:36:33ID:???0969nobodyさん
05/01/27 14:54:27ID:???自分の視認性を考えたらそのヒアドキュメントに名前をつける、という感覚の方が、
あとでメンテするときも楽だと思うのだが、そんな俺の発言は余計な御世話だったと思う。
0970nobodyさん
05/01/27 15:56:03ID:ZopGQTdqあいうえお<br>kakikueko<br>
|;
$aの中のものを置換したいです。
<center>は<CENTER>に
</center>は削除
<center>..</center>内の<br>は<BR><CENTER>に
<center>..</center>外の<br>は<BR>
こういうのをしたいんですが正規表現で一発では無理ですか?
0971nobodyさん
05/01/27 16:04:03ID:???アホな漏れはつい
$a =~ |(<center>.*?)<br>(.*?</center>)|\1<BR><CENTER>\2|g;
とか考えたが、これじゃあ<br>が一個以上だとダメだなw
正規表現では無理じゃない?<center>(*.?)</center>こうしてから
$1 =~ s|<br>|<BR><CENTER>|g;
ってやって元の場所に突っ込むとかは?
あ、元の場所に突っ込みようがないか?
0972nobodyさん
05/01/27 16:07:21ID:???$a =~ s|<center>(.*?)</center>|<CENTER>@{[\1 =~ s/<br>/<BR><CENTER>/]}</CENTER>|g;
とかでどうだ?
今は試す環境がないからなんともいえないが
0973nobodyさん
05/01/27 16:16:54ID:???パズルとしてはおもしろいのかもしれないが、
メンテしにくくなるだけなので素直に順を追って
複数回に分けて置換した方がいいと思うぞ。
0974970
05/01/27 16:19:43ID:ZopGQTdqあいうえお<br>kakikueko<br>
|;
@a = $a =~ m|<center>(.*?)</center>|;
$_ =~ s|<br>|<BR><CENTER>|g foreach @a;
$a =~ s|<center>(.*?)</center>|<CENTER>@a|g;
一応できました。不備があったらお願いします。
それともっといい方法がありましたらお願いしますm(_ _)m
0975nobodyさん
05/01/27 16:22:24ID:???・・・・・・漏れよりできる人なのねorz
恥ずかしくなってきた;
一応
$a =~ s/<br>/<BR>/g
が最後に足りてないよ・・・と^^;
気付いてるんだよねきっと
しかし漏れがなんとか1行でやってみせる。15分だけr時間をくれ。
0976970
05/01/27 16:27:33ID:ZopGQTdq全然ダメでした。
正規表現のgオプションを使っている時って「今何回目」という
情報をもっていないのでしょうか?
0977nobodyさん
05/01/27 16:50:36ID:???最後にまた「%%」へ戻すようにしているのですが、日本語等で
アラームが使われるようなことはありますでしょうか。
あるとその文字の一部も「%%」になってしまうのでどうしようか
考慮しております。
ご教授いただけますと幸いです。
0978nobodyさん
05/01/27 16:54:14ID:???eオプション使えば1行でいけそうなのに、後一歩でできなかった。
>>976
よかったら役に立てて下さい。
$a =~ s|<center>(.*?)</center>|"<CENTER>",$1=~s/<br>/<BR><CENTER>/|eg;
$a =~ s/<br>/<BR>/g;
$1を置換してそのまま置換後文字列を埋め込む方法がわからなかったorz
0979nobodyさん
05/01/27 17:37:33ID:???ショッピングカートのCGIを配布しているのですが、
MacOS9とIEの組み合わせだとバグが出てしまうという指摘を受けました。
商品が11種類以上になるとバグが出るそうです。
Winの場合、もしくは商品が10種類以下の場合は正常に動きます。
MacのIEだとperl内での変数の処理が特殊である場合などがあるのでしょうか。
例えばforeachを使ったときに「$_」の値が正しく認識されない、
等のバグなどがあるのでしょうか。
もしもあるのだとしたら、Macとそれ以外のOSの動作の違いなどを
解説したサイトがありましたら教えていただけると嬉しいです。
よろしくお願いします。
0980nobodyさん
05/01/27 18:00:01ID:???CGIの場合、perlは鯖の中で動きます。
そして出力内容がブラウザに返されて表示に使われるわけです。
従ってperlは無罪です。
バグつーのが何を指してるのか一切情報が提示されて無いのでアホかと思いますが、
不都合が生じる際の入出力の差異(GET・POST値、cookie HTTPヘッダ等)や
JavaScriptを利用しているならその解釈の差異を確認するのが解決の糸口になると思われます。
以降は別スレ或いは別板で質問するのが適当でしょう。
0981nobodyさん
05/01/27 18:07:38ID:???0982nobodyさん
05/01/27 18:12:29ID:???Perlコーディング初心者質問スレ Part 40
http://pc5.2ch.net/test/read.cgi/php/1106816922/
0983nobodyさん
05/01/27 18:21:10ID:???手のつけようの無いバグで焦ってしまっていましたが目が覚めました。
言われてみればその通りです。
GET・POST値の差異というヒントをいただけただけでもとても助かりました。
ありがとうございます。
0984nobodyさん
05/01/27 18:24:12ID:???しかもショッピングカートをきたもんだ。
((((;゚Д゚))))ガクガクブルブル
0985nobodyさん
05/01/27 18:32:32ID:???0987nobodyさん
05/01/27 23:15:51ID:???0988nobodyさん
05/01/27 23:16:14ID:???my $center = '';
$a =~ s{(</?center>|(<br>))}{uc(($2 or $center = $1 eq '<center>' ? $1 : '', '').$center)}ge;
0989nobodyさん
05/01/27 23:33:37ID:???$a =~ s{(<(/)?center>)|(<br>)}{uc(($3 or $center = $2 ? '' : $1, '').$center)}ge;
こっちの方がいいか。
0991970
05/01/28 09:30:02ID:dK9OtT7Gそれはどうなってるのでしょうか?
はじめに<center>を見つけると$center=<center>をして、
その後の<br>発見では自動的に<BR><CENTER>への変換。
</center>を見つけると$center=''で$centerが空っぽになる。
その後<br>を見つけると<BR>.''のようになる。
つまり<center>..</center>ないの<br>という捉え方ではなく
<center>がでるとフラグonで、</center>がでるとフラグoff。
状態情報を保有させてる感じなんですね。面白いですね。
1つわからないんですが$1,''の部分の''は何の役割があるのでしょうか?
これがないと確かに動作が変わるみたいですが・・・・・・どういう意味なのか
どういう瞬間に使われているのかわかりません。
もしよろしければご教授お願いします。
レス数が950を超えています。1000を超えると書き込みができなくなります。