トップページ⇒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あたりを見よう。
0552nobodyさん02/09/02 12:32ID:???
>>548
(localtime(time))[0..8]
055354802/09/02 12:32ID:???
>>551
仕様ですか。
ありがとうございました。
055454802/09/02 12:39ID:???
>>552
なるほど。
$tm=time;
($mday,$mon)=(localtime $tm)[3,4];
で、できました。
ありがとうございました。
0555 ◆JAPH9PWA 02/09/02 12:42ID:???
>>548
(undef,undef,undef,$mday,$mon)=localtime;
055654802/09/02 12:46ID:???
>>555
試してみました。それでもできるんですね。
ありがとうございました。
055755002/09/02 12:51ID:???
>>551さん
できました!ありがとうございます!
055854202/09/02 19:45ID:???
&lock_open(TXT, "a.txt");
@txt = <TXT>;
&unlock_close(TXT);

open(OUT,"> x.txt");
print OUT "@txt";
close(OUT);

&lock_open(TXT, "a2.txt");
@txt = <TXT>;
&unlock_close(TXT);

open(OUT,">> x.txt");
print OUT "@txt";
close(OUT);

&lock_open(TXT, "x.txt");
@txt = <TXT>;
&unlock_close(TXT);
foreach $m (@txt) { chop($m); }
でできました。opendirの意味がいまいちわからなかったので544さんの「それはopendirしたディレクトリのファイルリストを得る関数だ」
の助言で納得できました。おさわがせしてすみませんでした。ありがとうございます。

0559nobodyさん02/09/02 20:49ID:???
>>558
@txt = &lock_open("a.txt");
とか
print OUT &lock_open("a.txt");
とか
chop @txt;
とか。どーでもいーけど。
0560nobodyさん02/09/02 20:52ID:???
>>547
そのガセのネタ元をさらすべし。
0561nobodyさん02/09/02 20:56ID:???
http://www.big.or.jp/~mio/ga/pl/plman/plvari.htm#変数
0562nobodyさん02/09/02 21:11ID:???
>>561
546 じゃなくて 547 ワカル?
0563nobodyさん02/09/02 21:53ID:Ldjfc++c
perlでsocketを使用して、外部のサーバの情報を取得したいのですが、
その際にタイムアウトの時間を設定することは出来ませんか?
例えば、10秒以内に取得できなければ、エラーを出して終了するとか出来ませんか?

現在↓みたいにして取得しています。
よろしくお願いします。

#---------------------------
use Socket;
my $sock_addr = pack_sockaddr_in(80, inet_aton("2ch.net"));
socket(SOCKET, PF_INET, SOCK_STREAM, 0);
connect(SOCKET, $sock_addr);
select(SOCKET); $|=1; select(STDOUT);
print SOCKET "GET / HTTP/1.0\r\n";
print SOCKET "\r\n";
while (<SOCKET>){m/^\r\n$/ and last;}
while (<SOCKET>){print;}
#--------------------------
0564nobodyさん02/09/02 21:55ID:???
fork
0565 ◆Perl0MBA 02/09/02 23:13ID:???
>>563
$time=$^T;
if(int($^T-$time)>=10){shutdown(2)}
0566nobodyさん02/09/03 00:10ID:???
>>563
perldoc -f alarm
0567nobodyさん02/09/03 00:40ID:???

