【Perl】初心者コーナー Part19
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/01/11 13:52ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
あとは>>2-10にまかせた。
0202vvv
03/01/18 16:09ID:+GEyyv8c★YAHOOOプロフィール★
0204nobodyさん
03/01/18 17:08ID:lJXENDzT和鳥の無料WebスペースにCGIのカウンタを置こうと思い、探して来ました。
見つけてきたそのCGIは、説明書きによるとcgi-bin以下に画像ファイルを置いて、
それを引っ張り出してくるものらしい。
けど、和鳥には、「セキュリティ上の都合から、cgi-bin以下に画像ファイルを置いても
表示されないので、別の場所に置いてくれ。」との旨が書いてあり、そのままではうまくいかなかった。
そこで、画像ディレクトリを別の場所へ移したわけなのですが、、、えーと、そしたら
「$imgdir = './Gif/';」の部分は、このままではダメなのでしょうか?
試しにそのままやってみたらエラーになったので、省略せずにURLそのまま入れてみたりしたのですが、
やはりだめでした。
画像自体はちゃんとうpされていたので、私的にはその部分になにか間違いがあるのかなと
思ったのですが。。
どしたら良いでしょうか。すいません、どなたか教えて下さいです。
0205nobodyさん
03/01/18 17:11ID:???1:パスが間違っている(HTMLの勉強しろ)
2:パーミッションが間違っている(パーミッションの勉強しろ)
3:そもそもperlの話じゃないからココではスレ違い(常識を勉強しろ)
4:配布元か、和鳥スレで聞け
0206nobodyさん
03/01/18 17:15ID:???#!usr/local/perl も不安といえば不安だな
>>204
URLで入れたら動きそうな気がするが、大文字小文字は間違ってない?
ここで言ってるURLは http:// から始まるやつね
0208204
03/01/18 17:26ID:???エラーフラグ立てた上で、オブジェクトを返しておいて
is_error,error_message等のメソッドを用意するってのは?
0213nobodyさん
03/01/19 06:35ID:5v4SEFP4@hoge$iっていう配列を使いたいのですがうまくいきません。
0214nobodyさん
03/01/19 06:49ID:???@{$i}
0216nobodyさん
03/01/19 08:26ID:???@{"hoge$i"}
0217nobodyさん
03/01/19 14:09ID:???その場合、これを書くとエラーが出なくなる
no strict 'refs';
0218貧乏パーラー
03/01/19 14:37ID:???>-----------------------------------------------
>・読み出しも外部からのインクルード式で可能とした
>・処理速度向上策バイトコード化した一連の定義を繰り返しで処理から
> do{}でそれぞれくくって一つのブロックとして一気にバイトコードに展開版に変更。
>・出力スキップSWにて定義中の式の組み方でコンバートバージョンにも出来るcnv.txt
> ○のオーダはXXXX.txtで処理する。
> 前回俺が出した集計項目も網羅して7日間のデータを/m指定で
>各人分散し集計を起動する事にする.
>その間に出力CSVを合成するツール作成の事。(Excelでやれってかぁ?)
>-----------------------------------------------
>て訳で連日プログラムして疲れたよ。今晩ラーメンでも食べに行こうか?
何をやったのかさっぱりだけど、、、
なんか私には解らない凄いプログラム作ったのかな?
でも歳も歳なんだから無理しないようにね!
ラーメンか〜良いね。でも肉が食べたいな〜
わがままです。。。
0219質問させてください。
03/01/19 15:30ID:???CGI::Liteを継承して、より直感的なクエリ取得を行えるモジュールを書こうとしているのですが、
キーと値が対になっていないクエリに対応する部分で困っています。
通常、クエリは正規表現風に書くと、m/KEY=VALUE(&KEY=VALUE)+/
という形式になっていると思うのですが、
http://localhost/cgi-bin/hoge.cgi?KEY=VALUE (通常のケース。無問題)
http://localhost/cgi-bin/hoge.cgi?VALUE
↑
この二番めのケースで、簡単にVALUEを取得する方法がわからないのです。。。
とりあえず、「パラメータが一種類で値が無いケース」を想定し、
以下のようにやってみました。
(前略)
my $param = $this->parse_form_data();
my @key;
print $key[0] if (((@key) = (keys %{ $param })) == 1 && $param->{$key[0]} eq '');
ただ、これだと
http://localhost/cgi-bin/hoge.cgi?VALUE
http://localhost/cgi-bin/hoge.cgi?KEY=
二つのケースに反応してしまうため、望んだ結果にはなりませんでした。
何かKEYと対になっていないVALUEを取得するための、
スマートな方法はありませんでしょうか。
0220nobodyさん
03/01/19 16:17ID:???...
}
0222nobodyさん
03/01/19 17:24ID:???0223nobodyさん
03/01/19 17:26ID:YTKbQL3jサイトA(私が作成するサイト)にあるCGIページにアクセスすると
別のサーバのサイトBにあるファイルをそのまま読み込んで表示するCGIを作ろうと
しています。
(もちろん、サイトBの管理者の許可はあります。)
その準備として次のものをつくったのですが、
ローカルで実行するとうまくいくのですが、サーバーにアップすると動きません。
ローカルホストのところを
自分のPCのものにしても、サイトAのホスト名をいれてもうまく動きません。
原因がわかるでしょうか?
お願いいたします。
#!/usr/local/bin/perl
use Net::hostent;
use Socket;
$lodalhost='hogehoge.ne.jp';#ローカルホスト名
$remotehost='www.xxxx.com';#リモートホスト
$page = 'http://www.xxxx.com/index.html';#得たいページのURL
0224続き
03/01/19 17:26ID:YTKbQL3j$lh = gethost($localhost);
$rh = gethost($remotehost);
$proto = getprotobyname('tcp');
socket(SH,AF_INET,SOCK_STREAM,$proto) or print "error\n";
$port = getservbyname('http','tcp');
$socket_template = 'S n a4 x8';
$localhost_port = pack($socket_template,AF_INET,0,$lh->addr);
$remotehost_port = pack($socket_template,AF_INET,$port,$rh->addr);
bind(SH,$localhost_port) or print "error\n";
connect(SH,$remotehost_port) or print "error\n";
select SH;
$|=1;
print SH "GET $page\n";#GETをつかってリクエストを送信する。
#得られたページの内容を@HTMLに代入する
while(<SH>){
push @HTML,$_;
}
close SH;
select STDOUT;
foreach(@HTML){
print $_;
}
exit;
0225貧乏パーラー
03/01/19 17:47ID:???>print SH "GET $page\n";#GETをつかってリクエストを送信する。
少なくともリクエストヘッダの終了は\n\nで終わらなきゃならいないと思うが
ちなみに他のヘッダ情報は要らないのかな?
例
GET /test/read.cgi/company/1034689226/l50 HTTP/1.0
If-Modified-Since: Mon, 13 Jan 2003 17:35:10 GMT
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.m
s-powerpoint, application/vnd.ms-excel, application/msword, */*
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: tmp.2ch.net
0226貧乏パーラー
03/01/19 17:51ID:???例えば2chのちくり板のサーバはGETリクエストヘッダのHost:や
POSTのRefere:中のホスト名をチェックしているからね。
0227nobodyさん
03/01/19 18:20ID:xgcJy6Dhcgiの画像アップ形式掲示板ってありますよね?
サーバーの容量もあるとは思いますが、大体みなさん設置
するに当たって"最大投稿データ量"ってどれくらいに設定されてますか?
後"最大投稿数"はどれくらいで適切なんですか?
変な質問ですみません。
0228bbb
03/01/19 18:44ID:TK7ESc1CYAHOOO情報
0230nobodyさん
03/01/19 22:37ID:hs+tYJ37cgi-binの中にhtmlファイルを入れると呼び出すことができません。
また、public.htmlの下にhtmlファイルを置き、cgiからのパスを修正しても"ファイルがオープンできません"とでます。
こういうサーバではhtmlを使うcgiは置けないのでしょうか?
0232nobodyさん
03/01/19 23:44ID:???PerlをつかったCGIならCGIの質問だってOKだろ。
PerlからMySQL呼び出してどーこーするのっていいんじゃないの。
まぁ230の質問はPerlともCGIとも直接関係なさそうだが。
0233おながいします。
03/01/19 23:56ID:tLwHArOBlocalhostではちゃんと起動するのですが、niftyのサーバに上げると
自分がスクリプト内で指定したメッセージ、
「現在投稿ができない状態になっております。」
が出ます。絶対パス($targetfile=以下) の書き方が悪いのでしょうか?
この箇所は考えられ得る色々な書き方(URLにするとか)で書き替えて
試しましたがダメでした。
問題点を教えて頂ければ幸いです。
ちなみにhomepageというのはniftyのホームページ設置ディレクトリ名です。
下のスクリプトはもちろん関係箇所だけですがその途中も省略しています。
#!/usr/local/bin/perl
$|=1;
require "cgi-lib.pl";
$date = localtime;
$workdir = "/temp/";
$targetfile = "/homepage/messageboard/1.html"; #絶対パス
$guestbookurl ="http://homepage2.nifty.com/aaabbbccc/messageboard/1.html";
$body = $in{'body'};
$name = $in{'name'};
$mail = $in{'mail'};
(略)
open WORKF, ">$tempfile"
or &CgiDie("現在投稿ができない状態になっております。");
open GUESTBOOK, "<$targetfile"
or &CgiDie("現在サーバが投稿を受け付けません。");
0234nobodyさん
03/01/20 00:04ID:???wakwakのページをみると、imageファイルはpublic_htmlの下に置くようにって書いてあるね。
htmlでもいけそうな気がするけど、もし画像ファイルしかCGIから読み出せないってことなら
そのhtmlを画像ファイルの拡張子に変えてみたら?
それでダメだったら問題は他にあるってこと。
>>233
ちゃんとソースみてないけど、ディレクトリのパーミッションの問題じゃない?
0235おながいします。
03/01/20 00:26ID:???ディレクトリのパーミッションも変更してみましたが、以前同じ
エラーメッセージが出てしまいます。
あ、ちなみにさっき書いたスクリプトで省略してしまった所があるの
ですが、それは
$tempfile = $targetfile;
$tempfile =~ s/[:\/\\]/_/g;
$tempfile = $workdir .$tempfile . $$ . ".tmp";
です。宜しくお願い致します。<(_ _)>
0236nobodyさん
03/01/20 01:00ID:???それはないか…。
0237nobodyさん
03/01/20 01:07ID:???OKでしたっけ?
$workdir = "./";
にしてみるとか。
0238nobodyさん
03/01/20 01:46ID:???$tempfile の最終形をみてみる。
すたぁと。
$targetfile = "/homepage/messageboard/1.html"; #絶対パス
$workdir = "/temp/";
$tempfile = $targetfile;
#$tempfile = "/homepage/messageboard/1.html";
$tempfile =~ s/[:\/\\]/_/g;
#$tempfile = "_homepage_messageboard_1.html";
$tempfile = $workdir .$tempfile . $$ . ".tmp";
#$tempfile = "/temp/_homepage_messageboard_1.htmlPID.tmp";
#PIDはプロセス番号
>>237 氏の仰有るとおりにしると、
#$tempfile = "./_homepage_messageboard_1.htmlPID.tmp";
♥
とりあえず。
0239nobodyさん
03/01/20 15:53ID:emhs1xhaあるファイルoutput.txtの内容が次のようだったとします。
02あいうえお
01あかさたな
00かきくけこ
このファイルの先頭に1行つけたして、
03たちつてと
02あいうえお
01あかさたな
00かきくけこ
としたいのですが、どうすればいいでしょうか?
ファイルの末尾に付け足すのはかんたんなのですが・・
seek(OUT,0,0);をやて書き込んでも、一部、上書きになって
消える部分があるし 困っています。
0241239
03/01/20 16:05ID:emhs1xhaありがとうございます unshiftを調べたところ
配列を扱うもののようです。いったん配列に取り込まないと
いけないということでしょうか?そうだとすれば
while(<IN>) {
$mes .= $_;
}
print OUT $newmes . $mes;
とするのと同じで、メモリをくってしまいますので、
だめっぽいです。
0242nobodyさん
03/01/20 16:39ID:???$txt = 'output.txt';
$tmp = 'output.tmp';
open TXT, '<' . $txt or die $!;
open TMP, '>' . $tmp or die $!;
print TMP $new_line;
print TMP $_ while <TXT>;
close TMP;
close TXT;
rename $tmp => $txt or die $!;
0243nobodyさん
03/01/20 16:39ID:???この質問は過去に何度か出ていた気がする。
その時の回答は確か
*書きこむ時は普通に追記して、読み出すときにreverseかける
*テンポラリファイルを作ってリネームする
の二つ。
前者は読み出す時に配列に入れなきゃならないし、
後者は排他制御が面倒な予感。
もっと良い方法があるなら俺も知りたい。
0244nobodyさん
03/01/20 16:39ID:???output.txt.tmp を新規作成する。
output.txt.tmp に新たな1行のみ書きこむ。
output.txt を読み込む。
output.txt.tmp に追加書き込みする。
output.txt を削除する。
output.txt.tmp を output.txt に名前変更する。
ただし、output.txt.tmp がすでに存在するときは上記の操作を行わない。
で、どうだ!?
0245nobodyさん
03/01/20 19:16ID:gSzazTge少し間違ってるなぁ。
削除する必要はない。削除するとファイルが存在しない時間が少し発生するから良くない。
それから、存在チェックと書き込みは同時には行われないから、
O_EXCLを書いてopenするといいかもしれない。ファイルが存在したら失敗とする。
この方法の問題点は、中途半端な状態で残ったoutput.txt.tmpをどう扱うか、にある。
0246nobodyさん
03/01/20 19:43ID:8rfuT7oA半角全角問わずに一文字ずつ数えたいのですがどうしたらいいでしょうか
foreach(<LOG>){
@str1 = split //,;
$total += @str1;
}
0247劉邦
03/01/20 20:09ID:QoYi51kG0249nobodyさん
03/01/20 20:53ID:???検索して探せ。
いいか悪いかは自分で見て判断するしかない。
他人にいいサイトが自分にいいとは限らない。
>248
入門は別のところでしてほしいぞ。
HellowWorld!から教える気か?
0250劉邦
03/01/20 20:54ID:QoYi51kGのサイトの問6.2はどうやるんですかね・・?address.txt.つくって
実行してみたんですけど、アドレスが表示されないんですよね・・・
我慢できなくなって、解答を参照したところそう違いはなく、その
解答をコピーしてやってみたんですが、それもうまくいきません。
何が原因だと思いますか?
0253nobodyさん
03/01/20 21:56ID:???解答ではaddress.txtを標準入力から読み込むようになってるから、
単体で動作させたいときはファイルから入力するように修正しないといけないよ。
0254劉邦
03/01/20 22:12ID:QoYi51kG例えばどんなものがあるのですか?
0255劉邦
03/01/20 22:20ID:QoYi51kG0257劉邦
03/01/20 22:30ID:QoYi51kG入門者に対するイジメじゃないですかね・・・(^-^;A
0258nobodyさん
03/01/20 22:31ID:qfdWUXSE川o・-・)ノ <先生!こんなのがありました!
__/ / /
\(_ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄||
...|| ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/hiroyuki/
0259劉邦
03/01/20 22:39ID:QoYi51kG0260nobodyさん
03/01/20 23:43ID:???初めてのperl第一版そのままっぽいんだけど翻訳元とか全く書いてないし
訳されたと言う日付の時点で既に第二版すら出版されてるわけだが。
というわけで、サイトの中身そのものはそう悪くないぞ。
れっきとした書籍のほとんどそのままだからな(笑)
ま、当然本屋で本物を買ってきた方が良いけど。三千円ね。
0262nobodyさん
03/01/21 01:23ID:S5Xqr2nKお答えしてくれるとうれしいです。
開催日に合わせて発売するというものを作ってまして
時間チェックでわからなくなってしまいました。
発売前・中・締切と時間でフラグを立てて制限したいのですが
頭がこんがらがってなかなかできません。
$buyflag [0:発売前] [1:発売中] [2:締切]
現在の時刻をそれぞれ
[分:$min] [時:$hour] [日:$mday] [月:$mon] [年:$year]
とし、開催日時のデータを@daydataという配列に
それぞれ年[0]、月[1]、日[2]、時[3]、分[4]として入れています。
開催日時のちょうど3日前に発売開始[1:発売中]でそれより前は
[0:発売前]、開催日時の1時間前に[2:締切]としたいのです。
どなたか教えてくださいませんか?
0263nobodyさん
03/01/21 02:02ID:???わからなくなったら、紙に書いて整理しな。
頭の中だけでやろうとするからわからなくなる。
ここで質問したいなら、ソースくらい出しなさい。
0264nobodyさん
03/01/21 02:09ID:???日時は2桁で揃えられていると仮定して、
$opoentime = join("", @daydata);
$nowtime = "$year$mon$mday$hour$min";
if($opentime - $nowtime < 100){ $buyflag = 2;}
elsif($opentime - $nowtime < 30000){ $buyflag = 1;}
else{ $buyflag = 2;}
んーむ、感覚的に殴り書きヽ( ´ー`)ノ
0265nobodyさん
03/01/21 02:11ID:???失礼しました。
$opoentime = join("", @daydata); → $opentime = join("", @daydata);
0266nobodyさん
03/01/21 02:12ID:???の 1042260745 ってなんて言うんだっけ?>time();
これ使ったらなんも考えることないっしょ
開催日時 $tt = timegm(hoge);
発売開始 $tt - 60 * 60 * 24 *3
0268nobodyさん
03/01/21 02:43ID:???/ ̄ l | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
■■-っ < >>267 んな こたァない
´∀`/ \__________
__/|Y/\.
Ё|__ | / |
| У.. |
0269nobodyさん
03/01/21 05:29ID:???Perl ver5.8をインストールする。ActivePerlならbuild804.
以下は漢字コードをShift_JISとした例。
---^ t.txt
123456
---$
my $count;
open my $file, "<:encoding(Shift_JIS)", "t.txt";
while (<$file>) {
chomp;
my @char = split//;
$count += scalar(@char);
}
print $count,"\n";
0270nobodyさん
03/01/21 07:25ID:???if($a =~ /(aaa|bbb)/){⊂}
と同じように
if($a eq /(aaa|bbb)/){⊂}
という書き方はOKでしょうか?
0271nobodyさん
03/01/21 07:35ID:???NG。
正規表現の部分が、上は $a を評価するのに対して、下は $_ に対して評価した値と
$a を文字列として比較するので、わけわからん結果になる。
0272za
03/01/21 10:02ID:???EUCの日本語を、Unicodeの数値参照コード(???????;)に変換する
モジュールは無いでしょうか? それともUnicode-Japaneseで可能でしょうか?
0273za
03/01/21 10:05ID:???失礼。「&#??????;」です。(^^;
0274nobodyさん
03/01/21 12:45ID:f7zzet+E掲示板を作ったつもりなのですが、設置できても文字化けしてしまいます。
ブラウザで自動判別をしてもEUCを判別してもらえず、
手動でEUCにエンコードしないと書き込みが見えません。
本当に初心者なので、どこが悪いのかもわかりません。
書き込みが文字化けせずに見える方法はありますか?
作成したソースは
http://mc6800.dyn.dhs.org/UP_LOADER/UPFTP/IMG/MC6800P_253.txt
にあります。よろしくお願いします。
0275herm
03/01/21 13:07ID:???そのスクリプトが入ってるdirectoryに
「AddDefaultCharset EUC-JP」と書いた「.htaccess」を入れるとか。
0276274
03/01/21 13:13ID:f7zzet+Eいれてみたら出来ました!本当にありがとうございました!
0277246
03/01/21 14:09ID:NhrI/baVできました!!
jcode使ったりいろいろ悩んだのですがこれで解決しました。ありがとうございました。
0279262
03/01/21 15:03ID:???ありがとうです。
$nowtime = sprintf("%d%02d%02d%02d%02d",$year,$mon+1,$mday,$hour,$min);
$opentime = join("", @daydata);
if($opentime - $nowtime < 100){ $buyflag = 2; }
elsif($opentime - $nowtime <= 30000){ $buyflag = 1; }
elsif($opentime - $nowtime > 30000){ $buyflag = 0; }
else{ $buyflag = 2; }
0282nobodyさん
03/01/21 15:55ID:???0283nobodyさん
03/01/21 16:16ID:???0284nobodyさん
03/01/21 18:40ID:???自分も初心者ですが>274のスクリプトが気になったんで
設置してみたんですが、記事を投稿はできても記事の削除をすると
500 Internal Server Errorが出てしまいます。
どうすれば削除することができますか?
0285nobodyさん
03/01/21 19:34ID:???暇なんで試してみたが・・・おいおい、そのスクリプト作りかけ何じゃねーのかYO!
お○○チンが・・・ねえ!!
sub read_data
{
open(READ,"$datafile") || &error ('ファイルオープンエラー');
@data = <READ>;
close(READ);
}
sub write_data
{
open(WRITE,">$datafile") || &error('ファイルオープンエラー');
print WRITE @data;
close(WRITE);
}
でも追加しとけ!
後はしらねーーー
0286nobodyさん
03/01/21 19:57ID:owIuUjTB0287286
03/01/21 19:59ID:owIuUjTBネット上にある講座などの知識だけで上達できますか?
参考書がないと歯が立たないものなんですか?
0288nobodyさん
03/01/21 20:03ID:???あやしい言葉づかいだねぇ。
秀丸を使いこなしているのなら、もちろん十分でしょう。。
>>287
もちろんネット上のテキストだけで上達できる!
色々プログラミングしまくってくれ!!
0291nobodyさん
03/01/21 21:22ID:???参考書籍スレに逝ってください。
0292nobodyさん
03/01/21 21:25ID:???0293nobodyさん
03/01/21 21:35ID:???0294nobodyさん
03/01/21 21:44ID:???0295239
03/01/21 22:02ID:???根本的な解決法はなかったのですね・・・
現状ではtmpファイルをつかって行おうと思います。
作成しているものが携帯電話対応のルーム数不定の
チャットなので、高負荷なことは避けたかったのですが
どうせあんまり使う人はいないだろうからいいか っとおもいました
0296nobodyさん
03/01/21 22:14ID:???>作成しているものが携帯電話対応のルーム数不定の
>チャットなので、高負荷なことは避けたかったのですが
なんかサーバサイドとクライアントサイドの区別が未だに付いてない予感。
0298nobodyさん
03/01/21 22:20ID:???そういった時の返答は大体決まってる。
ファイルの先頭に追記するのではなく、ファイルの末尾に追記して、読み込みの時にreverseしろ。
0300nobodyさん
03/01/21 22:26ID:???0301nobodyさん
03/01/21 22:28ID:???0302239
03/01/21 22:49ID:???携帯電話側はdocomoのやつなのでjavaでiアプリを作ってます。
ある程度そっちができたので、次はサーバーサイドを作っています。
本当はサーバーサイドもjavaでいこうとしていたのですが、
今までperlを使ったことがあったのと、実装の簡単さでperlのcgiに
しました。
ファイルの末尾に追記してリバースする方法と
tmpファイルを作成する方法はどちらが効率がよいでしょうか?
チャットにおいて、
サーバー側に持っておくログを50行までと決めておけば、
リバースでよいかな
■ このスレッドは過去ログ倉庫に格納されています