トップページ⇒php
1001コメント304KB

【Perl】初心者コーナー Part14

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/07/18 16:34ID:jemWJhH3
いらっしゃーい、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あたりを見よう。
0784nobodyさん02/08/05 00:13ID:???
>>782
じゃあ、そのmegabbsスクリプトってのがしょぼいんだろう。
0785nobodyさん02/08/05 00:17ID:mlKhZTXH
C言語
ファイルポインタを使って円の面積を計算するプログラム、教えてください。
ファイルポインタには半径1から10の数値があります。
出力結果は次のようになるようにして下さい
半径 面積
1
2
3
・
・
10
0786apholist02/08/05 00:26ID:vCl4cucl
>>783
え?ヤヴァイ?
0787apholist02/08/05 00:29ID:vCl4cucl
>>785
ネタ?厨?For文使うか一つずつ円周率3で計算すればいいんじゃない。
0788nobodyさん02/08/05 00:31ID:???
>>785
マルチはうせろ!     
0789nobodyさん02/08/05 00:40ID:???
http://pc3.2ch.net/test/read.cgi/tech/1028474590/
>>785 おめー殴らせろ
0790apholist02/08/05 00:41ID:vCl4cucl
>785
マルチだったのか。Perlとか言語の区別もつかんとは
あわれな厨だな。俺よりアフォだ。

とりあえず、うごきますた。Apache2.039が悪かったみたい。
1.326にしたら動いた。
人柱になるのはもっとスキルみがいてからにします。

ご協力感謝。
0791nobodyさん02/08/05 01:57ID:LdtViypm
アンダーバーを含む行の先頭に
hogeという文字列を追加したい場合
どう書けばいいですか
0792nobodyさん02/08/05 02:19ID:???
>>791
キーワード
正規表現 or index
0793nobodyさん02/08/05 02:21ID:???
>>791
s/(.*_.*[\x0d\x0a]*)/hoge$1/g;
0794nobodyさん02/08/05 02:21ID:???
>>772
遅レスだけど、ありません。
0795nobodyさん02/08/05 02:35ID:LdtViypm
>>792 >>793
マッチさせる文字列全体をカッコでかこめば
よかったんですね。
勉強になりました。
0796nobodyさん02/08/05 09:42ID:???
>>758
$i=$i++;
はいかんよ
$a=0;
$b=$a++;
の場合は$a=1,$b=0.
$i=0;
$i=$i++;
なら$i=1,$i=0.どっちか分からん。
0797nobodyさん02/08/05 10:21ID:???
>>791
while(<>) {
next if !/_/;
s/^/hoge/;
}

ひとつの小難しい正規表現でやるのは嫌な人用。
0798nobodyさん02/08/05 10:36ID:???
このスレを見ていると、localだとかcgi-lib.plだとかjcode.plといった記述を
よく見かけまずが、未だにperl4しか入ってないサーバばかりなんですか?
0799nobodyさん02/08/05 11:28ID:???
軽い方がいいから。
0800nobodyさん02/08/05 11:37ID:7p5l2D2K
以前こちらで教えていただいた者です。その節は大変お世話になりました。
フォームメールでローカル上のファイルを添付して送信するスクリプトを作ったのですが、
パソコンのアウトルックではちゃんと添付ファイル付きのメールが受信できるのに
gooとかのウェブメールや、シグマリオンに付いているMPメールでは上手くいきません。
なにか違いでもあるんでしょうか。
どなたかご教示いただけないでしょうか。
0801nobodyさん02/08/05 11:53ID:???
添付ファイルの扱いを間違えてるとか。
0802nobodyさん02/08/05 12:26ID:7p5l2D2K
扱いといいますと・・・?
gooでは件名、本文は正常に受信できて、添付の部分は本文にコードが書かれている状態です。
MPメールのほうは件名もiso-2022-jpと書かれていて、本文もcontent-type云々になってます。

