トップページ⇒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あたりを見よう。
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にする必要があります。
065265102/09/06 00:38ID:???
なんか変な文だ。ごめん
0653 ◆XUwkgSoY 02/09/06 00:43ID:???
>>650
EUCで書いてあると半角カナは化けないにょろ。
何故かmacで書きこまれるとたまに化けるけど。そんときはjcodeかな。
0654初心者以下02/09/06 00:44ID:DvbQB/jN
教えてください。
自分のHPに素材サイトで手に入れたJavaゲーム(9面パズル)を
置いてみたのですがサーバーにアップしてDLすると
何故か遊べなくなってしまいます。
(2枚目、3枚目の画像が表示されない。タイムカウントが動かない
 ゲームが始まらない)
絵を置き換えたからかな、と思い試しに
加工を加えずアップしてみましたがやはりダメでした。
ftpでアップしているのですがコレが原因なのでしょうか?
初心者ですんません。
javaは2日前に知りました。
素材サイトのゲーム http://www18.big.or.jp/~neon2/bunkatu/usa9.shtml
0655nobodyさん02/09/06 00:48ID:???
>>654
板違い
それに、それはJavaではなくJavaScriptだ
0656nobodyさん02/09/06 00:48ID:???
2apeとかの掲示板を携帯対応にはできるのでしょうか?
0657nobodyさん02/09/06 00:50ID:???
>>656
君の腕次第
0658nobodyさん02/09/06 00:59ID:???
>>657
教えてください。
0659 ◆XUwkgSoY 02/09/06 01:03ID:???
>>658
$ua=$ENV{'HTTP_USER_AGENT'};
if($ua=~/UP.Browser|DoCoMo|J-PHONE|ASTEL|PDXGW|L-mode/i){

あとはお好きに
0660nobodyさん02/09/06 01:11ID:???
>>659
PDXGW|L-modeって…
0661nobodyさん02/09/06 01:12ID:???
>>659
すごく初心者なのですがそれをどうしたらいいのでしょうか?
0662 ◆XUwkgSoY 02/09/06 01:16ID:???
>>660,659
ttp://specters.net/cgipon/labo/c_dist.html
ここの内容を要約して見たつもり。
0663T女の竹田02/09/06 01:16ID:???
>>649
うん、セキュリティから言うとJavaScriptじゃ何もしてないのと同じだしね。
この場合みたいにおまけみたいな機能ならいいかなと思った。
0664 ◆XUwkgSoY 02/09/06 01:17ID:???
もとい
>>660,661だ
0665 ◆AMaff.3Q 02/09/06 01:23ID:???
unkooooooo
0666 ◆XUwkgSoY 02/09/06 01:25ID:???
>>661
まずは携帯から掲示板にアクセスして、
うまく動作してない箇所があったら>>659の方法で処理を振り分ける。
一応うちではそうしてるにょろ。
0667nobodyさん02/09/06 03:28ID:???
サブルーチンの事で質問ですけれども。
ぶっちゃけスクリプトのどこに置くのが一番効率いいんでしょうか。
とにかく先頭の方でしょうか
はたまた最下部でしょうか
それとも呼び出す直前でしょうか
どこでもいっしょでしょうか
というかなるべく使わないほうがいいんでしょうか
自分では調べられないので教えてくださいまし。
0668nobodyさん02/09/06 03:50ID:???
変わらないから気にしなくて良し
066966702/09/06 03:51ID:???
はい
0670名無しさん@Meadow02/09/06 05:32ID:dZ6p0Gwt
>>646
IE5.5ではできんかった。というよりINPUT TYPEとかも書いてほしい。

>>649 よく理解できんです。
サーバーのデータベースに直接アクセスするとかソースを見られて
はいけないものは、CGIだけど、それ以外は、なるべくサーバーに
負荷がかからないクライアントサイドのJavaScriptで処理した方が
いいのでは。
まあ、JavaScriptをOnにしてくださいと書くのは面倒というのはある。
テキストブラウザとかだとJavaScriptできないし。あとJSのバー
ジョンとかNSとIEの違いによるサポート状況の違いとか面倒。

>>627 もう来ないか。textareaだかで受け取ったデータの中の
全角<->半角変換スクリプト:

$input = "012344567899012";
@zenkaku=('0', '1','2','3','4','5','6','7','8','9');
@hankaku=('0','1','2','3','4','5','6','7','8','9');
$sw = 1;
if ($sw == 1) {
&zen_han(\@zenkaku,\@hankaku);
} else {
&zen_han(\@hankaku, \@zenkaku);
}
sub zen_han {
my ($A, $B) = @_;
for $i (0 .. 9) {
$input =~ s/@$A[$i]/@$B[$i]/g;
}
}
print $input, "\n";
0671nobodyさん02/09/06 06:55ID:HPly/0Dw
cgiは今回初めてです。アクセス制限の仕方を教えて下さい。
0672nobodyさん02/09/06 06:59ID:???
>>671
http://www.google.co.jp/search?q=%83A%83N%83Z%83X%90%A7%8C%C0%82%CC%8Ed%95%FB
0673nobodyさん02/09/06 07:04ID:???
和鳥で、KENTのWebPatioを使ってます。
regist.cgiの中の
unlink("$logdir$in{'no'}\.cgi");
unlink("$logdir$in{'no'}\.dat");
なのですが、unlinkでエラーを返してきます。
和鳥だとunlinkは使えないのでしょうか?
0674nobodyさん02/09/06 07:14ID:???
掲示板が昨日まで動いていたのに急に動かなくなりました。
早くどうにかしてください。
0675nobodyさん02/09/06 07:20ID:???
>>673
板違いかな
http://pc.2ch.net/perl/
こっちちゃう
0676nobodyさん02/09/06 07:23ID:???
>>674
板違いかな
http://natto.2ch.net/denpa/
こっちちゃう
067762702/09/06 14:32ID:???
>>670
サンクス
0678nobodyさん02/09/06 15:15ID:???
PerlでのCGIなのですが、スクリプトの負荷を数値化する方法はないですか?
0679T女の竹田02/09/06 17:31ID:???
>>670
文字境界…。
$input = "浮P";
とかにすると化けちゃうよ。
0680ぱぴぷぺ02/09/06 17:41ID:UnlQ9r36
なんとかPerlで動的に画像をブラウザに表示させたろう
と考えてるんだけど、モジュールとか使わない場合、
XBMつーーのがあるのを知ったのですが、
これはモノクロのみカラーは絶対ダメ?
0681nobodyさん02/09/06 18:28ID:???
>>680
>動的に画像をブラウザに表示
なら、Location、binmodeで吐く
「動的に作成した画像をブラウザに表示」
なら、GDが無難か?ファイルにもよるか…
0682nobodyさん02/09/06 18:31ID:???
xbmは白黒のみ
xbm,xpmはIEで表示できたっけ。
0683名無しさん@Meadow02/09/06 20:35ID:???
>>679
perlによる日本語の扱いはeucにするのが常識。
0684T女の竹田02/09/06 23:09ID:???
>>683
ごめん。ついSJISで考えてた。
EUCなら、
$input="横井";
だね。
0685 02/09/06 23:30ID:???
while (!mkdir($hoge, 0705)) { mkdir "$hoge", 0705; }
これってどんな意味があるんですか?
0686nobodyさん02/09/06 23:31ID:???
$hogeがパーミッション705で製作されるまで繰り返す。
■ このスレッドは過去ログ倉庫に格納されています