ヽ(´∀`)ノ
  ( へ)
   ヽ
0568nobodyさん02/09/03 00:41ID:???
perldoc -q timeout
0569 ◆4XfSMGTg 02/09/03 17:40ID:???
ここはPerl5なんか未だに使ってるヴォケのすみかですか・
0570nobodyさん02/09/03 18:24ID:???
Perl4 なんかよく使っていますが。何か。
0571nobodyさん02/09/03 19:43ID:bBGpZ26t
名前空間を気にせずに複数ファイルにコードを分割したいのですが、どのようにするとベターでせうか。
0572nobodyさん02/09/03 19:48ID:???
自分にとって読みやすい様にするのがベター。
0573f02/09/03 19:51ID:K/olstAP
-------変態・MTTどこでも-------
---●●●変態痴女を紹介致します。●●●---
例えば>欲求不満オマ●コヌレヌレ女・露出オナニー痴女・
フェラチオおしゃぶり女・ミニスカ・ノーパン娘・巨乳パイズリ娘・
アナルSEXおねだり娘・オマ〇コ弄られマン汁グチョグチョ女・
SM牝豚・緊縛・浣腸・スカトロ・等・・・刺激を求めています。
●●●学生・OL・主婦・モデル・牝豚・女王様・オカマ等・多数!●●●
 090-8002-8356番   
-----------------------------
  http://www.mttdocomo.jp/
-----女性アルバイト随時募集・高収入(日払い)月100万円可能-----
http://www.mttdocomo.jp/
Iモードはこちら→http://www.mttdocomo.jp/i


0574nobodyさん02/09/03 20:21ID:OLMxXVpc
http://www.jsweb.sexheroes.com/index.html
0575初心者02/09/03 23:24ID:KI0OEEO7
すみません質問です.

perlで、他のurlに変数と値をポスト送信してアクセスする方法はありますか?
print"Location: http://〜";
はうまくいきませんでした。お願いします。

詳しい方、教えてください。
0576nobodyさん02/09/03 23:26ID:???
>>575
変数って送れるの?
0577nobodyさん02/09/03 23:27ID:???
>>575

print"Location: http://〜\n\n";
0578初心者02/09/03 23:34ID:KI0OEEO7
>>576

ふつう、<a>タグの記述だと、
"〜.cgi" method="post" postdata="name=value&name2=value2"
とかになるのかな?と思うのですが(htmlではなくhdmlで作業して
いるので、そういう記述になっています)、
GETメソッドなら
print"Location: http://〜.cgi?name=value&name2=value2";
みたいなやり方で出来るのかもしれませんが、
postだとどうなのかな?と。

perl自体、初めて触ったという話にならない初心者なので、
正直まいっています。

詳しい方、またそうでない方も、参考程度の意見で構わないので、
聞かせていただけたら幸いです。
0579bloom02/09/03 23:43ID:L4DD9EQO

http://www.leverage.jp/bloom/start/
0580nobodyさん02/09/04 00:08ID:???
>>575

>577が答え出してるだろ!
0581nobodyさん02/09/04 00:09ID:???
>>578
postはform要素で送ります。
0582 ◆4XfSMGTg 02/09/04 01:22ID:???
ここってCGI厨しかいないの?
0583T女の竹田02/09/04 01:43ID:???
>>575
ソケットで繋いで、Content-Lengthを書いて、その後は普通に
データを送る。

POST http://www.perl.org/survey.cgi
Content-Length: 66
Content-Type: application/x-www-form-urlencoded

name=Gisle%20Aas&email=gisle%40aas.no&gender=M&born=1964&perc=3%25
って感じで。
(参照:http://member.nifty.ne.jp/hippo2000/perltips/HTTP/Request/Common.html)

ただ、こうするともちろんレスポンスもらうのはスクリプトだから注意して。
そのままprintしてやればとりあえずOKだけど、ブラウザのURLが
POST送ったスクリプトのままだから、相対リンクのイメージとかが
めちゃくちゃになりそう。

ダミーのHTML用意して、フォーム書いて、OnLoadかなにかで送るのが
一番早いかなぁ。
0584nobodyさん02/09/04 02:59ID:???
>>575
http://www.parkcity.ne.jp/~chaichan/qanda/qa3100.htm?02-09-04-02-58
0585nobodyさん02/09/04 09:33ID:???
掲示板でログファイルのサイズが100KB以上になったら末尾要素を削除するという処理をしたいのですがうまくいきません

# 記事の最大保存容量(単位:KB)
$maxsize = 100;

$maxsize = $maxsize * 1000;

$logsize = (stat($logpass))[7];

while($logsize > $maxsize) {pop @data; $logsize = (stat($logpass))[7];}

書き込み処理の直前に↑のようにやってみたんですがうまくいきませんでした。
変数を書き出したりしてみたんですが原因がわからず困っています。
どなたかわかりませんでしょうか?
0586名無しさん@Meadow02/09/04 10:08ID:???
pop @data; だけじゃ、ファイルに書き込んでないから、
ファイルは変わっていない。
0587nobodyさん02/09/04 11:03ID:???
>>586

そのあとログファイルに書き込み処理をしています。
0588名無しさん@Meadow02/09/04 12:03ID:gOg0cXWU
だってさ、ファイルの大きさを求めて100KB以上かどうか判定しているのは、
書き込む前でしょ。
while($logsize > $maxsize) {pop @data; ↑$logsize = (stat($logpass))[7];}
矢印のところで書き込まないと・・・
それより別の方法を考えたら?
0589nobodyさん02/09/04 13:23ID:???
あ、なるほど。納得しました。
0590nobodyさん02/09/04 14:56ID:???
配列@dataのバイト数を調べたいんですが
foreachでまわして一行ずつlength関数でバイト数を調べるほかに何か方法ありますでしょうか?
0591nobodyさん02/09/04 15:15ID:???
配列に入れる前に計っとくとか。
0592nobodyさん02/09/04 15:23ID:2Otyyhgv
教えてくらさい。
ここのメル友募集用掲示板で会員用サイトを作りたいのですが、
http://tsubaki.sakura.ne.jp/~campus/grooweb/jewel.html

メールを送る時にID&PASSでアクセス制限をかけたいのです。
どの様に作ったら良いのでしょうか?
0593名無し02/09/04 15:51ID:AttOz/Tz
以前、ここで見かけた様な気がするのですが
回答が書かれているのを見つけられないので
以前、質問した人に代わってお聞きします。
CookieをOnにしないと弾き出してしまう
ここで使っているものみたいなCGIのスクリプトを
扱っているようなホームページは知りませんか?
もちろん、ここにスクリプトを書いて下されば
もちろん、なおさら有り難い事ですが…
0594b02/09/04 16:01ID:07M2lj7H
http://www.jsweb.sexheroes.com/index.html
0595nobodyさん02/09/04 16:12ID:A3ZRMRKj
ある有料サーバーを使っているのですが、ファイルを出力するCGIを
実行する際に、専用のSSLサーバー(ttps://***.site-secure.net/)
を通すとInternalServerErrorが出てしまいます。
どなたか分かる方いたらお願いします。
0596nobodyさん02/09/04 16:19ID:???
>>595
  , - - 、                    /ヽ
 / O  \グヒャッ !       /ヽ、     /  ヽ
 ,, : ,ー, O |          /  _,;, -'''"~~    ヽ
'' ; ∴_ノゝ ゝ         /o    O      ヽ
  ヽ ,;''"~"'';,       /  ┌─┐   ノ(   ヽ
_ノ|  ;;'';;'';;'';;''      |  /    |    ⌒    | <スレ違いもはなはだしいわ!
   ゝ、ヾ  ヾ        | ト、   |         /
 /  ヽ ヾ  ヾ      ヾ、 \ノ        ノ
    ノ\_ヾ  ヾ      /⌒ヽ、 ___/、
       ノヾ  ヾ_ _/  ノ,         ヽ
         ヽ、ゝ     ノ ノ     ハ    ヽ
           ゝ、   ノ  ノ、     ノ ゝ   | )
             ー─一'´  ゝ、        l'´
                         )          /
CGIだけど、なんか質問ある? Part 6
http://pc.2ch.net/test/read.cgi/php/1025930486/
0597nobodyさん02/09/04 17:33ID:???
>>593
どんなスクリプトでも頭に以下のような文を入れれば弾ける。

unless($ENV{'HTTP_COOKIE'}){
print "Set-Cookie: value=check; path=$ENV{'SCRIPT_NAME'} domain=$ENV{'HTTP_HOST'} expires=Fri, 31-Dec-2010 00:00:00 GMT\n";
}
&error_end('くっきーオンにしてちょ') unless($ENV{'HTTP_COOKIE'});
059859302/09/04 19:35ID:rVUPKdSl
>597さん
どうも有り難うございました。
まさか、こんなに早く教えて頂けるとは思いませんでした。
ところで
expires=Fri, 31-Dec-2010 00:00:00 GMT\n
の部分なのですが、ここの記述は
絶対こうでなくても構いませんよね。
0599nobodyさん02/09/04 20:58ID:???
>>598
別にセッションでいいだろ
0600名無しさん@Meadow02/09/04 21:42ID:rtiaBVOu
>>590
$ perl -e '@ar=qw(a b c d e f); print length("@ar"), "\n";'
11
0601nobodyさん02/09/04 22:06ID:???
ディレクトリーを削除したいのですが、中にファイルが有るので消せません。
一気に消す方法はないでしょうか?ご教授頂けないでしょうか?
0602名無しさん@Meadow02/09/04 22:18ID:rtiaBVOu
>>601
$ perl -e 'system("rm -rf ./dir");'

./dirってとこは、消すディレクトリのパスを入れてね。


0603nobodyさん02/09/04 22:25ID:???
>>602
そう言う方法があるのですがね。
ご教授ありがとうございます!
060460102/09/04 22:33ID:???
CGIで使うのですが、それだと使用できませんですた・・・(´・ω・`)
0605名無しさん@Meadow02/09/04 22:35ID:rtiaBVOu
>>603
>そう言う方法があるのですがね。
~~
逆説の「が」ですか?
だったら、
$ perl -e 'use File::Path; rmtree ("./dir");'
060660102/09/04 22:42ID:???
>>605
そういう意味じゃないです(;´Д`)

そちらもダメでした・・・
logフォルダーに 1 と言うフォルダーがあり、
その中に、0.log 1.log ・・・ 10.log
と言うファイルが有るので、それをフォルダーごと消したかったんです。
説明が悪かったのかも知れませんが・・・
0607名無しさん@Meadow02/09/04 22:50ID:???
>>606
>そちらもダメでした・・・
perl5でしょ?
libディレクトリにFileモジュールが入ってないってこと?
考えがたい。
じゃスクリプトミス?
use File::Path;
rmtree("./dir");
ってちゃんと書いた?
じゃファイル属性を確認してちょ。

0608nobodyさん02/09/04 22:55ID:???
>>607
書き間違えでした、コピペで逝けました
アリガトン
0609nobodyさん02/09/04 23:08ID:???
>>608

シネ
0610nobodyさん02/09/05 01:33ID:???
>>608
シネ
0611nobodyさん02/09/05 04:56ID:???
web用のCGI作ってるんすけど。
\r\nって\nにしちゃダメなんすか?
特に動作に問題は見当たらないしファイルサイズも削れるんで\nでいきたいんすけど。
それとも不都合な環境とかあるんでしょうか。
0612名無しさん@Meadow02/09/05 05:34ID:???
>>611
改行は、<br>で表すんだから、別に構わんです。
ただ、編集環境がwindows(MS-dos)なら、普通、¥r¥nが自動的に
つくんですが。いちいち変換するの?
061361102/09/05 05:48ID:???
>>612
改行コード自体いまいち理解できてないんですすんまそん。とりあえず
print "Set-Cookie: $cookie\r\n";
とか
print "Content-type: text/html; charset=EUC-JP\r\n\r\n";
とかの\r\nを\nにしちゃまずいんかなと思ただけ、というか
\nでいけるならなんでわざわざ\r\n使ってるんだろうとか思ってみただけれす。
レスどうもっした。
0614名無しさん@Meadow02/09/05 06:01ID:???
>>613
http://tohoho.wakusei.ne.jp/wwwxx011.htm
0615名無しさん@Meadow02/09/05 06:12ID:???
ってゆうことで、613さんのは、htmlファイルの
出力だから、問題は起こらないね。
0616611、61302/09/05 06:16ID:???
>>615
多謝。
0617T女の竹田02/09/05 11:51ID:sI+RlSZg
>>613
ftp://ftp.nic.ad.jp/rfc/rfc1945.txt
The line terminator for HTTP-header fields is the sequence CRLF.
However, we recommend that applications, when parsing such headers,
recognize a single LF as a line terminator and ignore the leading CR.

(訳)HTTPヘッダ領域の行末区切りはCRLFの並びです。しかし、アプリケーションが
そのようなヘッダを読み取るときは、単独のLFを行末区切りとして解釈し、続くCRを
無視することをお勧めします。

というわけで、実際問題LFだけでも問題はまずないだろうけど、正式には
CRLFだよ。
0618T女の竹田02/09/05 11:52ID:???
訂正
続くCR→前のCR
0619ゆゆ02/09/05 12:03ID:FN8hs1rs
CGIチェックする際、サーバで perl -wc やってます。

エラーで
70行目に @Iとあるけど\@Iにするべきというエラーがでるのだけど
そんなものどこにも書いてないです。
いままで行数があってないなどありましたが、@Iというもの自体が
ない場合のエラー場所がわかりません。

何か特有の字が @Iとなったりしますか?
0620nobodyさん02/09/05 12:17ID:???
ソース見せろ、バカ。
0621nobodyさん02/09/05 13:53ID:???
全角空白
062261302/09/05 13:58ID:???
>>617
\nを使うって事はアプリケーション側のサービスに甘えるってカンジすか。
とりあえずCGIを公に配布とかしたりしない限りは
こっそり\n使っちゃってもいっか、と解釈。
0623nobodyさん02/09/05 14:11ID:???
\r\n
だとWindowsサーバーで動かすときとか、おかしくなることがある。
062461302/09/05 14:18ID:???
>>623
むしろ\nのが概ね安全な罠すか。
0625nobodyさん02/09/05 14:24ID:???
\x0D\x0A
のように16進数でCRLFを表すのがいいらしい。

Windowsでの改行はCRLFだから、\r\nで出力してしまうと\r\r\nになってしまう罠。
062661302/09/05 14:29ID:???
世の中は罠がいっぱいだなや。
0627 02/09/05 14:39ID:???
掲示板の書き込みの中の、半角の数字を全角に変換。
または、その逆の変換を選択できるようにしたいです。
0628名無しさん@Meadow02/09/05 14:55ID:???
javascriptつかうと半角(全角)しか受け付けないようにできるYO.
0629nobodyさん02/09/05 16:18ID:FN8hs1rs
CGI内にジャバスクリプトってそのまま使えるの?
>>EOF 内にHTMLのほうで使ってるまま持って来たら
InternalServerErrorに・・・。
ジャバスクリプト取ったらエラーは起こらないのだけど。
0630 ◆4XfSMGTg 02/09/05 17:47ID:???
>>625>>629
( ´,_ゝ`) プッ
0631 ◆4XfSMGTg 02/09/05 19:52ID:???
>>630
初心者わらってんじゃねーよ。
初心者をあざ笑うスレでも作ってそこでやってくれ。

