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

【Perl】初心者コーナー Part15

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/08/08 23:19ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
071368902/09/07 02:10ID:mL5CsCc5
>>710
とりあえずchopはあきらめてsubstrで試してみます。
(やりたい事は同じはずだから)
ありがとうございました。
0714nobodyさん02/09/07 02:12ID:???
ちなみにif(){〜}はループじゃないぞ。
その外側にwhile(){〜}とかfor(){〜}とかforeach(){〜}とかの
ループがあるんじゃないのか。

substrじゃ$aaaの値は減らないけど良いの?話違わない?

>>712
スレタイ嫁
0715nobodyさん02/09/07 02:33ID:???
……chop、カッコで囲んだら?
$bbb = (chop($aaa)).$bbb;
0716nobodyさん02/09/07 02:43ID:???
>>715
カッコつけてんじゃねーよ
0717名無しさん@Meadow02/09/07 04:24ID:???
>>684
私は、jperl使ってるので別に文字化けしないけど。
じゃtr使えばいいじゃんという問には答えません。
0718nobodyさん02/09/07 12:21ID:???
( ´,_ゝ`) プッ みなさんレベルが低いですね
0719nobodyさん02/09/07 14:35ID:???
↑さびしんぼハケーン(・∀・)ニヤニヤ
0720nobodyさん02/09/07 16:12ID:???
↑さびしんぼハリケーン(・∀・)ニヤニヤ
0721CGIゲームつくりたい人02/09/07 18:06ID:BCsa1yWW
CGIに関してはまったく知識がないのですがこれから勉強するつもりなのですが
目標が自分でCGIゲームを作ることで
そのために参考書を買って勉強したいのですが
オススメの本ありますか?
本屋いってもゲーム作りの本がどれだかわからなくて・・・
よろしくおねがいします。
0722nobodyさん02/09/07 18:40ID:???
>>721
作りたいゲームにもよるけど
Perl は君の求めるものに向いてないと思うよ。
JavaScript とかの方が良いんじゃない?
0723nobodyさん02/09/07 18:59ID:???
>>722
C言語薦めた方が…。
>>721
perlでゲーム作るのは空しいかも。
趣味の域は越えられますまい。
0724nobodyさん02/09/07 19:11ID:???
>722-723
まてまて、Flash+CGIという素晴らしいコンビネィションがあるだろうが
0725nobodyさん02/09/07 19:18ID:???
>>721
が何言語でCGIを作るのかが、大事だろうが。
0726nobodyさん02/09/07 20:02ID:6TBf75EA
データが入ってるファイルに一行で
ヤッタ?マン コーヒー ライター
という3つがスペースで区切られてあった時、
aa=ヤッタ?マン
bb=コーヒー
cc=ライター
というふうにするにはどうすればよいのでしょうか?
0727nobodyさん02/09/07 20:05ID:???
待てみんな。>>721-725
>>721 はわざわざこのスレを選んだんだ。
http://www.webgame.co.jp/
でも Perl のゲームはわりとあるし。
てゆうか検索してオレがびっくりしたよ。

しりとりゲームくらいならココで。
http://www.geocities.co.jp/SiliconValley-Oakland/1680/xperl/
0728nobodyさん02/09/07 20:08ID:???
>>726
($aa, $bb, $cc) = split / /,"ヤッタ?マン コーヒー ライター";
0729nobodyさん02/09/07 20:27ID:???
>>728
うわぁぁ?! thx!
0730CGIゲームつくりたい人02/09/07 20:58ID:BCsa1yWW
>>722-725 >>727
レスありがとうございます。
作りたいゲームは・・・罪と罰++やFFAみたいなゲームです
普通のPerlの本をきちんと読めば作れますか?
それともゲーム作成向けの本とかあるんですか?
0731nobodyさん02/09/07 21:07ID:???
>>730
つくったらiswebに置くの?
0732nobodyさん02/09/07 21:08ID:???
だ!か!ら!無理だっつーの。
だいたいゲーム作りたいならCやれ。
Perlは馬鹿でも使える言語だが、ゲームが作りやすい言語でない。
習得期間は
Perlは3カ月で
Cは1年
C++は3年だ。
Perlの本はオライリーの奴買っとけ。
0733nobodyさん02/09/07 21:13ID:???
修得はCよりもPerlの方が時間がかかるとおもうよ。
複雑さがCとは比べものにならないでしょ(^_^;)
0734nobodyさん02/09/07 21:17ID:???
>733
両方覚えたけどPerlの方が楽。
Cは基本的な部分を覚えるまでに挫ける人が出そう。
プログラムのいろはを知らない人間ならPerlからの方が断然楽だと思う。
サンプルソースが山のように転がってるし。

なにをもって習得とするかの問題だけど、出力をHTMLでできる分、
PerlでCGIスクリプト作った方が楽だと思うよ。
0735nobodyさん02/09/07 22:28ID:???
>>730
perlは「ゲームを作るための言語」ではないので
「ゲームの作り方の本」なるものはないと思われ。
応用すればゲームにもなるというだけの話
0736nobodyさん02/09/08 01:41ID:GXmEPtQH
for(@xx){〜}

foreach(@xx){〜}
の違いを教えてください
0737nobodyさん02/09/08 01:46ID:???
perl -MO=Deparse,-x7 -e 'for(qw/a b c/){ print }'
perl -MO=Deparse,-x7 -e 'foreach(qw/a b c/){ print }'

というわけで、for(@配列)の場合、ただのforeachと同等。
0738nobodyさん02/09/08 01:53ID:GXmEPtQH
サンクス
0739nobodyさん02/09/08 06:17ID:nOl8KoRo
結論

perlでゲームは作れるが、perlでゲームを作る本などない
perlで掲示板が作れるようになれば、まあゲームも作れるだろう
0740nobodyさん02/09/08 06:36ID:???
>>732
Perlでマインスイーパー作りましたが、何か?
0741nobodyさん02/09/08 06:47ID:gqIGmvuo
>>732
アクション系列のゲームならそうでしょうが、ウェブ上でのゲームならPerlベースで幾らでもありますよ。
表現はHTMLが精々ですけどね(w

で、質問です。
AnyDBMで1000人前後のデータ(名前、成績、等大小50パラメータぐらい)を管理しようと考えています。
それでファイルロックをどうしようか悩んでいるのですが、
sub LOCK {open (LOCK, "lockfile.lock");flock(LOCK,2);}
sub UNLOCK {flock(LOCK,8);close(LOCK);}
こんなのってありなんでしょうか?
それともやはりrename等で制御したほうが良いですか?
0742名無し二丁拳銃 ◆0s6WDHa6 02/09/08 11:30ID:HukZlCsp
最近Perlを始めて,今,カウンタを作っているところなんですが,
以下のソースだと,カウンタの値が永遠に1のままなんです。

#!/usr/local/bin/perl

#値を保存するファイル名
$file = "count.dat";

#−−処理開始−−

#ファイルを読み込み
open FH,$file;
$count= <FH>;

#カウントアップ処理

$count++;

#書き出し処理
print "Content-Type: text/html\n\n";
print "Total : <a href=cgi-bin/acces/replist.cgi>$count</a>";

#値を保存

open FH,>$file;
close FH;

exit;
0743nobodyさん02/09/08 11:37ID:???
>>742
ファイルに書き込んでないじゃん。
0744nobodyさん02/09/08 11:41ID:???
sendmailでメールを送りたいです。
html形式で送ろうと思うんですが、
ヘッダーの部分の
Content-Type: text/plain; charset=ISO-20220JP
ここのtext/plainを
text/html
に変えればいいだけですか?
ローカルだと実行できないので教えてください。
0745nobodyさん02/09/08 12:07ID:???
>>744
ローカルでテストするときはsendmailに渡すんじゃなく、ファイルに書き出してみればいいんじゃない。
0746nobodyさん02/09/08 12:14ID:Y8OpaJeI
はじめまして。
掲示板のプログラムを作成しています。
『投稿確認』をしたいのですが、そこでどうにもこうにも困ってるキングオブDQNなんです。

まず、htmlファイルからsubmitで送られたデータを表示することはできるのですが
そこから先、どうすればいいのか分かりません。
どうすれば
[投稿確認画面表示]⇒[logファイルへの書き込み]の二段構えにすることができるのでしょう?
0747nobodyさん02/09/08 12:21ID:???
>746
<input type="hidden" name="***" value="*********">
0748 02/09/08 12:24ID:???
>>746
hidden
074974602/09/08 12:31ID:Y8OpaJeI
>>747-748
ありがとうございます。さっそく作ってみます。
0750nobodyさん02/09/08 12:52ID:???
>>745
どもっす。
とりあえず、上手くいきました。
0751nobodyさん02/09/08 13:02ID:???
whileとかループをぬけるのはlastですが、ifをそっこーで抜ける方法はありますか?
075274602/09/08 13:16ID:Y8OpaJeI
うう、うまくいかなかった。やっぱりキングオブDQNだよ。w
確認画面でsubmitで送られた文字を表示して

<form action = "./data.cgi" mehtod = post>
<input type = "hidden" name = "confirm" value = "OK">
<input type= "submit" value = "投稿する">

で最初にsubmitで送られた文字を表示するのと同じCGIを呼び出して
if ($confirm eq 'OK' ) {
……
}
で分岐させたのだけれど、うまくいかない。
確認画面が表示されるだけです。しかも、nameとかemailとかのデータが全部消えてる。
0753nobodyさん02/09/08 13:16ID:???
>>751
アルゴリズムを再考しる。
075474702/09/08 13:21ID:???
>752
1から勉強しなおせ。

>751
gotoなどと言ってみるテスト。
0755nobodyさん02/09/08 13:23ID:???
>>752
確認画面を表示の時に一度送られてきたデータも
hiddenで書き出してる?
075674602/09/08 13:26ID:???
>>755
いえ、していません。必要なのでしょうか?
075774702/09/08 13:30ID:???
>756

nameなどのデータを入力

入力されたデータを受け取る
確認画面表示

入力されたデータを送っていない
データが空っぽ
0758nobodyさん02/09/08 13:44ID:???
>>754
>gotoなどと言ってみるテスト。
( ´,_ゝ`) プッ
075974602/09/08 14:01ID:???
hiddenで書き出しても、うまく送信できません。
なには他に注意点はあるのでしょうか?
荒らしてゴメン。
0760nobodyさん02/09/08 14:04ID:???
>759
ソースをtxtにしてアプれ。
多分一斉につっこんでくれる。
0761nobodyさん02/09/08 14:08ID:???
>>759
HTMLを覚えてこい
データの送受信を覚えてこい
日本語覚えてこい
0762761?02/09/08 14:11ID:???
htmlファイルへの書き込みのときに現在は下のようにしているのですが
これだとhtmlファイルを見ると\nが効いて改行されているのですが
cgiファイルでは改行されていないので見にくいです。
ヒアドキュメントを使って print HTML <<HEADER ではだめでした。
どうしたらよいでしょうか?

