トップページ⇒php
981コメント366KB

【Perl 】初心者コーナーPart6

■ このスレッドは過去ログ倉庫に格納されています
0001undefさん2001/07/26(木) 00:40ID:???
初めて来た方、初心者はまずこのスレッドから始めよう。
尋ねる前に同じ質問がないかこのスレや旧スレ、及び>>2のリンクを一通り見てみよう。
案外答えはもう書かれているかもしれない。
0748教えてさん01/08/29 21:14ID:ASEY3DfQ
ごめんなさい!
074972501/08/30 00:39ID:1xnqMYr2
>>744-745

目からうろっこっす!
そんな方法もあるのですね。
075072501/08/30 02:34ID:1xnqMYr2
スミマセン、度々。

local(@pairs) = split(/;/,$cookies);
てな感じでクッキーを分割しようとすると
perl -w でチェックしたとき

Use of uninitialized value in split at toarubbs.cgi line 411.

という警告が出ます。調べてみたのですが、どこが狂っているの
か皆目分かりません。一応通ってはいるみたいなのですが...

ご教授くださいまし。

# これだけの情報では分からないでしょうか?
0751JAPU@うぐぅ01/08/30 02:38ID:c4jBSiHQ
$cookies が undef (未定義) じゃないの?

事前に
$cookies = "" if not defined $cookies;
とかしておけば OK かも。:)

# undef と "" は異なります。
0752名無しさん01/08/30 04:54ID:zTjKOAyE
こういう事を実現する方法は無いでしょうか…。

$log ? print LOG <<EOF : print <<EOF;

ヒアドキュメントで…

EOF
0753名無しさん@お腹いっぱい。01/08/30 05:18ID:7tv.uuPE
>>752

$log ? print LOG <<EOF : print <<EOF;
ログあり
EOF
ログなし
EOF

# ↓個人的推奨

print length $log ? <<EX : <<NEX;
ログあり
EX
ログなし
NEX
075475201/08/30 05:48ID:zTjKOAyE
>>753
回答の通りやってみたら出来ました。そこまで思い付きませんでした…。
推奨の方を頭に入れます。ありがとうございました。
0755>75201/08/30 06:20ID:vlPtsTzA
どちらの場合も同じ内容を出力するというのであれば、
select LOG if $log;
print <<EOF;

....

EOF
select STDOUT if $log;
なんてのもアリですね。
075672501/08/30 11:02ID:pcbOuQ4U
>>751

うわ、JAPUさんだ、こんにちは。
すみません、前の行で

local($cookies) = $ENV{'HTTP_COOKIE'};

として、環境変数からクッキーを呼び出しています。
これでは$cookiesを定義したことにならないのでしょうか。
JAPUさんの教えてくださった方法でちと試してみます。
ありがとうございました。m(_ _)m
0757名無しさん@お腹いっぱい。01/08/30 11:08ID:vj7AVUwU
>>756
local が気になる。
0758名無しさん@お腹いっぱい。01/08/30 11:28ID:zG.eoWl.
すみません。とあるプログラムを見ていてわからない部分があるので
教えてください。ファイルテストしているところで
opendir(D,$dir)or dir;
$path=readdir(D);
if(-f $path){
処理
}elseif(-d _){
処理
}
の「_」の部分なんですが意味がわからないで教えてください。
本には最後のstatないしlstatの結果を参照って書いてあるんですけど
これってどんな意味なんでしょうか?直前(最後)ファイルテストをした物
と同じって意味でいいんでしょうか?(この場合$pathと同じってこと)
よくわからないので教えてください
0759名無しさん@お腹いっぱい。01/08/30 11:57ID:3TFNK/cI
>>758
$pathと同じです。
直前に実行したファイルテスト演算子の結果はキャッシュされるので、
もう一度 (-d $path) とするより効率がよくなります。
0760名無しさん@お腹いっぱい。01/08/30 12:52ID:psLhnlnE
>759さん
ありがとうございます。モヤモヤが解決しました!!
0761名無しさん@お腹いっぱい。01/08/30 13:00ID:5rfMNbvM
質問です
『現在の日付』と『入力した日付 例)2000-8-30』を比較し今現在の時間より未来だったら
エラーと表示したいのですが、ソースが全然わかりません。
今日の日付を取得するのはわかるのですが・・・

my ($sec, $min, $hour, $day, $mon, $year, $wdy, $yday, $isdst) = localtime(time);
$year += 1900;
$mon++;