解っているのなら教えてやって下さい。
初心者同士で嘗め合うことから先に進めません。

>>629
Java Script はクライアント側で動作しますので、
Perl 文法エラーの可能性が高いと思われます。
0632nobodyさん02/09/05 20:13ID:???
>>629
ジャバスクリプト内に半角「@」があるんでしょうね。ほぼ間違いなく。
0633nobodyさん02/09/05 20:18ID:???
>>632
激しく同意
0634nobodyさん 02/09/05 21:34ID:???
>>630-631
何の意味があるんでしょうか・・・
0635kusokote ◆4XfSMGTg 02/09/05 21:42ID:???
>634
◆4XfSMGTg はオープントリップ kusokote
630 と 631 は別人。
0636nobodyさん02/09/05 22:27ID:CVMgCTHS
textareaに書かれた文字列を.txtに出力するものを
初めてperlでCGIを書いてみたんですが動きません。
どんな原因が考えられますか?

#!/usr/local/bin/perl
require "./jcode.pl";
$object = $ENV{ 'QUERY_STRING' };
open (FILEOUT, ">./xxx.txt");
print FILEOUT @object;
close (FILEOUT);
exit;
0637nobodyさん02/09/05 22:32ID:???
>>636
$object にデータ入ってても
@object にはなにも入ってないように思うが。
0638nobodyさん02/09/05 22:35ID:???
デコード処理が行われていない。
jcode.pl が使われていない。
GETで受け取るため文字制限がある。
0639nobodyさん02/09/05 22:45ID:???
掲示板の過去ログをlogというフォルダの中に1.html 2.html〜、というふうに収納してるんすよ。
フォルダ内のファイル数を数えて、その数+1を新規の過去ログのファイル名にしてるんすよ。
でも、そうすると既に存在するファイルを削除した場合、当然やけどファイル数が減ってしもて
ファイル名がかぶってしまうんすよ。
何か良いファイル名の付け方知りまへんか。
ご教授よろしくお願いします。
0640nobodyさん02/09/05 22:50ID:???
フォルダ内のファイル数を数えるのではなく、別にカウントしとけば。
064163902/09/05 22:57ID:???
>>640
書き込みボタンを押した回数をカウントするとかですか?
もっとスマートなやり方あればよろしこ頼みます。
0642nobodyさん02/09/05 23:04ID:???
>641
空きが見つかるまでリピートぶん回して
open(OUT, "./log/日付とか$i.html");
0643nobodyさん02/09/05 23:08ID:???
ファイル名を日付にするとか。
0644nobodyさん02/09/05 23:11ID:???
>>643
ソレダ!
064563902/09/05 23:16ID:???
なるほどいろいろあるもんですのぉ。
0646T女の竹田02/09/05 23:55ID:???
>>627
半角全角は面倒だね。Perlでやると大抵Shift-JISとかで送られてきた
文字列を処理することになるから文字の境界で苦労する。
>>628さんの言うとおり、JavaScriptでやるのがいいと思う。