open(HTML, ">hoge.html") || &error("ファイルが開けません");
print HTML "<HTML>\n<HEAD>ここにタイトルやスタイルシートなどをごちゃごちゃと</HEAD>\n<BODY>\n";
close(HTML);
0763762?02/09/08 14:17ID:???
説明する能力って大事だよね
076474602/09/08 14:25ID:???
もういいです。さいなら。
0765nobodyさん02/09/08 14:29ID:???
print pack('C*', map{$_+180}(1,27,0,35,23,27,12,42,17));
0766nobodyさん02/09/08 14:29ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0767nobodyさん02/09/08 14:45ID:971QY8yx
a.sh(sh)で定義した変数をperlで書いたスクリプトで参照したいのですが
どのように書いたらよいですか?

a.sh
#!/bin/sh
STR=testtxt

(このSTRという変数をperlのスクリプト内で使いたい)
0768nobodyさん02/09/08 14:52ID:???
-- test.sh ------------------------------
#!/bin/sh
export STR=mona
/usr/bin/perl test.pl

-- test.pl ----------------------------
#!/usr/bin/perl
print "STR = $ENV{STR}\n";
0769nobodyさん02/09/08 16:11ID:QxRWekvC
他人がWindowsで作成したiモード用のcgiを直すことになったのですが、
iモード用作成は初めてで、
しかもMacなので、どうやってテストすればいいか分かりません。
iモードツールみたいなもののMac版ってないですかね?
教えて下さい。
0770nobodyさん02/09/08 16:27ID:???
マルチ氏ね
0771nobodyさん02/09/08 16:30ID:fnlZSMGR
GoogleのクロールにCGIの実行結果を反映させるには、どのような点に注意すればいいですか?
0772nobodyさん02/09/08 21:22ID:???
>>771
どうやらGoogieは、「〜.cgi」で終わってるリンクは無視するけど、
「〜.cgi?***」となってるリンクは拾う模様。
***の部分はテキトーで構わないので、Googleに拾って欲しければ
そのCGIへリンクを張る時に、「<a href=〜.cgi?hoge>」とでもしておけばよし。
まぁ俺調べに過ぎないのでダメだったらすまそ。
つってもスレ違いぽいけど。
0773nobodyさん02/09/08 21:42ID:???
>>762
open(HTML, ">hoge.html") || &error("ファイルが開けません");
print HTML "<HTML>\n";
print HTML "<HEAD>ここにタイトルやスタイルシートなどをごちゃごちゃと</HEAD>\n";
print HTML "<BODY>\n";
close(HTML);
0774nobodyさん02/09/08 22:08ID:wn4ctmfO
Proxyをはじくものを作りたいんですが、どうやったら判別できますか?
0775適当02/09/08 22:12ID:???
>>774
if(!$ENV{'HTTP_HOST'}){
print"カエレ";
exit;
}
0776nobodyさん02/09/08 22:13ID:???
>744
漏れ串くらいしか無理。
A串は無理。
診断君でも見てな。
0777nobodyさん02/09/08 22:13ID:???
既存のものを見習え。
077877502/09/08 22:18ID:???
HTTP_HOST>REMOTE_HOST
077974102/09/08 22:19ID:gqIGmvuo
鬱。
0780nobodyさん02/09/09 00:56ID:ocbC3C/Q
copal2の構文チェックってどうやるの?
0781nobodyさん02/09/09 01:41ID:ewVE42mB
はじめまして
初心者なのでよろしくお願い致します