print "ただいま$year年$mon月$day日 $hour時$min分$sec秒\n";
exit;

それと比較する方法がわかりません・・
誰かおしえてよ
0762名無しさん@お腹いっぱい。01/08/30 13:46ID:9ojiLY2w
>>761

sub is_future {
my ($b_year, $b_month, $b_day) = split /-/, shift;

require Time::Local;
return time < Time::Local::timelocal(0, 0, 0, $b_day, --$b_month, $b_year -= 1900);
}

foreach my $test_data (qw(
2000-8-30
2001-8-29
2001-8-30
2001-8-31
2001-9-1
)) { print $test_data; print ": エラー" if is_future($test_data); print "\n" }
0763JAPU01/08/30 13:51ID:c4jBSiHQ
>>756
変数は
・任意の文字列 (数字としても扱うことができる)
・リファレンス
・未定義 (undef)
のどれかをとる (他にあったっけ? 識者の補足をきぼーん) ので、
local($cookies) = $ENV{'HTTP_COOKIE'};
としても、$ENV{HTTP_COOKIE} が undef なら何もしない限り $cookies も undef なのです。
この場合は、
my $cookies = $ENV{HTTP_COOKIE} || "";
とするのがよいかな。
# 既に指摘がある通り、変数は可能な限り my で宣言するのが吉なりよ。
----
($iyear, $imon, $imday) = split /-/, $input_date;
$input_date = sprintf "%04d-%04d-%04d", $iyear, $imon, $imday;
$system_date = sprintf "%04d-%04d-%04d", $year, $mon, $day;
if($system_date lt $input_date) {
print "はにゃーん エラー\n";
}
0764T女の竹田01/08/30 15:03ID:UDHJh.zA
HTMLから実体参照形式Unicodeとふつうのアスキーテキストが混ざったのを
抜き出して、それからぜんぶUnicode(BE)に変換しようとしたんだけど、いい方法ないかなぁ?
$text =~ s/?(\d+);/pack('n',$1);/seg;
$text =~ s/[\x20-\x7e]/\0$&/sg;
最初↑みたいにしてやったら化けまくって、で中を見て「あ〜ばかじゃん」
と思って上下の文を逆にしてみると…さらに大惨事に…(当たり前)
工夫すればできるとは思うけど、「この正規表現で一発!」みたいなの
ないですか?
0765T女の竹田01/08/30 15:10ID:UDHJh.zA
↑あ。。
?(\d+)
は
&#(\d+)
です。。
076675201/08/30 16:56ID:FHx3lziU
>>755
わあ…。
selectの使い方、とても参考になりました。
嬉しい。遅くなりましたけど、ありがとうございます。
0767名無しさん@お腹いっぱい。01/08/30 18:02ID:KPteR7z.
質問!
掲示板を作ってるんですけど、ログファイル(bbslog.datとかuser.datとか)のファイルに
ブラウザから直接アクセス出来ないようにしたいんですけど、
みなさんどういう方法をとっていらっしゃいますか?
自分の貧困な発想で思いついたのは、ログファイルの拡張子を『cgi』にして、
Permission Deniedさせてしまうぐらいしか思いつかなかったんです(;_;)
0768名無しさん@お腹いっぱい。01/08/30 18:30ID:E9M3DAmo
それが簡単で1番良いと思う。ほとんどの環境で使えるし。
0769名無しさん@お腹いっぱい。01/08/30 18:32ID:pomXMsVA
あ、T女たんだ。。でも漏れは分かんないよ  ゴメソ

>>767
それで良いと思うよ。でもそれはスクリプト側でする事じゃ無いんで
考えなくてOK、public_htmlの外に置くとかhtaccess置くとか
デフォルトの名前を変える様にユーザーに呼びかけましょう。
それがやり易い様に変数の中に入れておくと親切かも。。。
0770名無しさん@お腹いっぱい。01/08/30 19:08ID:U7WzvMDs
URLの分解ってこれじゃダメなの?

例)http://corn.2ch.net/php/index2.htm?hogehoge=sage&....

@referer_box = split /?/,$ENV{'HTTP_REFERER'};
077176701/08/30 19:41ID:KPteR7z.
768さん、769さん、御教授ありがとうございます。
自分でも、他のディレクトリにシンボリックリンク 貼って
そこにデータ置いたりとかいろいろ四苦八苦してたんですけど、
そのやり方だと他の人に渡したときに、動かせないかもしれないので、
ここで質問させて戴いたしだいです。