ちょっと書いてみた。板違いだけど…

<form OnSubmit="txt=mainForm.messageArea.value;
while (txt.match(/[0123456789]/))txt=txt.replace(/[0123456789]/,
'0123456789'.charAt('0123456789'.indexOf(RegExp.lastMatch)));
mainForm.messageArea.value=txt;">

これで全角→半角が一応IE6ではできた。他は試してない。
mainForm.messageAreaは好きに変えてね。
064763602/09/06 00:15ID:GoSqrpgT
cgi-lib.plを用いてgetではなくpostにして、改行処理らしきものをつけ無事解決しました。
けれどデコードっぽいことをしてませんが、半角カナいれたりしても何も問題がありません。
のちのちまずいことになりますかね?
0648 ◆XUwkgSoY 02/09/06 00:20ID:???
>>647
>半角カナいれたりしても何も問題がありません。

EUCで書いてるからカシラ
0649nobodyさん02/09/06 00:22ID:+YKj9Zdt
>>646
俺はJAVAscriptで入力制限てどうも気に入らないんだけどどうよ?
ユーザビリティーを考えてjavascriptの入力チェックを書くことあるけど
クライアントでチェックってどうも設計上よろしくないと思っている俺。
065063602/09/06 00:37ID:GoSqrpgT
>>648
はい EUCで書きますた
0651nobodyさん02/09/06 00:37ID:???
>>611,617,625
ここはPerlスレだからCGIと仮定するのもおかしいかもしれないけど、
「CGIでParsed headers」なら規格上 LFのみ か、 CRLF のどちらかです。
http://hoohoo.ncsa.uiuc.edu/cgi/out.html

もうちょっと詳しく言うと、CGIのヘッダというのは
HTTPサーバが解釈して、HTTPヘッダを生成するためのものなので、
フォーマットは一緒ですがHTTPのヘッダとは別物と考えるべきです。

蛇足で、NPHの場合はそのままクライアントに渡されるので、
当然CRLFにする必要があります。
■ このスレッドは過去ログ倉庫に格納されています