CGIを単独で実行できるEXEにするようなツールはありませんか?
postやgetで受信した変数を判断し、ローカルでそれっきりで動くもの
そういうものはありませんか?
0782nobodyさん02/09/09 01:47ID:???
CGIってのが、PerlならPL2EXEとか。
0783Rikuta02/09/09 01:50ID:4uRhXRlu
掲示板を作成しています。
長くなったタイトルや、URL表記を途中まで取得し、
残りを「....」としたいのですが、正規表現ではどうするのでしょうか。
@subject = split(//,$subject);
@subject = splice @subject,0,40;
undef $subject;
foreach (@subject){
$subject = $subject.$_;
}
print $subject;
としたのですが、当然というか・・・日本語では化けてしまいます。
Jperlを使用しないでどうすればよいでしょうか。
0784nobodyさん02/09/09 01:52ID:ewVE42mB
782>>
ありがとうございます
試して見ます
078574102/09/09 02:12ID:2XJWXXjE
鬱。ダレモコタエテクレナイヨー
078674102/09/09 02:49ID:2XJWXXjE
チョトIDガカコイイカモ
0787nobodyさん02/09/09 03:05ID:???
>>783
$subject =~ s/([\W])/sprintf("%%%02X",unpack("C",$1))/ge;
078878702/09/09 03:07ID:???
↑URLエンコードしてしまう
0789nobodyさん02/09/09 03:08ID:EyAemdpt
>>783
$n = 40;
$subject = substr($subject,0,$n+1);
$tmp = chop($subject)."\0".$tmp while($subject);
$tmp =~ s/(?<=[\x81-\x9f\xe0-\xfc])\0(.)\0/$1\0\0/g;
$subject = substr($tmp,0,$n*2).'....';
$subject =~ tr/\0//d;
print $subject;

>>741
読み込みオープンのロックは1。それも他の書き込みに対するロックなので
読み込みには無力。
書き込みで開いてロックしときな。
079078302/09/09 03:18ID:???
>>787
表示上で使用しますので、エンコードはちょっと・・・

>>789
ありがとうございます。
うまくいきました。
0791nobodyさん02/09/09 03:26ID:???
>>790
エンコードして切ってデコードって言いたいんじゃないの?こんなふうに。

$n = 40;
$subject = substr($subject,0,$n+1);
$subject =~ s/([\W])/sprintf("%%%02X",unpack("C",$1))/ge;
$subject = substr($subject,0,$n);
$subject =~ s/(%[a-f\d]|%)$//i;
$subject =~ s/%([a-f\d]{2})/pack("H2",$1)/egi;
print $subject;
079279102/09/09 03:42ID:???
あ、これじゃエンコードしてる意味無いね(;´Д`)
0793nobodyさん02/09/09 03:43ID:PULoisdM
空行は/^$/にマッチするのは分かるんだけど
空行を削除するにはどうしたらいいんですか?

あたりまえだと思うけど
while(<STDIN>){
s/^$//;
}
としても駄目なんです。。
0794nobodyさん02/09/09 04:47ID:???
>>793
@line = <IN>;
$n = @line;
for($i=0; $i<$n; $i++){
if($line[$i] eq "\n"){
$line[$i] = '';
}
}

かな…?
0795名無しさん@Meadow02/09/09 05:44ID:???
>>793
print unless /^$/;

で逝けますYO

0796T女の竹田02/09/09 07:59ID:???
>>783
Shift-JIS
$subject = ($subject =~ /([\x0-\x7e\xa0-\xdf]|[\x81-\xbf\xe0-\xfc][\x40-\xfc]){40}/s) ? $& : $subject;

EUC-JP
$subject = ($subject =~ /([\x0-\x7e]|[\x8E\xA1-\xFE][\xA1-\xFE]){40}/s) ? $& : $subject;

これでどうかな?
0797nobodyさん02/09/09 09:52ID:OPX6Zz9+
ド初心者なんですがスマソ
パスワードが違ったらはじくのを作りたいんですが正しく動作しません
どこをどう直せばいいでしょうか?

if ($pass != xxxx){
print "aho";
exit;
}
0798nobodyさん02/09/09 10:05ID:???
>>797
eq
0799nobodyさん02/09/09 10:16ID:OPX6Zz9+
>>798
パスワードが違ったらahoと表示させたいんですよ
eqだと合ってたらahoですよね?
0800 ◆JAPH9PWA 02/09/09 10:26ID:???
>>799
そこまでわかってて何故neにたどりつけないのか謎
ちなみにパスワードは暗号化したほうが良いよ
0801nobodyさん02/09/09 10:41ID:OPX6Zz9+
>>800
neでやっても500Internal...がでてきちゃうんですよ
0802nobodyさん02/09/09 10:54ID:OPX6Zz9+
言い方がまずかったですね

passが違う場合にif内を実行したらcgiを終了させるものを作りたいんですよ
(passが合ってるならifより後を実行)
0803 ◆TpctYDQ6 02/09/09 10:56ID:YALFpbWA
if ($pass ne "xxxx"){
print "aho";
exit;
}
で、エラーなら問題は別のところでしょ。
0804nobodyさん02/09/09 11:04ID:OPX6Zz9+
>>798-803
print "Content-type: text/html; charset=EUC-JP\n";
を加えたら正しく動きました。スマンコ
首釣って逝ってきます。
0805nobodyさん02/09/09 19:03ID:???
>>804

やっぱりただのバカか
0806nobodyさん02/09/10 01:33ID:???
>>794,795
その方法でいけました。
ただ、
while(<STDIN>){
s/hoge/hage/;
s/omeko/sasete/;
print;
}
みたいな置換と一緒に空行を削除したい
場合はどうすればいいの?
ifをネストすればいけると思うんだけど
書けないので教えてください。
0807適当さん02/09/10 06:52ID:???
>>806
while(<STDIN>){
if($_ ne"\n"){
s/hoge/hage/;
s/omeko/sasete/;
print;
}
}
0808nobodyさん 02/09/10 12:40ID:???
質問があります。
今日が、その年その月の第何週何日目か?
を求める方法を教えて下さい。
例えば今日の場合、第2週の3日目なので
出力結果を23と得たいです。
お願いします。
0809名無しさん@Meadow02/09/10 12:47ID:???
>>806
while(<STDIN>){
next if /^$/;
s/omae/bakaka/;
s/omae/ahoka/;
print;
}
でもええよ。
0810nobodyさん02/09/10 12:59ID:???
>808
($sec , $min , $hour , $mday , $mon , $year , $week) = localhost(time);
print (int($mday/7)+1)*10 + $week ;
0811nobodyさん02/09/10 12:59ID:???
>810 =~ s/localhost/localtime/;

∧‖∧
0812nobodyさん02/09/10 13:02ID:???
>810
それだと2-6日は必ず第1週になるよ…
■ このスレッドは過去ログ倉庫に格納されています