やっぱり、拡張子をcgiにする方式でやってみます。
ただ、この方式だと下の問題点の方が残ってしまうんですよね。
改善される問題:ログファイル(パスワードを含む物など)を読まれる危険性がなくなる。
残っている問題:ブラウザからログファイルに直接に何度もアクセスをかけられると、
        ファイルロックされていないので、書き込みがミスってしまう。
ログファイルの名前がユーザーにばれる事は掲示板の弱点として、割り切るしか無いんでしょうか(;_;)
うぅ、長くなってごめんなさい。別に粘着レスでは無いんですー(;_;)
0772名無しさん@お腹いっぱい。01/08/30 20:06ID:TttdmJZY
条件によって出力FHを変えるなら
print { $foo ? *STDOUT : *STDERR } "HOGE\n";
っても使えるよ。

>>T女たん
perldoc -f packを見れば良いのでわ(折れは英語ダメだけど
pack 'u'とか(?)
0773名無しさん@お腹いっぱい。01/08/30 20:13ID:pomXMsVA
いや、だからそれはユーザ側の問題なんだってばさ
後はアクセス制限掛けるなりしてもらうしかないよ
cgi-bin以下の.cgi以外はwww権限で読めないサーバーとかも有るけど。。
.hthogehogeとかやっとくと結構色んなサーバーで行けそう
0774725(=756)01/08/30 21:24ID:ytEa/Jb2
なるほど、この場合、未定義になるのですね。
いやぁ、勉強になります。

みなさんおっしゃっているように、local -> myにかえてみようと
思います。いろいろありがとうございました。
0775T女の竹田01/08/30 21:54ID:FAiia3.6
自己レスですが、結局あきらめて、ループで回して前の方から切り出して、別の変数に
追加していって普通に?やりました。
最初からこうしてたらよかったかも。。こういうのって「正規表現でできるはず!!」って
思いこんでたけど、結局正規表現じゃ無理なのかな?
0776名無しさん@お腹いっぱい。01/08/31 01:18ID:0YV4ebqc

LWP::UserAgent をつかって、クッキーを受け取って、
次のリクエストでそのクッキーをちゃんと返してやるってのをやってるんですが、
受け取るまでは、出来たのですが、ちゃんと返すことが出来ません。
どうすればいいでしょうか?
cookie.txtには、ちゃんと情報は保存されています。

#!/usr/bin/perl
use LWP::UserAgent;
require HTTP::Cookies;



my $ua = LWP::UserAgent->new(cookie_jar => 1,);
$ua->agent('Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
$ua->cookie_jar(HTTP::Cookies->new(file => "./cookie.txt",AutoSave => 1,));

$target = 'http://www.foo.ne.jp/';

my $req = HTTP::Request->new(GET => "$target");
$res = $ua->request($req);
if ($res->is_success) {
print $res->content;
} else {
print $res->status_line;
}
0777名無しさん@お腹いっぱい。01/08/31 02:22ID:15D5/wj6
デリミタで質問。
みなさん、ログファイルに記録するのにデリミタは何にしてますか?
おいらは、\376で区切ってます。
0778名無しさん@お腹いっぱい。01/08/31 02:43ID:f1g.yh7k
いきなりですが、CGI設置者のftpソフトのお勧めを教えてください
0779名無しさん@お腹いっぱい。01/08/31 02:47ID:15D5/wj6
>>778
lftp
0780JAPU@腰が痛い...01/08/31 06:33ID:hOKxRgGg
こんな感じで処理するのはどうでしょう?
Unicode は良く分からないので具体的な変換処理は書きませんが。

s{(?:\&\#(\d+);|([\x20-\x7e])|(.))}{
if(defined $1) {
"[$1]";
} elsif(defined $2) {
"<$2>";
} else {
"($3)";
}
}seg;

----
私は less などで見やすいように、コンマかタブで区切っています。
0781名無しさん@お腹いっぱい。01/08/31 11:23ID:NujA9c4g
初心者プログラマーなんですが、プログラムを書いていてこんなプログラムを
書いたんですが意味がこんがらがって分からなくなってしまいました。
if($host !=~ /$basename/)の!=の部分なんですがこの場合
「$hostに$basenameがなければ真を返す」って意味ですよね?
そしたらif($host !~ /$basename/)も同じ意味ですよね?
でもプログラムを走らせると「!=~」は真を返して[!~]は偽を
返してくれるんですが・・・・頭が混乱してきた。。教えてください。
0782名無しさん@お腹いっぱい。01/08/31 12:00ID:pfDOYTd.
>>781
まず、!=~ という演算子はありません。
$host !=~ /$basename/ がどう解釈されるかというと、
$host != ( ~/$basename/ )
という感じです。
で( ~/$basename/ )では、まず /$basename/ を、
$_にマッチさせる正規表現と解釈します。
たぶんそれで0が帰ってそれが ~ 演算子に渡されます。
~0 は 4294967295 ですので、この時点で、
($host != 4294967295) という感じになります。
もちろん、$host は 4294967295 じゃないでしょうから
全体として真が返ってきます。
ちなみに、
$host !~ /$basename/ と同義なのは、
!($host =~ /$basename/) です。
こういう間違いは -w オプションで perl を実行することで
簡単に見つけられますよ。
078378201/08/31 12:04ID:pfDOYTd.
日本語変なのは気にしないで。
078478101/08/31 13:30ID:gxfm2mi2
>782さん
ありがとうございます。わかりました。。「-w」つけたら一発でエラーが
でてきてわかりました。。説明ありがとうございました。
0785T女の竹田01/08/31 13:35ID:4Heibauk
>>JAPUさん
うまくいきました!ありがとうございます。
↓こんな感じです。
$text =~ s{(\&\#(\d+);)|([\x0-\x7e])|(.)}{
    if(defined $1) {
        pack('n',$2);
    } elsif(defined $3) {
        "\0$3";
    } else {
        '';
    }
    }seg;
078672501/09/01 00:51ID:u.d.epnc
皆さんに教えていただいたように、my で書き換えました。
そしたら、jcode.plで、

&jcode'convert(*send_msg_body,'jis');
#$send_msg_bodyはローカル変数として、my で宣言しています。

のようなコンバートができなくなってしまいました....。
どうすれば、ちゃんと変換できるようになるのでしょう。

ホントに厨な質問でスミマセン。
078772501/09/01 01:02ID:u.d.epnc
調べてみたのですが、

jcode::convert(\$send_msg_body,'jis');

でOKなのでしょうか...
0788名無しさん@お腹いっぱい。01/09/01 01:02ID:3b6idtJ.
jcode::convert(\$send_msg_body, 'jis');
0789名無しさん@お腹いっぱい。01/09/01 01:03ID:3b6idtJ.
遅かったか(w
それでOKです。
079072501/09/01 01:31ID:u.d.epnc
>>788-789

ありがとうございました。
今使っているjcode.plのドキュメントには載っていなかった
のですが、最新版のjcode.plに使い方が書いてありました。
0791、01/09/02 05:33ID:4hoKlkq6
parlじゃないのですがhtmlでクリックした際サイトが
飛び出すようにするには如何したらいいのでしょうか?
0792名無しさん@お腹いっぱい。01/09/02 05:48ID:/fL4q/kI
>>791
豆腐を喉に詰まらせて氏ね
0793はじめたばかり01/09/02 09:01ID:T1M6nn4M
いつも楽しく拝見してます。
いまテキストカウンターを作っていて、なんとか作ることができたの
ですが、ファイルを2つに分けて1つのファイルがロックされているときは
もう1つのファイルに書き込みという形にして、同時アクセスでファイルの破損を
防ぐと同時にカウント漏れを防ぐようなカウンターをつくりたいのですが
1つのファイルがロックされているときにもう1つのファイルの方にカウントを
増やすようにするにはどの関数をつかえばよいのでしょうか?
まだはじめたばかりであまりよくわかりません。自分的にはfor文かと思ったのですが
どうも違うような気がします。
もしよろしければ皆さんの知恵を借りられればと思います。
お願いします。
0794名無しさん@お腹いっぱい。01/09/02 10:07ID:/vkcvuzE
>>793
基本がなってない。
ここでコードを書くのは簡単だが理解せずに使っても意味がなかろう。
とりあえず参考書籍スレで評判の良い本を買うのをすすめる。
0795名無しさん@お腹いっぱい。01/09/02 14:18ID:TsnMUyQQ
>>793
ファイルの数を好きに設定できるようにすると耐久度が増しますね。
がんばってください。 うまくいけば絶対に破損しないロック方式になります。
0796名無しさん@お腹いっぱい。01/09/02 15:29ID:lAk/mI7A
お前 のら だろ!  (ワラ
0797名無しさん@お腹いっぱい。01/09/02 15:43ID:3zvuzTqo
>>796
なつかしー
うけた!
0798名無しさん@お腹いっぱい。01/09/02 17:49ID:EuE1F3p.
はは、monaloveさん??のflock講は勉強になったなぁ  (^^
0799名無しさん@お腹いっぱい。01/09/02 18:04ID:YqVc4g/k
print "〜";
でHTMLを書き出し、HTML中で外部のjavascriptや、CSSファイルを使いたいのですが、
読んでくれません。

print "<STYLE TYPE=\"text/css\">\n<!--\n";
open(IN, "***.css");
print while (<IN>);
close(IN);
print "\n//-->\n</style>\n";

こうするしかありませんか?
とほほのperl入門はよく読んだのですが、特にこれに関係しそうなことは
書いてありませんでした。

よろしくお願いします。
0800名無しさん@お腹いっぱい。01/09/02 18:14ID:79Ih1PPk
>>799
print "<LINK rel=\"stylesheet\" href=\"./base.css\" type=\"text/css\" media=\"screen\">";
これでいいじゃん
0801名無しさん@お腹いっぱい。01/09/02 18:23ID:YqVc4g/k
>>800
ありがとうございました。
CSSのほうは読んでくれました。
でもまだjavascriptのほうが動きません。
<script language=\"JavaScript\" src=\"***.js\">
</script>\n"
これではまずいでしょうか?
0802名無しさん@お腹いっぱい。01/09/02 18:28ID:H3IIufEo
>801
板違いカエレ!
http://tohoho.wakusei.ne.jp/js/write.htm#jsfile
0803名無しさん@お腹いっぱい。01/09/02 18:37ID:YqVc4g/k
>>802
language=\"javascript\"が悪かったみたいですね。
これが書いてあっても、CGIで書いたのではないHTMLでは
ちゃんと参照してくれるんですよ。

帰れといいつつ、javascript質問スレではなく、目的のページにリンク
してくれていて、親切ですね。ありがとう。
0804名無しさん@XEmacs01/09/02 23:20ID:.hTQgQWM
#!/usr/bin/perl

use DBI;
use strict;
use CGI;
use Date::Calc qw(Today Add_Delta_Days);

#パスの設定
my $nkf = '/usr/local/bin/nkf';

#オブジェクトの生成
my $q = new CGI;

#出力文字コードの設定
open HTML, "|$nkf -s";
select(HTML);
$|=1;

#html表示
print $q->header(-expire=>'now');
print $q->start_html(-title=>'bbs',-bgcolor=>'#DDDDDD');
print "掲示版";
print $q->hr;
print $q->start_form(-method=>'POST',-action=>'./bbs2.cgi');
print $q->textarea(-name=>'msg',
-rows=>3,
-column=>16);
print "<br>\n";
print $q->submit(-name=>'submit',-value=>'submit');
print $q->end_form;
print $q->end_html;
close(HTML);
0805名無しさん@XEmacs01/09/02 23:24ID:.hTQgQWM
804みたいに書いて掲示版作ろうとしたんだけど、
日本語で掲示版とブラウザ表示しようとすると
internal server erorがおきます。
perl -c bbs2.cgi
では、
Global symbol "$B7G" requires explicit package name at bbs2.cgi line 22.
bbs2.cgi had compilation errors.
といわれるので、文字コードがおかしいみたいなんですが、
どうしたらなおりますか?
0806名無しさん@XEmacs01/09/02 23:25ID:.hTQgQWM
ちなみにこれはi-mode用の掲示版をつくってみてるんですが、
パソコンのブラウザで表示しようとするときに起こるエラーです。
i-modeはためしてません。
0807名無しさん@XEmacs01/09/02 23:33ID:.hTQgQWM
さらに
open HTML, "|$nkf -e";
としても結果は同じです。
0808名無しさん@お腹いっぱい。01/09/02 23:34ID:q3o1psmo
>>806
@@ -19,7 +19,7 @@
#html表示
print $q->header(-expire=>'now');
print $q->start_html(-title=>'bbs',-bgcolor=>'#DDDDDD');
-print "掲示版";
+print '掲示版';
print $q->hr;
print $q->start_form(-method=>'POST',-action=>'./bbs2.cgi');
print $q->textarea(-name=>'msg',
0809名無しさん@XEmacs01/09/02 23:37ID:.hTQgQWM
本当だ。できました。なぜですか?
0810初心者2号01/09/02 23:40ID:rbOW5x.6
皆さんこんにちは。
がいしゅつかもしれませんが、教えてください
入力フォームで電話番号など半角数字の入力のみに限定させたいのですが、
どうしたらいいでしょうか?
0811名無しさん@お腹いっぱい。01/09/02 23:42ID:H3IIufEo
>>810
if($tel =~ /\D/){&error('半角数字のみです');}
0812名無しさん@お腹いっぱい。01/09/02 23:52ID:q3o1psmo
>>809
多分元のスクリプトは JIS Code で書いているかと思うのですが
問題なのは「掲示板」という文字列がバイト列としてどう表現
されているかという事です

> echo '掲示版' | nkf -j | hd

とかすれば分るかもしれませんが, 「掲示板」をバイト列レベルで見ると
$B7G と見なせる部分が含まれるので " で囲まれてると変数を展開しようとして
エラーになります

別解として元のスクリプトを EUC に変換しても大丈夫だと思います
0813名無しさん@お腹いっぱい。01/09/03 01:42ID:3oz.BmnQ
かちゅしゃログ→dat変換スクリプトを作りたいのですが、
$line =~ s/,/<>;/g;
$line =~ s/<b>//g;
$line =~ s/</b>//g;
をして、外部へのリンクは<a>タグを外して
自スレリンクの<a href="http://saki.2ch.net/test/read.cgi?bbs=
ana&key=988911584&st=7&to=7&nofirst=true" target="_blank">
を<a href="../test/read.cgi?bbs=
ana&key=988911584&st=7&to=7&nofirst=true" target="_blank">
という風にしたいです
どのように書けばよいでしょうか
0814名無しさん@お腹いっぱい。01/09/03 01:49ID:W9dhAgAc
>>813
$line =~ s/<a href="http:\/\/saki\.2ch\.net/../g;
$line =~ s/<a href="http.*?">//g;
とここまで考えて</a>の削除を忘れてたことに気付いた。
スマン。
081581401/09/03 02:02ID:W9dhAgAc
>>814
しかも間違えてるし・・・。
$line =~ s/<a href="http:\/\/saki\.2ch\.net/<a href="../g;
$line =~ s/<a href="http.*?">//g;
0816pp01/09/03 05:49ID:LMjVYZAM
h
0817test01/09/03 06:55ID:EfBvrGB.
test
081881301/09/03 22:38ID:XIk6iDJI
$lines[$i] =~ /<a href="(http:.*?)"/;
$url=$1;
$lines[$i] =~ s/<a href="http.*?<\/a>/$url/g;
解決しました
0819名無しさん@お腹いっぱい。01/09/04 01:34ID:jaQVJtkg
htmlファイルを取得するスクリプトを書いているのですが。。。
ファイル取得部分は人様のものやこちらのスレッドなどを参考にしてなんとか出来たのですが、

もし(たとえば hoge.html)をすでに取得していた場合
旧hoge.html→hoge.html.1
とりネームする、しかし hoge.html.1 がすでにある場合は hoge.html.2 にする
その後どんどん、.3 , .4 , .5 と増やしていく
という処理をしたいのですが書き方がわかりません
やりたいことはもし更新されていても消さずに残しておきたい、ということです

教えていただけるとうれしいです
0820 ◆GpSwX8mo 01/09/04 03:27ID:uLaYbm/k
>>819

#!/usr/bin/perl

use strict;

use constant BACKUP_LIMIT => 5;
use constant FILE_NO_SEPARATOR => '.';

my $html_file = 'hoge.html';

my $received_htmlstr = '<!DOCTYPE html ...';

if (-e $html_file) {
my $oldest = join(FILE_NO_SEPARATOR, $html_file => BACKUP_LIMIT);
unlink $oldest if -e $oldest;

for (my $i = BACKUP_LIMIT-1; $i>0; --$i) {
my ($before, $after) = map join(FILE_NO_SEPARATOR, $html_file => $_), $i, $i+1;
next if not -e $before;
rename $before => $after;
}
rename $html_file => "$html_file.1";
}

use IO::File;
IO::File->new($html_file, 'w')->print($received_htmlstr);

__END__
0821 ◆k4PcAe16 01/09/04 03:27ID:uLaYbm/k
>>819

#!/usr/bin/perl

use strict;

use constant FILE_NO_SEPARATOR => '.';

my $html_file = 'hoge.html';

my $received_htmlstr = '<!DOCTYPE html ...';

sub max { my $max = shift;
foreach (@_) {
$max = $_ if $max < $_;
}
return $max;
}

if (-e $html_file) {
my $file_format = qr/^\Q$html_file\E\.([1-9]\d*)$/;

require IO::Dir;
my $max_idx = max map { /$file_format/o; $1 } grep /$file_format/o, IO::Dir->new('.')->read;

for (my $i = $max_idx; $i>0; --$i) {
my ($before, $after) = map join(FILE_NO_SEPARATOR, $html_file => $_), $i, $i+1;
next if not -e $before;
rename $before => $after;
}
rename $html_file => "$html_file.1";
}

use IO::File;
IO::File->new($html_file, 'w')->print($received_htmlstr);

__END__
0822820,82101/09/04 03:31ID:uLaYbm/k
名前欄に #1, #2 と入れたら妙な文字が出てしまった。なんだろ?
082381901/09/04 03:41ID:jaQVJtkg
>>822 (820,821)
さっそくレスいただいて恐縮です
わかりやすく教えていただいてうれしいです ありがとうございました

>名前欄に #1, #2 と入れたら妙な文字が出てしまった。なんだろ?
----------------
1 名前:ひろゆき ◆NdKrQ0UM 投稿日:2001/08/09(木) 16:26 ID:OLqDn5LQ
というわけで、名前欄に#をいれて適当な文字列を入れると、
ひとりキャップが使える機能を足してみました。

ほえほえ#password
って感じです。

4 名前:ひろゆき ◆NdKrQ0UM 投稿日:2001/08/09(木) 16:32 ID:OLqDn5LQ
キャップがなくても、本人であるという証明になりますです。
----------------
という機能らしいです
ひとりキャップ 略して 「トリップ」と呼ばれているようです
0824pp01/09/04 04:11ID:BE/ASauk
すいません。
今、Active Perlをインストールして
早速拡張子.plにして、いろいろやろうかと
思っていたのですが、.plをダブルクリックすると
コマンド画面が出てきて、すぐに消えてしまいます。
これはなぜでしょうか?
問題無くインストールしたのですが・・・
0825名無しさん@お腹いっぱい。01/09/04 04:55ID:oDOAY7oI
>824
MS-DOSプロンプト開いて、コマンドラインで
perl hoge.pl
とか打つべし
0826pp01/09/04 05:08ID:BE/ASauk
>>825
わざわざレスどうもです。
コマンドまたはファイル名が違います
と、なってしまいます。
082782501/09/04 05:17ID:oDOAY7oI
>826
それperl.exeにパスが通ってないと思うんだけど
もしかしてpathの設定方法とか知らなかったりする?
だとすると説明が面倒なんで俺はパス(←笑うところ)
0828pp01/09/04 05:21ID:BE/ASauk
>>827
pathの設定方法知らなかったりします。
取り敢えず、検索してみます。
わざわざ有難う御座います。
0829結城杏奈01/09/04 08:43ID:WtCIi7QQ
ちょっと聞いてもよいかしら
ファイルをおコピーしたいんですけど出来るだけシステム依存
したくないのですわ。
`cp hoge hoe`なんてやるとゲイシなPCだとおキック喰らっちゃって
大変ですわよ
システムコールせずにファイルコピーする関数なんていうのは
ありませんかしら?

open (IN,"<hoge");
open (OUT,">hoe");
  while (<IN>){
  print OUT $_;
  }
これってなんだか田舎娘みたいでとってもアンニュイですの。。。。
0830名無しさん@お腹いっぱい。01/09/04 08:56ID:MBD3zVhI
>>829
ネカマは死んで。
0831名無しさん@お腹いっぱい。01/09/04 08:58ID:btJZCxgM
お前コード書くのかよっ! と言っておく  w
0832名無しさん@お腹いっぱい。01/09/04 09:02ID:SH4sstc2
いちお、File::Copyてなモジュールがありますがね。。。
use File::Copy;
copy("hoge", "hoe");
そのソース見ると、最初にシステム見分けてから、
それぞれ最適な関数(もちシステム依存ばりばり)を
呼び出してるつうしろものでっせ。
都会派のネカマちゃんにはお気に召さんかもな。
0833pp01/09/04 09:04ID:BE/ASauk
Windowsで普通にActivePerlをインストールすると
hello.pl をダブルクリックで
DOS窓起動→hoge.plが起動→hoge.pl終了→DOS窓終了→一瞬で窓閉じる
ってのはどうやったら、直るのでしょうか?

MS-DOSプロンプトのプロパティの
プログラム終了時にウィンドウを閉じる
のチェックは外しているのですが・・・
0834結城杏奈01/09/04 09:58ID:WtCIi7QQ
>>830 まー!
>>831 (ぽっ
>>832
ありがとうですの、なるべくシステムコールしない
&&標準モジュールをつかうなら田舎娘の出番になるのね
なんて中途半端なのかしら! やですわ
病的折衷主義のガラクタ出力機ですわ
でもそんなperlちゃんが楽しいですの。
かさねがさね感謝ですわ。
>>833
その問題はわたくしが通うバッキンガム高校のBBSでも
いつも書き込まれてますのよ。
わたくしは NTりすと ですけどDOSでの移動が面倒でしたら
さぎょうフォルダのうえで
explorerから右クリックでコマンドプロンプトを開く
と言うのはいかがかしら? 窓の手なんかにそう言う設定
があったとおもいますのよ。
あとはDOSのヒストリ機能なんてのを使うとちょっと便利ですわ
一度dirとかにゅうりょくした後にF1を押していくとよいですの
doskeyなんて検索すると、もうちょと便利かもですわ
0835名無しさん@お腹いっぱい。01/09/04 17:52ID:cTMkgC.w
板違いかもしれませんが
現在LinuxMLD5でperlをやっているのですが
最初の行にちゃんとした#!/usr/bin/perlといれているのですが
うまく実行されません。
which perlとかでやってもちゃんとあってるし、perl -vとかでも
インストールされていることが確認できます。
今はしかたなく実行前にプログラムの前にperlといれてやっていますが
面倒で仕方ありません。
これってどうやったら動作するのでしょうか?動かない原因が特定できません。
どなたか助けてください。
0836名無しさん@お腹いっぱい。01/09/04 18:02ID:LkqU29Ks
実行権限がないんだろ。
0837_gunzip01/09/04 18:31ID:E8XEZJvU
chmod +x script_name.pl
./script_name.pl
^^
0838名無しさん@お腹いっぱい。01/09/04 20:31ID:FOQJEj12
ねかまにちょっとワロタ 。。 病的折衷主義って何だっけか
>>835
同じく chmod 755 ./scriput_name.pl
0839名無しさん@お腹いっぱい。01/09/04 20:33ID:FOQJEj12
_gunzipたんおひさっ
Rubbish Lister か。。。   sage
084083501/09/04 21:50ID:2Iq0qb32
>chmod 755 ./scriput_name.pl
だめでした。
777でもだめでした。
何が原因なのでしょうか?
0841名無しさん@お腹いっぱい。01/09/04 22:05ID:FOQJEj12
何か変な文字コードなんじゃないの?
#!/usr/local/bin/perl --
↑ 一行目こうしたらどうなる?
0842名無しさん@お腹いっぱい。01/09/04 22:50ID:cFEUOiVA
っていうか、どんなエラーでてるんよ?
0843p01/09/05 04:33ID:sTSRf1BY
Missing braces on \N{} at C:\PERL\COPAL186\copal.tmp line 342, within string

↑すいませんがどう言う意味か教えて下さい。
0844名無しさん@お腹いっぱい。01/09/05 05:10ID:L1KgWH9s
>843
「"\N"の後にあるべきブレース記号が書いてねーぞ」と言われておる。
\N{hoge}はギリシャ文字なんかを出すためのエスケープシーケンスらしい。
詳しくはperldoc charnameを参照。
ていうかそんなもん使ってんの?"\n"のタイプミス?
0845p01/09/05 06:07ID:sTSRf1BY
>>844
申し訳ないです。解決しました。
わざわざレスどうもです。
0846名無しさん@お腹いっぱい。01/09/05 10:21ID:.KHO7txo
>>845
どう解決したか書かんかい(*゚Д゚)ゴルァ!
0847名無しさん@お腹いっぱい。01/09/05 11:37ID:wcZpsAAM
たぶんうまくギリシャ文字が出せたんだろう
■ このスレッドは過去ログ倉庫に格納されています