Perl コーディング初心者質問コーナー Part33
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
04/03/01 02:46ID:1GeWO7LH【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0893nobodyさん
04/04/03 20:52ID:???0894nobodyさん
04/04/03 20:56ID:???http://search.cpan.org/src/JBAKER/Apache-Session-1.6/Session/Generate/MD5.pm
0895nobodyさん
04/04/03 22:08ID:???session
>>892
これはどう?
http://search.cpan.org/~mwx/Data-Uniqid-0.11/Uniqid.pm
0896nobodyさん
04/04/04 00:50ID:???できるだけ簡単に共有するにはどうしたらよいでしょう。
モジュール内の関数を呼ぶたびに、その変数を渡すのは面倒なので。
0897nobodyさん
04/04/04 05:30ID:movQ3eovそのファイルを変数$aに入れ、"05"が入っている別の変数$bとの比較を行いました。
if($a eq $b)と言う感じなのですが、真の場合の処理が実行されません。
printしてみると、$aと$bにはちゃんと"05"が入っています。
ファイルにも改行を含まずに"05"とだけ入っているのですが...
ファイルの読み書きを勉強したばかり何ですけど、何が悪いのでしょうか?
0898nobodyさん
04/04/04 05:36ID:???0899nobodyさん
04/04/04 06:17ID:???chompもやってみました。
その前にsplitでも改行コードを削除してみたのですが、やはり元々入っていません。
何か初歩的なミスだとは思うのですが....
0900nobodyさん
04/04/04 06:27ID:qQjuTTgf0901nobodyさん
04/04/04 07:15ID:???my $a = '05';
my $b = 05;
debug_dump("a" => $a);
debug_dump("b" => $b);
exit;
sub debug_dump
{
my ($name, $value) = @_;
print $name, ' = ', join(' ', map{ unpack('H2', $_) } split(//, $value)), "\n";
}
こんな感じでヘキサダンプとってみそ。
0902初心者
04/04/04 10:42ID:dd7frEOF$date = '2004/3/24 13:43:18'
という日付の文字列から年・月・日を 2004、3、24 というように分解して、それぞれを
変数($year、$month、$day)に代入したいのですが、どうすればいいのかご教授
お願いします。
0903nobodyさん
04/04/04 10:46ID:???>885-887
0905nobodyさん
04/04/04 10:50ID:PukJ0Xr/CGIを置いてるサーバーから別のFTPが動いてるサーバーへFTPを使って
ファイルをアップロードするCGI(Perl)を
tp://x68000.startshop.co.jp/~68user/net/ftp-1.html
を参考にして作ってます。
FTPサーバー$ftp_hostに接続し、$local_dirにある$local_fileを
ファイル名はそのままでFTPサーバー上の$ftp_dir上にアップロード
するために以下のようなスクリプトを組んだのですが、うまくアップロードされません。
アップロードできるようにするにはどうしたらよいのでしょうか?
そもそも、CGIスクリプトが置いてあるディレクトリとは違うディレクトリ$local_dir
においてあるファイルをアップロードする方法がよくわかりません。
ちなみに設置しているサーバーではrootでなく一般のユーザーアカウントしか
使えないので、モジュールは標準で組み込まれてるようなものしか使えません。
ご教授願います。
use Socket;
$local_dir = "for_upload"; # 転送元ファイルが置いてあるディレクトリ
$local_file = "test.txt"; # 転送元ファイル名
$ftp_host = "aaa.bbb.com"; # 転送先サーバー
$local_ip = "local.xxx.com"; # 転送元サーバー
$ftp_dir = "/home/hoge/test"; # アップロード先のディレクトリ
$ftp_user = "user"; # 転送先サーバーのアカウント名
$ftp_passwd = "password"; # パスワード
(つづく)
0906905
04/04/04 10:51ID:PukJ0Xr/$port = getservbyname('ftp', 'tcp');
$addr = inet_aton($ftp_host);
$sock_addr = pack_sockaddr_in($port, $addr);
socket(COMMAND, PF_INET, SOCK_STREAM, 0);
connect(COMMAND, $sock_addr);
select(COMMAND); $|=1; select(STDOUT);
print COMMAND "USER $ftp_user\r\n";
print COMMAND "PASS $ftp_passwd\r\n";
for ( $data_port=5000 ; $data_port<65536 ; $data_port++ ){
socket(DATA_WAITING, PF_INET, SOCK_STREAM, 0);
setsockopt(DATA_WAITING, SOL_SOCKET, SO_REUSEADDR, 1);
if ( bind(DATA_WAITING, pack_sockaddr_in($data_port, INADDR_ANY)) ){
last;
}
}
listen(DATA_WAITING, SOMAXCONN);
$local_sock_addr = getsockname(COMMAND);
($local_port, $local_addr) = unpack_sockaddr_in($local_sock_addr);
$local_ip = inet_ntoa($local_addr);
$local_ip =~ s/\./,/g;
printf COMMAND "PORT $local_ip,%d,%d\r\n",$data_port/256,$data_port%256;
print COMMAND "CWD $ftp_dir\r\n";
print COMMAND "STOR $local_file\r\n"; # 問題の箇所?
close(COMMAND);
0907nobodyさん
04/04/04 16:13ID:???その変数が変更される場合があるのかどうかで考え方が変わってくるような気もするが。
とりあえず、$main::hoge で直接アクセスするのはあかんの?
もしくは一度各パッケージの変数にコピーしておくか。
というか、
>モジュール内の関数を呼ぶたびに、その変数を渡すのは面倒なので。
本当に渡すたびに必要なら OO インタフェースにして、オブジェクトが
持つべきだと思うんだがね。
FOO::func1($bar);
FOO::func2($bar);
の代わりに、
$obj = new FOO $bar;
$obj->func1();
$obj->func2();
0908nobodyさん
04/04/04 16:14ID:OYMBylAsCGIを作っていただいたのですが、うまく動かなくなってしまいました。
YYYYMMWというファイル名(2004年4月の第2週の場合は2004042.html)に飛ぶようになっていて
毎週月曜日の午前3時に切り替わるようにしてもらいました。
今日の場合は、2004041.htmlに飛ぶはずが、2004040に飛んでしまいます。
どこを直せばいいか教えてください。以下がソースです。
0909908
04/04/04 16:15ID:???$uri = 'http://www.hoge.com/';
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$mon++;
$weekth = int($mday / 7);
$weekth++;
$weekth-- if ($wday == 0);
$weekth-- if ($hour < 3 && $wday == 1);
$weekth = 1 if($mday == 1);
$mon = sprintf("%02d", $mon);
$year += 1900;
print "Location: $uri$year$mon$weekth.html\n\n";
exit;
0910908
04/04/04 16:18ID:???0911nobodyさん
04/04/04 16:29ID:???ちゃんとそのページを読みましょう。
とくに「FTP クライアントはクライアント兼サーバ」の部分を
理解していますか?
ファイル名を指定しても勝手にファイルが送られるわけじゃありません。
肝心のデータの受け渡し部分(DATA_WAITINGによる通信)がごっそり抜けてます。
そもそも、STOR で指定するファイル名はサーバ側で保存するための
ファイル名でローカルのファイル名じゃないです。
ttp://x68000.startshop.co.jp/~68user/net/ftp-5.html
までしっかり読んで理解するべきでしょう。
これ以上は FTP プロトコルの話になるので、コーディングスレだとスレ違いと
言われるような気がします。
0912908
04/04/04 16:36ID:???0913nobodyさん
04/04/04 17:17ID:???一週目の日曜と月曜朝三時までは前の週になるので[0]になっているので
これを[1]にするとか前の月にするとかしたらいいだけ
0915nobodyさん
04/04/04 18:25ID:???> $weekth = int($mday / 7);
ここを
$weekth = int(($mday-1+($wday-($mday-1)%7)%7)/7);
> $weekth = 1 if($mday == 1);
ここを
$weekth = 1 unless($weekth); # 一週目月曜日午前三時以前の対策
0916908
04/04/04 18:26ID:???またまたお助けを。
$weekth = 1 if($mday == 1); を以下のように書き換え。
if($weekth < 1) #第0週 = 前月最終週
{
$weekth = 5; #第五週=28日から31日
if(--$month < 1) #0月=前年最終月
{
$year--; $month=12;
}
}
0918nobodyさん
04/04/04 18:30ID:???Internal Server Error なんていう原因の特定もできないメッセージじゃなくて、
ちゃんとPerlの出すエラーメッセージを読むべし。
0919nobodyさん
04/04/04 18:32ID:???とりあえず、x月1日が月曜日である場合の午前3時までの処理が曖昧だが。
とりあえず前月最終日扱いとしてあんまり自信がないがこんな感じ。
$time = time;
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time);
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time-24*60*60) if ($hour < 3); # 午前3時前は前日扱い
$mday += 12 - (($mday +6 -$wday) % 7); # 第1日曜が 13 になるよう補正
$weekth = int($mday/7);
$mon = sprintf("%02d", $mon+1);
$year += 1900;
print "Location: $uri$year$mon$weekth.html\n\n";
>>913
>これを[1]にするとか
これやると第1週が7日以上になるわけで。
0920nobodyさん
04/04/04 18:41ID:???>>916
コピペして全角空白が入ってるに 1 票。
>>913
>>919 を補足しとく。
×これやると第1週が7日以上になるわけで。
○これやると第1週が8日以上になるわけで。
そもそも、>>909 のコードでも 4/1 は第 1 週になってたと思われるので、
ことはそう単純ではないのです。
0921908
04/04/04 18:44ID:???すみません、エラーメッセージの出し方がわからなくて。
ちょっとググってみましたが、わかんらなくて。
>>919
ありがとうございます。これも試させていただきます。
とりあえず>>915さんのようにしたら、今のところ普通に動いてます。
いろいろとアドバイスをいただけて、大変ありがたいんですが、
最終的にどうするのがベストなのかわからなくなってしまいました。
0922908
04/04/04 19:02ID:???これは元のファイルの$uriの下の行〜printまでを置き換えればいいんですよね?
どうもエラーになってしまいます。
>>920
おっしゃるとおり全角スペースでした。で、動いたんですが、
なぜか2003045.htmlに飛んでしまいました。
0923nobodyさん
04/04/04 19:04ID:???my $uri = 'http://www.hoge.com/';
my ($hour, $mday, $mon, $year, $wday) = (localtime(time()-60*60*27))[2..6];
my $weekth = int(($mday-1+($wday-($mday-1)%7)%7)/7);
printf("Location: %s%04d%02d%1d.html\n\n", $uri, $year+1900, $mon+1, $weekth+1);
exit;
# 一週目月曜日午前三時以前は前の週に入れる場合。
0924923
04/04/04 19:07ID:???URIの例示には、rfc2606に従いhttp://www.example.com/等を使いませう。
0925908
04/04/04 19:12ID:???ありがとうございます。これまたエラーになってしまいました。
なんででしょう?
どうしたらいいかますますわかんなくなってきました。
今のところ、最初のものを>>915さん修正したものが正常に動作しているので
それを使わせてもらおうと思ってます。
0926919, 920
04/04/04 19:15ID:???違った。日数の問題じゃないや。
各週の日曜で後戻りしておかしくなるので 1 箇所だけ対応しても駄目ってことね。
>>921
> すみません、エラーメッセージの出し方がわからなくて。
ぐぐってみた。
↓「evalとdieを使って例外処理をしよう」
ttp://www.mellowtone.org/perltip1.html
> 最終的にどうするのがベストなのかわからなくなってしまいました。
んー、別に正しく動くならどれ使ってもいいと思うけど、
> とりあえず>>915さんのようにしたら、今のところ普通に動いてます。
今日だけ、じゃなくて自分の望む挙動かいろんなパターンで確認しておくべきだと思う。
1 日が日曜の場合に、1 日も 2 日も第 1 週になってるっぽいけど?
>>922
>これは元のファイルの$uriの下の行〜printまでを置き換えればいいんですよね?
そう。Perl の吐くエラーが欲しいところ。
とりあえず↑やるか、ローカルにも Perl 入れてそこで試してみない?
あと、>>916 のコードは多分おまいさんの望む挙動をしない。
0927nobodyさん
04/04/04 19:16ID:???エラーの理由が全角スペースとかだったとしたら、アドバイスくれた人に失礼だよ。
0928nobodyさん
04/04/04 19:31ID:???0929nobodyさん
04/04/04 19:34ID:???0930908
04/04/04 19:40ID:???会社の鯖でやってます、ごめんなさい。
Macなんですが、ローカルに入れるというのがわからなくて。
実はHTMLさえもそんなに知らない状態です。
0931908
04/04/04 19:52ID:???動きました。本当に失礼しました。
原因は、MacOSXで半角のエンマークがバックスラッシュに化けることがあって
それをそのまま最後の行でコピペしていたためでした。
本当に申し訳ありませんでした。
仕事関係のアドレスでここには晒せないのですが、きちんとお礼をいい、
どこで使っているのか報告したいので、
>>926さん、よろしければメールください。
本当にありがとうございました。
0932nobodyさん
04/04/04 19:54ID:???管理者からゴルァされる前にさっさとやめたほうがいいよ。
ていうか、ローカルでの動かし方も分からん奴がCGIに手を出すんじゃない。
0934919=920=926
04/04/04 20:09ID:???こりゃどうもご丁寧に。
一応 >>923 をぱくりつつ最終版をさらしてみるよ。
#!/usr/bin/perl
my $uri = 'http://example.com/';
my ($mday, $mon, $year, $wday) = (localtime(time() - 3*60*60))[3..6];
my $week = int(($mday+12-(($mday+6-$wday)%7))/7);
printf "Location: %s%04d%02d%1d.html\n\n", $uri, $year+1900, $mon+1, $week;
>>932 は確かに正論だし、今回はネタが面白そうだったからやってみたけど
本来は↓のスレの方がふさわしいかもね。
【 スクリプト改造依頼スレ 】(丸投げ)
ttp://pc5.2ch.net/test/read.cgi/php/1076831972/
0935885
04/04/04 20:27ID:???無事できました。どうもです。
引き続き質問すいません。
以下の書き方、まちがってます? エラーはでないんですが
画像が全部に表示されてしまう・・。
if ($n == 55) {$icon = 1 ;}
else {$icon = 0 ;}
この間にprintで文字記述後。
if ($icon = 1) {print "<IMG src=\"./img/icon.gif\">" ;}
else {print " " ;}
0937935
04/04/04 20:32ID:???すいません。ほんとーですね。
申し訳なさ杉です。
(´Д`)
0938nobodyさん
04/04/04 20:32ID:???$icon == 1 が正解。
$icon = 1 では、1を代入してそれを評価してしまう。(1なので必ず真になる)
もうちょい基礎をしっかりな。
0939935
04/04/05 00:27ID:???0940nobodyさん
04/04/05 00:29ID:???0941935
04/04/05 00:30ID:???0942本物935
04/04/05 01:05ID:???煽りどぉもです。
いや、まじで単純にミスってました。
936・938さん、感謝です。
(´Д`)ウヘェ・・
0944935
04/04/05 03:23ID:???つーか、インタプリタは糞
これ、周知の事実ね
0946nobodyさん
04/04/05 15:42ID:???0947nobodyさん
04/04/05 15:42ID:???レス数が950を超えています。1000を超えると書き込みができなくなります。