Perl 初心者コーナー Part24
■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ
03/06/07 22:30ID:GbQKLcPE【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0399nobodyさん
03/06/16 00:35ID:???755で作成されてしまいました。
ラクダ本を読んでみたところ
>数値MODEで指定したパーミッション(を現在のumask値で修飾したもの)を持つ
とあるのですが、umaskで修飾とはどういうことなのでしょうか?
原因の分かるかたがいらっしゃいmしたらよろしくお願い致します。
以下の様にやっています
mkdir( './dir', 0777 ) or die( "ディレクトリを作成できません\n" );
0400nobodyさん
03/06/16 00:56ID:???print umask; # 現在値
my $umask = umask 0; # umask を 0 にし、前の値を退避
mkdir ...
umask $umask; # 元に戻す
see also: http://www.google.co.jp/search?q=umask&hl=ja&lr=lang_ja
0403nobodyさん
03/06/16 01:49ID:DMh466I+$content =~ s/([a-zA-Z0-9\.\-\_]+@[a-zA-Z0-9\.\-\_]+)/<a href=\"mailto:$1\">$1<\/a>/g;
↑この正規表現で、$content内に”(sage@hoge.com)”(←カッコは全角)
という文字が含まれていた場合、最初のカッコ部分で文字化けしてしまいます
・・・というか、IEでは<a>タグの"<"部分が文字化けしてそれ以降の
</a>部分までのHTMLが表示されてしまい、NN6ではsage@hoge.comの前に
余計な文字がくっついたものにリンクが貼られている状態になってしまいます
文字化けせずに、”sage@hoge.com”だけがマッチするようにするには
どうしたら良いでしょうか?
0405nobodyさん
03/06/16 02:35ID:cMLQJvQF探し方が悪いのかもしれませんが…
ファイルオープン時に、対象ファイルがないと『Internal Server Error』が表示されるのですが、
このエラーの変わりにメッセージを表示、もしくはHTMLで作成したエラーページにジャンプ
させたいと思っています。
そこで、まずはメッセージの表示から挑戦したのですが、上手く行きません。
$fname1 = "ファイルのパス/ファイル名";
open(FILE, "$fname1") or die "File Open Error.\n";
open(FILE, "$fname1") || die "File Open Error.\n";
open(FILE, "$fname1") or &Error "File Open Error.\n";
open(FILE, "$fname1") || &Error "File Open Error.\n";
以上のどの方法でも『Internal Server Error』が表示されています。
ファイルのパス/ファイル名は、HTMLフォームに入力された内容を取得しているのですが、
存在するファイル名を指定すれば、正常にファイルの入力は行われます。
以上、説明の不備等あるかもしれないのですが、よろしくお願いします。
0407nobodyさん
03/06/16 03:22ID:X/Zl1g96バッファをクリアするにはどうすればいいのでしょうか?
0408nobodyさん
03/06/16 03:29ID:???レス有難うございます。
> sub Errorのほうではちゃんとヘッダとか出力してますか?
&Errorって、dieの代わりに使う…ってモノじゃ無いんですね…
どうも的違いの事をやってしまっているようですね。
もう少し勉強してから質問するようにします。
なんにせよ、解決に向かって一歩進んだような気がします。(気のせい?)
本当に有難うございました!
0409405
03/06/16 03:40ID:???下記のようにすることで、無事にエラーページに飛ぶ事が出来ました。
open(FILE, "$fname1") or &Error;
sub Error{
print "Location:エラーページのURL\n\n";
}
>>406さんにヒントをもらえたおかげです。有難うございました!
また、板汚し失礼いたしました。
0410nobodyさん
03/06/16 03:45ID:???これでどうだ?
文字化けしそうな時は、スペース1個入れてごまかしてみた。
$content =~ s|(?<=[\x81-\x9f\xe0-\xef][\x40-\x7f])([\w\.\-]+@[\w\.\-]+)| $1|g;
$content =~ s|([\w\.\-]+@[\w\.\-]+)|<a href="mailto:$1">$1</a>|g;
0411nobodyさん
03/06/16 04:06ID:???ごめん。間違い。
↓こうしないと失敗するかも。
$content =~ s|((?:[\x81-\x9f\xe0-\xef][\x40-\xfc])*(?:[\x81-\x9f\xe0-\xef][\x40-\x7f]))([\w\.\-]+@[\w\.\-]+)|$1 $2|g;
$content =~ s|([\w\.\-]+@[\w\.\-]+)|<a href="mailto:$1">$1</a>|g;
0412_
03/06/16 04:23ID:???0413nobodyさん
03/06/16 08:18ID:???Cとかjavaとか、Linux、word、一太郎などまであるわけですが、perlはなぜか
聞かない。
0414nobodyさん
03/06/16 08:44ID:???2003年6月16日(月)8:44
という文字列から
「6月16日(月)」と「8:44」
を取り出すにはどうしたらよいか教えていただけませんか?
よろしくお願いします。
0415nobodyさん
03/06/16 09:06ID:???$hiduke='2003年6月16日(月)8:44';
@hiduke=$hiduke=~m/(\d+月\d+日\(.+?\))(\d+:\d+)/;
print "@hiduke";
0416nobodyさん
03/06/16 10:42ID:QXmqryyphttp://www.dtek.chalmers.se/groups/icfpcontest/
これで優勝すると「無制限に自慢する権利」を得ることが出来ます。
http://slashdot.jp/developers/03/06/13/1610225.shtml?topic=58
0417nobodyさん
03/06/16 10:52ID:01UxcTvVエディタで見るとちゃんと改行されて見れますが
log.dat内でも改行される様に
するのはどすればいいのでしょうか
すんません。初歩的質問で
よきお知恵を
例えばこんなのです
$log = $ENV{'HTTP_REFERER'};
open(LOG, ">>./log.dat");
print LOG "$log\n";
close(LOG);
0418nobodyさん
03/06/16 11:04ID:???意味不明。
log.dat内でも見られるってどういう意味?
改行っつったら、文字コードの話か、<br>の話か。
ともかく落ち着いてわかりやすく説明してくれ。
0419nobodyさん
03/06/16 11:38ID:01UxcTvVすんません。ちょっと落ち着いてみます。
えーと
FTPとかでlog.datを落としてメモ帳で見る、もしくは
その場でメモ帳とかで開くとlog.datがバイナリなので
改行されず見難いです。
まあ普通にエディタ使えばいいじゃんと
言われればそうなんだけど
出来ないのかなぁ と
うぐ、なんか説明へただぽ
0420nobodyさん
03/06/16 11:41ID:???激しくスレ違いだな。
改行コードの問題だ。
素直にエディタ使え。
0421nobodyさん
03/06/16 11:43ID:???うむ、たしかにちとスレ違い。
まあ、どうしてもメモ帳が使いたいなら、SJISにして書き込むなり
なんなりしたまい。
果てしなく意味のない行為だとは思うが…。
0422nobodyさん
03/06/16 11:51ID:???バイナリ?だって、そこが勘違いの元じゃないかな。
HTTP_REFERRERは、飛んでくる前のページだから、普通のテキスト
ファイルのはず。改行コードがLFだけだとしても、windows PCだと
行がつながらないはず。Macだと?逆に、CRだけだと、windows PC
で見ると行がつながる。とっちか確かめて、
s/\r/\r\n/とか、s/\n/\r\n/とかすりゃいいんじゃ?
0423nobodyさん
03/06/16 11:53ID:???たくさんあるファイルの1行目だけ表示したいんですが、
perl -ne 'print if $. == 1;'
だと1つのファイルだけしか処理できないんで困ってます。
よろしくおながいします。
0425nobodyさん
03/06/16 11:57ID:AbGOHEQTすみません、普通にGETとはどういうことでしょうか…?
それが分からなくて困ってます。
0428nobodyさん
03/06/16 12:07ID:???http://www.google.com/search?num=100&hl=ja&inlang=ja&ie=Shift_JIS&safe=off&c2coff=1&q=perl+http+get&lr=lang_ja
0430nobodyさん
03/06/16 12:18ID:8IGausxnありがとうございます
0433nobodyさん
03/06/16 13:34ID:???$a = 0;
if (!$a)
真でいいんですよね。
では↓こういう式の時は
if (!($a==0 && $b))
変数が
$a = 1 $b = 1 の時は 偽
$a = 1 $b = 0 の時は 真
$a = 0 $b = 1 の時は 偽
$a = 0 $b = 0 の時は 偽
でいいのかなそれとも
$a = 1 $b = 1 の時は 真
$a = 1 $b = 0 の時は 真
$a = 0 $b = 1 の時は 偽
$a = 0 $b = 0 の時は 真
こっちでしょうか? よろしくお願いします。
0437nobodyさん
03/06/16 14:08ID:???自分で書いたものではなくて試そうにも中に実際中に何が
はいっているのかも解らず1つ1つ解決していこうとは思っているのですが、
検索したり、リファレンスみたりしてるのですが、こういった例が見当たら
なかったので質問しました。よろしくお願いします。
0439nobodyさん
03/06/16 14:32ID:???ローカルにテスト環境を作って試す。
これ常識。
マジで。
0441nobodyさん
03/06/16 14:41ID:???まあマジレスすると
$a=1;
$b=1;
if (!($a==0 && $b)){
print "ok\n";
}
こんな感じにして、4回変数を書き換えればテストは出来る。
記述が正しいかの動作確認だけなら、一々スクリプト全体を
見直す必要は無い。
0443nobodyさん
03/06/16 17:25ID:0o9Ehb4h$addr = $ENV{'REMOTE_ADDR'};
でIPアドレスを取得するように設定したのですが
友人に送ってもらったメールのIPアドレスと自分で送ってみたものが
同じIPアドレスになってました。
なんでー???
0447nobodyさん
03/06/16 17:45ID:???$port = getservbyname('http', 'tcp');
$iaddr = inet_aton($host);
$sock_addr = pack_sockaddr_in($port, $iaddr);
socket(SOCKET, PF_INET, SOCK_STREAM, 0);
connect(SOCKET, $sock_addr);
select(SOCKET); $|=1; select(STDOUT);
print SOCKET "GET /$path HTTP/1.0\r\n";
print SOCKET "\r\n";
@get = <SOCKET>;
こんな感じで
0448443
03/06/16 18:05ID:0o9Ehb4h住んでる所は友人は関東で私は中部だしプロバイダーも違うし。
$addr = $ENV{'REMOTE_ADDR'}; の箇所以外に
IP取得に干渉するものがあるんでしょうか?
もちょい試行錯誤してみます。
0449nobodyさん
03/06/16 18:43ID:???↓のようにすると、sleep(1)×配列の個数ぶん待った後
一気に出力されます。。
1文字づつ1秒間隔で出力したいのですが、、どこがまちがってますか?
@data = ("あ","い","う","え","お","か","き","く","け","こ");
print "Content-Type: text/html\n\n";
print "<html>\n";
print "<title>self</title>\n";
print "<body>\n";
for($i=0; $i<=$#data; $i++){
print "$data[$i]<br>\n";
sleep(1);
}
0451nobodyさん
03/06/16 19:42ID:???どういうことでしょうか?
ローカルで動かしているんですが、
AddHanderもして、
拡張子もcgiで、ちゃんとスクリプトのはずですが。。。
0452nobodyさん
03/06/16 19:47ID:???REMOTE_ADDRを記録して、それが同じだったということはREMOTE_ADDRが同じだったということではないですか?
>>451
CGIは全部実行した後出力するんだよ。たしか。
0453nobodyさん
03/06/16 19:51ID:???0455nobodyさん
03/06/16 19:56ID:???俺にもよく分からんけど、この辺とか
ttp://www.google.co.jp/search?q=cache:yNlP1fhIQ48J:tohoho.wakusei.ne.jp/lng/199802/98020500.htm+%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%83%AA%E3%83%B3%E3%82%B0+cgi&hl=ja&lr=lang_ja&ie=UTF-8
0456nobodyさん
03/06/16 20:40ID:???スクリプトで、mt-load.cgiを実行したときに1行ずつ表示されてたんだけどなぁ。
nphでもなさそうだし・・・
0458nobodyさん
03/06/16 21:34ID:???ほんとだ、localついてて見落としてた。。。
でも、sleepもないし、nph-*.cgiでもないのに・・・
どういう仕組みなんでしょうか?
0459nobodyさん
03/06/16 21:38ID:???イイナァ
0461nobodyさん
03/06/16 22:06ID:???あああ鬱。
0462458
03/06/16 22:08ID:???どうやったらできるんでしょ。。
ネタとか言わないで・・・
0463nobodyさん
03/06/16 22:26ID:???0464nobodyさん
03/06/16 23:52ID:???いろんな串さしてみて試せば?
0465nobodyさん
03/06/16 23:55ID:???$| = 1;
@data = ("あ","い","う","え","お","か","き","く","け","こ");
print "Content-Type: text/plain\n\n";
for($i=0; $i<=$#data; $i++){
print "$data[$i]<br>\n";
sleep(1);
}
exit;
これでやってみれ。
0467nobodyさん
03/06/17 00:02ID:???0470nobodyさん
03/06/17 00:14ID:???htmlについてもよく考えてみれ。
ブラウザがソースを受け取り、解釈してからレイアウトを決めて
どの時点でどういう順番で表示するか保証はないんだぞ?
0471458
03/06/17 00:14ID:???IEだと無理です。
0472458
03/06/17 00:17ID:???1行ずつ表示する文字をdatなりに保存して読み出したいので、cgiがいいんですけどね〜。。
javaはソース見え見えなのがいやだなぁ。。
0474458
03/06/17 00:20ID:???え???
俺、ローカル(Win)でやると、
あ<br>
い<br>
ってのが一気に表示されて、
レンタルサーバ(linux)だと、
ファイルのダウンロードになった
0475nobodyさん
03/06/17 00:31ID:???とりあえずJavaとJavaScriptは別モンだゴルァ!とお約束の突っ込み。
CGIでは、表示するぶんだけの文字列とそれを表示するためのJavaScriptを出力して
実際の表示はJavaScriptに委ねる、って意味なんだけど。
まあ、可能かどうかは分からんが。
0476nobodyさん
03/06/17 00:39ID:fNA5EU9/foreach文の中で次のループに移るコマンド(for文のcontinueみたいなやつ)
はあるのでしょうか?
御教授くださいませ。
0477nobodyさん
03/06/17 00:40ID:???0481nobodyさん
03/06/17 01:02ID:???まさか、CGIで よ う こ そ とか、下らない事やりたい訳じゃないよね。
JavascriptやFlashが無難だと思うけど・・・。
0482nobodyさん
03/06/17 01:06ID:???見るほうはさっさと表示されたほうがありがたいだろうに
自分のセンスでおもしろいカッコイイと思ってもみんながそうとは
0483nobodyさん
03/06/17 01:08ID:3tOJ9ih6SSIでCGIを呼び出そうとして失敗したときに
[an error occurred while processing this directive]
というエラー文が.sthmlファイルの中に出てくるんですが、
この文章を自由な文面に変更したり出来るんでしょうか?
出来ればリンクタグに変えたいんですが・・・
0486nobodyさん
03/06/17 01:13ID:QhMbf/ikmy $file = '/dir/*';
my @list = glob("$file");
このようなイメージでglob内ワイルドカードを
変数化することは可能でしょうか。
0488nobodyさん
03/06/17 01:22ID:???そのやり方じゃダメなの?
それより、何でスカラー変数をいちいち "" で囲むんだろう。
たまにリストでそれやってハマってる人がいるけど、なんかそういう参考書があるのだろうか。
0490486
03/06/17 02:09ID:???$file = '/dir/*';
my @list = <$file>;
はいかないのに
$file = 'dir/*';
my @list = </$file>;
はいったので、すごい疑問に感じ、ここでglobについて
質問させていただきました。
雰囲気を壊してしまいすみませんでした。
0491nobodyさん
03/06/17 06:23ID:???<$file>と書いた場合は、$fileがファイルハンドルと解釈されてるだけだよ。
<>演算子は、中身によって行入力になったりグロブ演算子になったりと、紛らわしい。
だからPerl5以降では、glob()を使ったほうがいい。
0492nobodyさん
03/06/17 07:06ID:???ファイルを開き、記録された記事番号とパスワードを取りだし
入力されたパスワードと選択された記事をそれぞれ比較して
該当した記事以外を記録しなおすという処理を作ったんですが
いろいろいじってるうちになんだか変な動作するようになりました。
入力したパスワードが正しいとなぜが一番違いの記事のパスワードと比較します。
入力されたパスワードが間違ってると、その記事のパスワードと比較します。
何が悪いんでしょう?
0493nobodyさん
03/06/17 07:07ID:???$del = 0;
local($no,$key) = split(/,/,$line);
if( ( $FORM{'delete'} eq $key ) ){
if ( $no eq $FORM{'target'} ) {
$del = 1;
}
if ( $del == 0 ) {
push (@line2,$line);
}
}
else {
&error("キーが違います。");
}
}
0494492
03/06/17 07:08ID:???0495nobodyさん
03/06/17 09:48ID:???ものを作っています。その際、ファイルハンドルなどはインスタンスごとに
違うものにしたいのですが、どのようにすればよいのでしょうか?
滅茶苦茶な例なのですがC&Perlで言うと下のようなイメージでやりたいと思っています
my $seif = shift;
$self->{handle} = fopen( …
0497>>492
03/06/17 13:30ID:XeNVFdef{
$del = 0;
local($no,$key) = split(/,/,$line);
if( ( $FORM{'delete'} eq $key ) ){
if ( $no eq $FORM{'target'} ) {
$del = 1;
}
if ( $del == 0 ) {
push (@line2,$line);
}
}
else {
&error("キーが違います。");
}
}
字下げくらいしろ。
見易さが違うだろうが。
っといいつつ、俺はPerlに関しては初心者だからまだ分からんがな。
今アクセスログやってんねや。んじゃ
■ このスレッドは過去ログ倉庫に格納されています