パソコンのアウトルックで使うより、シグマリオンのMPメールで使う方が多いので困っています。
0803nobodyさん02/08/05 13:47ID:???
Content-Type: Multipart/Mixed;
となってますか。
0804nobodyさん02/08/05 14:55ID:???
一つの動作の中で2回デコード作業をしてはいけないんでしょうか。

$ENV{'QUERY_STRING'}
の内容は1回目で無くなっちゃうんでしょうか。
うまくいかないんです。
0805 02/08/05 14:59ID:???
>>804
そんなこたーないよ。コード見せてみ。
0806nobodyさん02/08/05 14:59ID:???
うまく行くといいですね   ピュア
0807nobodyさん02/08/05 16:02ID:???
>>805
全体と載せるのは無理なんで説明します。
で、実は>721でやっているのをやりたいんです。
チェックボックスの値を配列で受け取るとういのを。
#usr/bin/なんたら
$FORM = &getparam; # パラメータ取得
$mode = $FORM{ mode };
if($mode eq "") { &main; }
〜モード判定〜
else { &error("不正なアクセスです。"); }

sub getparam{ # デコードサブルーチン
 read( STDIN, $post, $ENV{ 'CONTENT_LENGTH' } );
 @data = split(/&/,$post);
 foreach $all (@data) {
 ($name,$value) = split(/=/,$all);
 $value =~ tr/+/ /;
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 $value =~ s/,/,/g;
 $value =~ s/"/"/g;
 $value =~ s/</</g;
 $value =~ s/>/>/g;
 $value =~ s/\r\n|\r|\n/<br>/g;
 $value =~ s/<br</<br>/g;
 $FORM{$name} = $value;
 if($name eq "no"){
  push(@nos,$value);
 }
}
@FORM
0808nobodyさん02/08/05 16:02ID:???
続き

sub main{
foreach $hoge (@nos){
 print "$hoge";
}
}

こうやるんですけど、何も表示されないんですね。
@FORMの配列しか受け取れていないんでしょうか。
最後の値を返り値にするから。
なんで
 if($name eq "no"){
  push(@nos,$value);
 }
@nosの値を受け取るためだけのデコードルーチン作ったんですけど
それでもうまく値が返ってこないんですよね。
0809 02/08/05 16:08ID:???
>>807>>808
で、$ENV{'QUERY_STRING'} は どこ?
0810nobodyさん02/08/05 16:19ID:???
postなんで$ENV{ 'CONTENT_LENGTH' } でした。
0811 02/08/05 16:22ID:???
>>810
$ENV{ 'CONTENT_LENGTH' } でも値がなくなるこたーないよ。出力させてみ。

でも標準入力からは1度しか読み込めない。
0812nobodyさん02/08/05 16:22ID:???
POSTの場合ははSTDINから受け取るので1回受け取ったらなくなります。
0813nobodyさん02/08/05 16:25ID:???
>>807
$postの中に残っていると思われます。
0814nobodyさん02/08/05 16:29ID:???
>>807
そのソースは、記念に以下のスレにカキコしといてよ。

http://pc.2ch.net/test/read.cgi/php/1028052835/l50
0815nobodyさん02/08/05 16:54ID:???
>>814
載せておきました。
0816nobodyさん02/08/05 18:23ID:???

                   _ _     .'  , ..   ..   .'     ∧_∧
          ∧  _ - ― = ̄  ̄`:, .∴ '      ・,‘∴  , .   (    ) ←>>814
         , -'' ̄    __――=', ・,‘ r⌒>  _/ /
        /   -―  ̄ ̄   ̄"'" .   ’ | y'⌒  ⌒i
       /   ノ                 |  /  ノ |
      /  , イ )                 , ー'  /´ヾ_ノ
      /   _, \               / ,  ノ
      |  / \  `、            / / /
      j  /  ヽ  |           / / ,'
    / ノ   {  |          /  /|  |
   / /     | (_         !、_/ /   〉
  `、_〉      ー‐‐`            |_/

0817nobodyさん02/08/05 18:24ID:???
      氏ね
      ∧_∧          _ _     .'  , .. .∧_∧
     ( ´_ゝ`)   _ .- ― .= ̄  ̄`:, .∴ '     ( >>815)
    /     '' ̄      __ ヽ´=', ・,' r⌒> _/ /
   / /\   / ̄\-―  ̄ ̄   ̄"'" .   ' | y'⌒  ⌒\
 _| ̄ ̄ \ /  ヽ \_              |  /  ノ |
 \ ̄ ̄ ̄ ̄ ̄ ̄ \__)              , ー'  /´ヾ_ノ
  ||\            \          / ,  ノ
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄          / / /
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||          / / ,'
  ||  ||          .||       /  /|  |
                       !、_/ /   〉
081880202/08/05 20:15ID:???
803さん、遅くなって申し訳ありませんでした。
Content-Type: Multipart/Mixed;になっています。
もしかしてアウトルックはIEみたいに多少の間違いがあっても
上手いこと動いてくれてしまうんでしょうか・・・。
0819nobodyさん02/08/05 20:16ID:???
あれ?いつからここは格闘技板になったのだ?
0820nobodyさん02/08/05 21:37ID:TC4MSFf/
2chのように上から下へ流れていく掲示板を作っているのですが
書き込んでCGI上でリロードする際に、ページの下の方を表示したいんです。

表示と書き込みのCGIを分けて
書き込み側から
<META content=0;URL="read.cgi#sita" http-equiv=refresh>
こんな感じで飛ばしてみたんですが何故か#sitaが反映されません。

何かいい方法はないでしょうか。
0821nobodyさん02/08/05 21:42ID:???
>820
書き込み後にLocationで飛ばせば?
0822nobodyさん02/08/05 21:44ID:obWCEw8Y
すいませんが、教えてほしいことがあります。

掲示板のログファイルを閲覧者からは見えなくしてCGIからだけ
読み込めるようにするにはどんなパーミッションにすればいいですか?
掲示板の削除キーが書き込んであるのが閲覧可能というのは、
やはりまずいかなと思いましてね。
いろいろ探したけどわからなかったので、知ってる方いたらお願いします。

まあ、ファイル名をわかりにくいものにする、などの方法はありますがね。
0823nobodyさん02/08/05 21:50ID:TC4MSFf/
>>821
やってみました。

print "Location:read.cgi\#sita\n\n";

こうですよね。
でもやっぱり#sitaは反映されないようです。
他に何か無いでしょうか…。
0824nobodyさん02/08/05 21:57ID:???
>822
パーミッション変えるより、拡張子を.cgiにすれば?

>823
ページの読み込みが終わるまで待ってる?
その前にどこかクリックしたりすると移動しないことがあるよ?

あと、念の為に聞いておくけど、<a name=sita></a>で失敗していたりしないよね?
0825nobodyさん02/08/05 22:06ID:TC4MSFf/
>>824

>あと、念の為に聞いておくけど、<a name=sita></a>で失敗していたりしないよね?

そのとおりでした。穴があったら入れたいです。

ありがとうございました。
0826nobodyさん02/08/05 23:12ID:???
ここ、夜になると一気に寂れるな。
みんな仕事でやってるのか。
に、してはレベルが・・・。
0827m(__)m02/08/05 23:25ID:7ewZSPim
こういうCGIないでしょうか。

コミュニティサイトをしようかと思っているのですが、
メンバー表に登録するとクッキーが焼かれ、
掲示板などに書き込む時偽りができないようにできるスクリプトありませんか?

例を出すと、
http://daichanchi.com/
で利用しているようなものです。

よろしくお願いいたします。

0828nobodyさん02/08/05 23:33ID:???
>>827
作れ。簡単だ。
0829nobodyさん02/08/05 23:58ID:???
>>828が作る頭がないに1000チョン
>>827がたたかれるに1マルク
 http://pc.2ch.net/test/read.cgi/php/1021897804/
0830nobodyさん02/08/06 00:04ID:diugRf3e
次のソースで動かしたところ、
「writing」と表示されたのにかかわらず
if文の中が実行されません。
超初心者的なミスを犯していると思いますが、なにとぞご指摘ください。

ActivePerl: 5.6.0.620
Apache 1.3.24
Windows2000 +SP2

/* 以下 プログラム */

print "「$In{mode}」";
if ($in{mode} eq 'writing'){
print "hoge";
exit;
}
0831nobodyさん02/08/06 00:06ID:???
>>830
ネタもほどほどにね。
083283002/08/06 00:07ID:diugRf3e
プログラムが見にくいのでインデントしますた。

print "「$In{mode}」";
if ($in{mode} eq 'writing'){
   print "hoge";
   exit;
}
本当は 「writing」hoge と表示して欲しいのに・・・
083383002/08/06 00:08ID:diugRf3e
>>831
ネタだと思われるようなミスなのですか(鬱)
どこがおかしいのか教えてください。
0834nobodyさん02/08/06 00:09ID:???
$In{mode} と $in{mode} はそれぞれ別の連想配列というネタ?
083583002/08/06 00:17ID:diugRf3e
うぎゃ〜、本当だ(鬱)
失礼しました〜っ

0836nobodyさん02/08/06 00:21ID:???
どこで writing が定義されてるんだろう。
083783002/08/06 00:24ID:diugRf3e
>836
writingはHTMLのフォームから渡されてきた物です。
mode=writing の時に書き込み処理をするようなBBSを
作っているのでした(笑)
こんな単純なことで3時間を費やした俺って一体(鬱)
0838nobodyさん02/08/06 06:46ID:???
>>10
氏ね
0839 ◆JAPH9PWA 02/08/06 09:22ID:???
>>837
そんなキミに-wスイッチとuse strict;をお勧めするよ。
慣れるまでちょっと時間は掛かるけど、
タイポによるつまらないバグが激減すること間違いなし!
0840art02/08/06 10:10ID:a25IbhtN
投稿ごとにファイルが生成される掲示板を作っています。
1.txt、2.txt・・という具合にファイルを生成したいんですが、

(1)テキストが保存されているディレクトリ内のファイルの数を調べ$prev内に代入
(2)*.txtの*をファイル数を$prev + 1にする。
(3)「($prev+1).dat」という名のファイルにする

という考え方でいいのでしょうか?
もし合っていればどういう風に書くかアドバイスして頂きたいのですが・・。
0841nobodyさん02/08/06 10:19ID:???
>840
ナンバーを保存する別ファイルを作る。
0842nobodyさん02/08/06 10:29ID:???
よけいなお世話だけど、投稿削除とか前の方からどんどん削除したいとき大変よ?
0843nobodyさん02/08/06 10:29ID:???
サブルーチンの返り値が複数欲しい時はどうすればいいんですか。
084484302/08/06 10:30ID:???
配列が二つ欲しいです.
@hogeと@hage
これをさらに一つの配列にするしかないですか?
0845nobodyさん02/08/06 10:36ID:???
>>843
普通にリストで。 
return ($a,$b);

($x,$y) = &hoge();


>>844
リファレンス
0846リファレンスを返す02/08/06 10:38ID:???
sub foo{my (@hoge,@hage);return(\@hoge,\@hage);}
my ($hageR,$hogeR)=foo;
0847art02/08/06 10:42ID:a25IbhtN
>>841
ナンバーを保存する別ファイルか・・
どうやるのですか
0848nobodyさん02/08/06 10:52ID:???
なめてるのか?

open(FIL,"a.txt");
$a = <FIL>;
close(FIL);
open(FIL,">a.txt");
print FIL ++$a;
close(FIL);
0849nobodyさん02/08/06 10:56ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

0850art02/08/06 11:03ID:a25IbhtN
>>848
なめてないよ。

そうじゃなくて、まずファイル生成する時にどうやってファイル名を
1.txt、2.txt、3.txt・・と増やして作ることが出来るかってこと。
0851nobodyさん02/08/06 11:05ID:???
>>850
尊敬。

まず、BASICか何かでプログラムとは何か。から学ぶべきかと。
0852art02/08/06 11:09ID:a25IbhtN
ナンバーを保存するファイルを生成するとなると
考えがまとまらなくなってしまって・・・・・。
>>840の方法だと、分かりやすいんですが
そうすると削除とか大変なんですよね。
0853nobodyさん02/08/06 11:10ID:???
いや、そもそもその方式が。
0854art02/08/06 11:11ID:a25IbhtN
>>853
お願いします・・助けてください・・(笑)
0855nobodyさん02/08/06 11:23ID:???
「data」ディレクトリ内にあるtxtファイルの数を
$datという変数に代入するにはどうすればいいですか?
0856nobodyさん02/08/06 11:30ID:yJuB6gJh
cgiで画像を分割する方法ってありますか?

合成ならカウンタとかでよく見かけるんですが、
分割はどうしてもわかりません。

たとえば500x500の画像を
100x100の5個に分割したりする方法です。
085785602/08/06 11:30ID:yJuB6gJh
>>856
500x500
↓
500x100

まちがえたよー
0858nobodyさん02/08/06 11:31ID:???
>art
投稿毎にファイルを生成するなら、ファイル名の数値を調べてインクリメントするが吉。
効率悪いし、メンテナンスしにくいと思うが。
0859nobodyさん02/08/06 11:35ID:???
前もって分割しておく(固定のファイルをいちいち分割する理由がない)。
もしくはGD.pm
086085602/08/06 11:39ID:yJuB6gJh
>>859
画像を携帯から見ようと思うのですが、
当然機種によって表示できるサイズがちがうので、
表示させる段階で分割させたいのです。

厳密にいえば、
大きな画像の任意の一部を抜き出してブラウザに返すのがいいです。
なので、別に分割してファイルを複数つくる必要はないかもしれません。

GD.pmってモジュールですよね?
まだモジュール使ったこと無いので緊張しますが
ちょっと調べてきます。
0861nobodyさん02/08/06 12:53ID:3j+94g7Z
$test =~ /ー/;
ってやるとエラーが出るんですけど、どうすればいいでしょうか?
0862nobodyさん02/08/06 13:15ID:???
$test =~ /\Qー\E/;
0863nobodyさん02/08/06 13:17ID:???
>>861
文字コードをEUC-JPにする
0864nobodyさん02/08/06 13:23ID:xsMd1/x0
掲示板の更新時刻をTOPページに表示しようと思うのですが
掲示板が沢山あり、ログファイルが沢山ある場合、
したの処理を、ログファイルの個数だけ書かないといけないのでしょうか?
良い方法が思いつきません
どうすればよろしいのでしょうか?

#!/usr/local/bin/perl

$file1="log.txt";

$a=(stat($file1))[9];
($x,$mm,$h,$d,$m,$y,$x,$x)=localtime($a);
$m++;

print "Content-type: text/html\n\n";
print"掲示板の更新日は$m/$d $h:$mm";
0865 ◆adminSE. 02/08/06 13:35ID:???
掲示板のログファイル名を配列にいれといてforeachで回して処理すれば?
0866nobodyさん02/08/06 13:49ID:???
>>855の質問に誰か答えられる方いませんか
0867nobodyさん02/08/06 13:57ID:???
opendir DIR data;
@list = <DIR>;
closedir DIR;
@CON = grep { /^*.\.txt$/ } @list;
$dat = $#CON;
0868nobodyさん02/08/06 14:00ID:???
@CON = grep { /^.*\.txt$/ } @list;
0869nobodyさん02/08/06 14:00ID:???
>867
それだと1個足らなくない?
0870nobodyさん02/08/06 14:05ID:???
>>866
ファイル数用のカウンターを作っとけばいいんじゃねーの。
0871nobodyさん02/08/06 14:07ID:???
>>869
そういやそうだった。
0872nobodyさん02/08/06 14:12ID:???
>>867
出力すると「-1」って出てきたんすけど・・
1個少ないんだったら変数に1足しても問題ないですかね?

>>870
簡単に言わないでよ
0873nobodyさん02/08/06 14:48ID:xsMd1/x0
>>865

ありがとうございます。
配列に入れて回したのですが
08/06 14:07 メイン掲示板
08/06 14:09 雑談掲示板
・
・
と出力されるのですが、新しいモノが上に来るようにソートするにはどうしたらよいでしょうか?



print "Content-type: text/html\n\n";
foreach $c (1..$q) {

$access=(stat($file[$c]))[9];
($x,$min,$hour,$mday,$mon,$x,$x,$x)=localtime($access);

$date = sprintf("%02d/%02d %02d:%02d",$mon+1,$mday,$hour,$min);

$sort="$date $name[$c]<BR>\n";
push(@new,$sort);

}
@new = sort { (split(/<>/,$b))[6] cmp (split(/<>/,$a))[6] } @new;
print @new;
0874nobodyさん02/08/06 14:52ID:???
$sort="$date $name[$c]<BR>\n";
の部分は
$sort= "$date<>$name[$c]<><BR>\n";
でした
0875 02/08/06 15:16ID:???
どんどん板のレベルが低下してるのが笑える!
0876nobodyさん02/08/06 15:24ID:???
>>875
そうだな・・・
まぁ、ここは初心者のスレだし良いんでないの?
0877nobodyさん02/08/06 16:14ID:32Vwa5NB
>>873
my %file2mtime;
@file2mtime{@file} = map{ (stat($_))[9] } @file;

foreach my $file (sort{ $file2mtime{$a} <=> $file2mtime{$b} } @files) {
print $file, "\n";
}
0878nobodyさん02/08/06 18:57ID:+CLAZ6EK
IEで、キャッシュを無効にするにはどうしたらいいでしょう。
cgiからの出力を、ブラウザの戻るボタン押下時に意図的にリ
ロードさせたいだけなんですが。。。

<%
Response.AddHeader "Expires", "0"
If Request.ServerVariables("SERVER_PROTOCOL") = "HTTP/1.0" Then
Response.AddHeader "Pragma","no-cache"
Response.CacheControl = "no-cache"
Else
Response.CacheControl = "no-cache"
End If
%>
とか
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">
とか
試したんですが無理でした。

誰かよろしくお願いしますっ!
0879nobodyさん02/08/06 19:18ID:???
>>878
Perlとどういう関係があるの?
0880nobodyさん02/08/06 19:29ID:???
>878
ttp://pc.2ch.net/test/read.cgi/php/1025930486/444
マルチポスト氏ね
088187802/08/06 19:36ID:+CLAZ6EK
>>879
Perl cgiです。。
formにオブジェクトを埋め込めないため、ノーキャッシュ
で制御しようとしてるんですが、IEではうまく動かないん
で、どなたか経験者がいらっしゃたらなぁと。

>>880
答えれねぇんなら出てくん名ぼけが
0882nobodyさん02/08/06 19:41ID:???
>881
向こうのスレでレス返してやってるのは俺なんだがな。
マルチポスト氏ね。
088387802/08/06 19:49ID:+CLAZ6EK
>>882
おおそうか。ならあのページにかかれてある事が
上のソースでやってる事もわかってて書いたんだろうな。

まったく、大変有意義なレスだよな。
ぷ。
■ このスレッドは過去ログ倉庫に格納されています