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

Perl コーディング初心者質問コーナー Part33

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/03/01 02:46ID:1GeWO7LH
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0331nobodyさん04/03/11 04:41ID:???
>>330
\W は [^0-9A-Z_a-z]
'C' (\x43) はこの正規表現にマッチしない。

http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlre.html
0332nobodyさん04/03/11 11:20ID:rL/aIPwV
どうしてもわからないので教えてください。
自宅サーバ設営のため、Kent Webさまよりyybbsをダウンロードしました。参考書
(Mac OSX Unix的活用講座)の指示通りperlの居場所を指定し直し、アクセス権を
設定しましたが、「Internal Server Error」となって動きません。KentさまのFAQ
をみてチェックしましたが、いちおう問題なく設定されているようにおもえます。
いったいなにがダメなのでしょうか?Askaのほうはうごくのですが・・・
環境はサーバもクライアントもMac OS X 10.3.2です。
0333nobodyさん04/03/11 11:26ID:???


 * こ こ は コ ー デ ィ ン グ の ス レ で あ り 、 設 置 云 々 は ス レ 違 い な の で 悪 し か ら ず  *

                                        
0334nobodyさん04/03/11 11:30ID:???
>>332
>Kent Webさまよりyybbsをダウンロードしました
これはどーでもいい。

perlpass->perlのコンパル->httpd->実行の確認
の順番で確認しろ。

あと完全にスレ違いだから。これ。
0335nobodyさん04/03/11 12:42ID:???
>>334
perlpassとperlのコンパルについて教えてください。初耳なので。
0336nobodyさん04/03/11 12:57ID:???
>>335
スレ違いだっつってんだろボケ
0337nobodyさん04/03/11 13:32ID:qdK0the5
変数を別ファイルに設定ファイルとしたいんだけど
ラクダvol2のdo関数の項目でdoを使うとよいとかいて
あったけど、use strictを使うとaborted due to compilation error
と怒られました。use varsで変数を宣言しても同様です。
<main.pl>
use strict;
do './ini.pl';
print $aa;
<ini.pl>
use vars qw/$aa/;
$aa='aa';
スコープの問題だと思うけどuse strictを使って
exporterやファイルopenして処理する方法以外でよい方法は
ない?設定ファイルは簡潔にしたいので。。
0338nobodyさん04/03/11 13:34ID:???
>>337
http://pc2.2ch.net/test/read.cgi/tech/1074151549/
こちらでどうぞ
033933704/03/11 13:42ID:???
>>338
はい
0340nobodyさん04/03/11 15:21ID:???
>>335
ぼくも、perlpassについて知りたいでつ。
0341nobodyさん04/03/11 15:39ID:???
先頭のPerlのパスの事なんじゃないの?
0342nobodyさん04/03/11 15:47ID:???
>>335 = >>340なんだから、いちいち反応せんでもよし。
しかも、パスなんざ環境でいくらでも変わるっちゅーに。

・・・。
そんな餌でオレ様がクマー(
0343nobodyさん04/03/11 16:57ID:GX3EcYk6
hogehoge.cgi/www.domain.com/
などでアクセスした場合の$ENV{"PATH_INFO"}の先頭のスラッシュを取り除きたいのですが、
$file=$ENV{"PATH_INFO"};
$file =~ s/^\///;
これだけでいいのでしょうか?
0344nobodyさん04/03/11 17:54ID:???
perl -w でバグ?取りをしてるんですけど、
QUERY_STRINGが必要な部分のエラー項目を-wで見ようとすると、
?mode=などがオプション扱いされて、参照できないのですが、
他にエラー項目を参照する方法ってありますか?
0345nobodyさん04/03/11 18:33ID:Jy84bKJO
変数って使い回した方がいいですか?
それとも各処理毎に分けたほうがいいかな?

$name = 'ほげ';
print "名前$name"; # $name = 'ほげ'; は以後不要

$name = 0;
if (〜eq〜) { $name = 1; }


みたいな感じで

0346nobodyさん04/03/11 18:54ID:???
>343
$ENV{"PATH_INFO"}の内容が / で始まるならそれで良いと言うか
試せば直ぐ判りそうな気が。

>344
良く解らんかった……。

>345
普通、同一ブロック内なら変数名は処理毎に変える方が良いと思う。
0347nobodyさん04/03/11 18:55ID:???
>>344
http://altba.com/bakera/hatomaru.aspx/glossary/004300470049

a. 先にシェル上で環境変数 QUERY_STRING を定義してから
  スクリプトを実行する。
b. QUERY_STRING と引数 (@ARGV) の両方でパラメータを
  受け取れるようにスクリプトを改造する。
c. 実験用の Web サーバで実際に CGI プログラムとして動かし
  デバッグする。

お好きな方法を。

>>345
{
  my $name = 'ほげ';
  print ...
}
{
  my $name = 0;
  ...
}
0348nobodyさん04/03/11 18:59ID:???
ハッシュへの配列によるキーと値の追加方法について。

今は

@temp = %hash;
push @temp, @_;     #@_内は key1,value1,key2,value2 以下略
%hash = @temp;
undef(@temp);      #気分的に

とやっているのですが、これを余分な変数を介さず
直接追加する方法は無いのでしょうか。

%hash .= @_;
とかやってみたのですが駄目でした。
0349nobodyさん04/03/11 19:15ID:???
>>348
%hash = (%hash, @_);
0350nobodyさん04/03/11 20:22ID:???
>>341
マジレスすると、パスはpath
0351nobodyさん04/03/11 21:24ID:AiFNJNW+
1: 自分はこう言う事がしたい。
sendmailを使って、特定のアドレスにフォームの内容を送信したい。
2: それでこんな風にやってみたが・・・
CDRにあったスクリプトを、パスを適正にかえて用いた。
3: こんなエラーが出て上手く行かなかった。
メアドによっては成功する。メアドに'ne'を含むものは、演算子とみられるせいかダメ。\n\eとしてもダメ。
変数にいれてみてもダメでした。
成功するメアドは、変数操作でもうまくいきます。この板に来たのは初めてですが、失礼なことがあったらすいません。
よろしくおねがいします。
0352nobodyさん04/03/11 22:07ID:???
「こんな風にやった」というのは、自分で書いたコードを見せろという意味。
人の書いたやつを意味も分からずいじっただけなら、改造スレにでも行ってくれ。
0353nobodyさん04/03/11 22:51ID:???
>>352
分からないなら余計なことを書き込むな。
0354nobodyさん04/03/11 22:57ID:???
CDRって何?
くだー?
035535304/03/11 22:57ID:AiFNJNW+
さすがに新参者には厳しいですね。
意味もわからずにいじってるわけではありません。じゃヒアドキュメントのところを。

 $message = <<END_OF_MAIL;
 To: *****.home.ne.jp

 Subject:テスト
 Reply-To: $in{"mail"}

 <名前>
 $in{"name"}

 <アドレス>
 $in{"mail"}

 <感想>
 $in{"comment"}
 END_OF_MAIL
0356nobodyさん04/03/11 22:59ID:???
>>351
とりあえず「メアドによっては成功する」のなら"ne"が演算子と見られているという可能性はない。
もし以下のようにしているのなら、"@"をエスケープしていないのが原因かもしれない。
$mailaddress = "[email protected]"; # -> "foo\@bar.com" or '[email protected]'

>>351の文面から*推測*できることはこのくらいだ。

>>353
消えろ
035735304/03/11 23:01ID:???
>>355
騙るな
0358nobodyさん04/03/11 23:05ID:???
>>351
えーとですね、
「3:こんなエラーが出て上手く行かなかった」というのは、
「ダメだった」と書かれてもそれじゃどうしようもなく、
ダメだったときのエラーメッセージなりログなりを提出せよ、
と、そういうことなんです。

それがないと、何が起きているかわからない。

会社の後輩でも、毎回「まず error_log を見てから俺に相談しろ」と口を酸っぱくして言ってるのに
全然憶えないやつがいるんだけど、なんでみんなああなのかね。
035935304/03/11 23:08ID:AiFNJNW+
>>356
おそれいります。
文字列'ne'を含まないアドレスについては、うまくいくという意味です。
@のエスケープに関しては、すべて行っています。
0360nobodyさん04/03/11 23:10ID:???
>>359
お前は353ではなく351
036135104/03/11 23:23ID:AiFNJNW+
>>360
すいません。
言い忘れましたが、Tera Padというテキストエディタでみると、
'ne'のぶぶんがprintと同じようにボールド体で表示されるのです。
そこで、\n\eとしてみたところ、ボールド体ではなくなりましたが、それで実行すると、
文字列'ne'以下が省略されたかたちでメールが送られた、というメッセージがでました。
どう考えたらいいのでしょうか。
036235304/03/11 23:43ID:???
俺必死杉
0363nobodyさん04/03/12 00:18ID:???
>>361
それを「わけもわからずいじっている」と言わずしてなんといおう。
0364nobodyさん04/03/12 04:58ID:SsTHKK/b
文字列をあるばしょで切りわけたいんですが、
以下のようなときにもっといい方法無いでしょうか。

$str = '200402';
($year,$month) = (substr ($str,0,4),substr ($str,4,2));
0365nobodyさん04/03/12 05:03ID:???
>>361
Tera Pad云々ということはソースに直接メアド入れてるんでしょ?
その付近のソースを貼ったらわかるんじゃないの?
てかそのアドレスを代入した変数を正規表現でチェックしてる?
だとしたらそこがあやしいよーな
0366nobodyさん04/03/12 05:18ID:???
>>364
$strの取得の仕方を変えたらいいんじゃない?
0367nobodyさん04/03/12 05:26ID:???
明らかにsubstr使うのがベストだろうけど。

$str = '200402';
$str =~ /^(\d{4})(\d{2})$/;
print $y = $1;
print $m = $2;
0368nobodyさん04/03/12 05:31ID:???
>>364
>>364
TMTOWTDI.

# substr
my($year, $month) = (substr($str, 0, 4), substr($str, 4, 2));

# unpack
my($year, $month) = unpack 'A4A2', $str;

# パターンマッチ
my($year, $month) = $str =~ /^(\d{4})(\d{2})/;

# 置換1 (非破壊)
(my $year = $str) =~ s/(\d{2})$//;
my $month = $1;

# 置換2 (非破壊)
my $month;
(my $year = $str) =~ s/(\d{2})$/($month = $1, '')[1]/e;

# 回りくどい方法
my @tmp = split //, $str;
my $year = join '', splice @tmp, 0, 4;
my $month = join '', @tmp;
0369nobodyさん04/03/12 05:32ID:???
>>367
> $str =~ /^(\d{4})(\d{2})$/;
2004年の2月しか想定されてないけど、そうでいいのかな?
037036904/03/12 05:33ID:???
すまん。誤読した。
037136404/03/12 05:36ID:???
_とかであらかじめ切っておいて、、というやり方でもできるんですけど
それだと弄る箇所がかなり多くなってしまうんで、
スマートに切り分ける方法があるのならな。と思って質問してみました。
やっぱり_で区切っておいてsplitの方がよさげなんで、そっちで行きます。
わざわざ有難うございました。
0372nobodyさん04/03/12 05:41ID:???
リロードしてなかった。。

みなさん有難うございます。
>>368さんのアンパックが魅力的なんですけど。
ちょっと調べてみます。
037335104/03/12 08:25ID:J1fEY9aw
>>365おそれいります。さきほどとはちがうソースを作ってみました。
mailtoに代入されたアドレスのうち、****\@jcom.home.ne.jpだけにエラーが生じます。
時間がないので失礼します。

 #$mailto = "****\@taurus.livedoor.com";
 #$mailto = "****\@jcom.home.ne.jp";
 #$mailto = "****\@****.org";
 $mailto = "****\@yahoo.co.jp";
 jcode::convert(\$name, "jis");
 jcode::convert(\$comment, "jis");


 open(MAIL, "|$sendmail $mailto");
 print MAIL "Subject:comments and questions\n";
 print MAIL "Reply-To: $in{'mail'}";
 print MAIL "\n$in{'comment'}";
 close(MAIL);

0374nobodyさん04/03/12 09:21ID:???
$jcom = "jcom.home.ne.jp";
#$mailto = "****\@$jcom"; とかでも無理?
0375nobodyさん04/03/12 11:25ID:S7woz7f4
ゲームのアイテムなどの相場情報の報告などを集計して相場平均価格を
出したいのですが情報操作目的の、普通ではあり得ない価格報告を
平均価格を計算する時に使ってしまうと平均価格が狂ってしまうのでそれを避けたい
のですが良い計算方法が浮かびません。
10 + 20 + 20 + 30 / 4 = 20 #正常
10 + 20 + 20 + 3000 / 4 = 762.5 #異常
こういう事態を避けたいのです。

perlコーディングというより数学計算式の問題のような気もするのですが
該当スレが見つからなかったのでここに書かせて頂きました。
どなたかよいアドバイス頂けないでしょうか?
0376nobodyさん04/03/12 11:46ID:???
>>375
perlのコーディングの話ではないですね。
標準偏差使えばいいんじゃないかと思うけど、この板で話続けるなら

△▲ WebProg 初心者の質問 Part8 ▼▽
http://pc2.2ch.net/test/read.cgi/php/1078568723/
0377nobodyさん04/03/12 11:51ID:???
>>375
レスありがとうございます。
標準偏差で調べてみようと思います。
誘導も感謝いたします。
0378nobodyさん04/03/12 11:52ID:???
>>375
統計学には、はずれ値の除外に反復切断法というのがある。
0379nobodyさん04/03/12 12:14ID:???
四捨五入についてお聞きします。
小数点第一位で四捨五入を行なうときには、
$hoge = int($hoge + 0.5);
とすれば整数部分のみが取得できますが、
小数点第二位で四捨五入を行なうときには、
($hoge + 0.05);
の他に、どのような記述を追加すればいいのでしょうか。
0380nobodyさん04/03/12 12:47ID:???
すいません、説明不足かもしれません。

# パーセンテージを算出する
$percent = ($count / $total * 100);
print <<"EOF";
<IMG src="グラフ.gif" width="グラフの長さ" height="10"> $percent</TD>
EOF

こうある場合で、小数点第二位で四捨五入した値を$percentに表示したいのです。
0381nobodyさん04/03/12 13:12ID:???
printfの書式演算子を見るべし。
0382nobodyさん04/03/12 14:27ID:???
指定したディレクトリ以下の空フォルダ削除する方法はどうしたらよいのでしょう?
再帰とかいろいろ調べてるのですが、いまいちでして。。
0383遙皇 ◆HEHARUKAoo 04/03/12 14:55ID:???
指定したurlからHTMLやファイルを取得する時に使うモジュールで
皆さんが普段使っているものやおすすめのものを教えてください。

socketから書くの('A`)ノ マンドクセ
0384nobodyさん04/03/12 15:08ID:???
>>383
スレ違い。
0385nobodyさん04/03/12 15:19ID:???
>>383
http://pc2.2ch.net/test/read.cgi/php/997829243/ あたりが妥当だろう
0386nobodyさん04/03/12 15:52ID:???
>>383
LWP

>>384-385
このくらいは良いんじゃないか?
0387nobodyさん04/03/12 16:38ID:???
URLラッパーがついてるPHPはファイルの取得がものすごく楽だな。
0388nobodyさん04/03/12 16:54ID:???
>>387
【PHP】質問スレッド Part15
http://pc2.2ch.net/test/read.cgi/php/1078592587/ あたりが妥当だろう
0389nobodyさん04/03/12 17:13ID:???
my $hashref = $pkg1->return_hash_ref(); #ハッシュのリファレンスを返す
$pkg2->get_hash_ref($hashref);

package pkg2;
..
sub get_hash_ref{
    my $self = shift;
    $self->{'hashref'} = shift;
..
}

のように渡した時、get_hash_ref()内で

while(my($key, $value) = each %{$self->{'hashref'}}){
    ${$self->{'hashref'}}{$key} = 0 unless $value;
}

とかやっても0が代入されないようなのです。
何が悪いのでしょうか。
0390nobodyさん04/03/12 17:24ID:???
染色体
0391遙皇 ◆HEHARUKAoo 04/03/12 18:02ID:???
>>384-386
ありがとうございます。
とりあえずLWPからあたってみます。
0392nobodyさん04/03/12 19:48ID:???
>>389
こんなでも動くけど。

my %hash = (a=>1, b=>undef, c=>3, d=>4, e=>undef);
my $pkg2 = pkg2->new();
$pkg2->get_hash_ref(\%hash);

while(my($key, $value) = each %hash){
print $key, ' => ', $value, "\n";
}
exit;

package pkg2;
sub new
{
return bless {}, shift;
}

sub get_hash_ref
{
my $self = shift;
$self->{'hashref'} = shift;

while(my($key, $value) = each %{$self->{'hashref'}}){
${$self->{'hashref'}}{$key} = 0 unless $value;
}
}

> ${$self->{'hashref'}}{$key} = 0 unless $value;
これが通るのが謎。
$self->{'hashref'}->{$key} = 0 unless $value;
こうするのがいいっしょ。
0393nobodyさん04/03/12 20:12ID:hneCqJMt
今クッキーに書き込む処理をする部分を作ってるんですが、
Windows XPの場合cookieファイルはどこにあるんでしょうか?
98SEのときと保存の仕方が違うようなのです。
039433004/03/12 20:50ID:???
>331さん
いろいろ検索してみたのですが、'C'にも対応したコードがわかりません。
上記のコードはperlメモの写しなのですが、世間じゃ大概urlエンコードには
この方式を利用していますよね?手持ちの本も見てみたのですが、
これも'C'にはマッチしないものでした。
ということは大半のperlスクリプトに'気'を渡したら誤動作を起こすということでしょうか?

0395nobodyさん04/03/12 21:03ID:???
>>394
もうperlコーディングの話題じゃないわけだ。
お前は2chにアクセスするとき
http://%32%63%68%2e%6e%65%74/%32%63%68%2e%68%74%6d%6c
でアクセスする気か?
0396nobodyさん04/03/12 21:10ID:???
>>393
いんたーねっとひすとりー
0397nobodyさん04/03/12 21:32ID:???
> 98SEのときと保存の仕方が違うようなのです。

この書き方って、あんまり印象良くないね。
周知の事実なんだが、自分が、さも今発見したっていうか。
そんなもん、知らない方がおかしいっての。
98SEからPC触ってるんだったら、この何年、何やってたんだって話だよ。
少しは自分で調べることを覚えないとな。
いつまでたっても、初心者じゃカコワルイ。
0398nobodyさん04/03/12 21:52ID:???

-------------------------------------------------------

           こ こ ま で 釣 り 堀
0399nobodyさん04/03/12 22:00ID:???
>>393
Perlコーディングと関係ない質問はスレ違いということで。

△▲ WebProg 初心者の質問 Part8 ▼▽
http://pc2.2ch.net/test/read.cgi/php/1078568723/l50
へどうぞ。
040039304/03/12 22:01ID:???
以前と同じ方法でクッキーの書き込みと取得もできてたんだけど
そのクッキーファイルの保存状況を確認しようとしたら見つからなかったんです。
とりあえずcookieでCドライブに検索かけて
cookieがあるフォルダまでは到達して探してたんだけど
目的のファイルが見つからなくてもしかしたら別のフォルダもしくは
特殊な方法で保存してあるのかと思ったけどようやく発見しました。
0401nobodyさん04/03/13 01:09ID:i+mpAF5R
テスト環境はWinXP、AnHTTPD、ActivePerlです。

$logno = 1
$num = 2
$ext = ".txt"

だとして、$temp = "$logno_$num$ext" とすると 2.txt と帰ってきてしまいます。
手持ちの入門書(CGI&Perlポケットリファレンス)で見る限りはアンダーハイフンを
エスケープする必要があるという記述は見つけられないのですが、
$temp = "$logno\_$num$ext" としたらきちんと 1_2.txt と帰ってきました。

これはどういう理屈なのでしょうか。
0402nobodyさん04/03/13 01:23ID:???
$logno_ を変数名として扱うから。
0403nobodyさん04/03/13 01:26ID:???
エスケープしたくないのであれば{}で明示してあげるのも良いだろう。
${logno}_$num$ext
040440104/03/13 01:52ID:???
>>402
>>403

なるほど。助かりました。
040539304/03/13 12:47ID:???
すみません。そちらで改めて質問させていただきます。
0406nobodyさん04/03/13 17:17ID:0t1k16sr
use strict;してるのですが、
 my %NEW;
 my $maxno

だと正常動作するのですが、
 my %NEW,$maxno;
だと正常動作しません。

こういうもんなんでしょうか?
どっかで、こういう例を見たような気がするのですが・・・。
0407nobodyさん04/03/13 17:23ID:???
>>406
()で囲まないとダメ
040840604/03/13 17:34ID:???
>>407
あ、ほんとだ、ありがとうございます。
0409nobodyさん04/03/13 20:27ID:3lH9+FV2
■ そふとはうす ■
単位はすべて円です
Windows日本語製品版です。Macもあります。
Office 2003 Pro 10000
Windows XP Pro 4000
Windows 2000 Pro 4000
Windows 2003 Server Enterprise 15000
FrontPage 2003 4000
Acrobat6.0 Pro 7000
Illustrator 10.0 10000
Illustrator CS 10000
PageMaker 7.0 7000
Photoshop 7.0 10000
Photoshop CS 10000
Premiere Pro 10000
Flash MX 2004 5000
期間限定で販売します。希望品,郵便番号,送り先住所,氏名,合計金額を記してお申し込みください。すべてユーザー登録できません。ほかにも商品(Win,Mac)ございます。
リスト希望の方は「リスト希望」のタイトルでメールください。

ご注文はここ→ [email protected]


広告希望はコチラ  [email protected]
メール専門広告代理店  本気と書いて大マジっス!広告
0410nobodyさん04/03/14 10:20ID:YQY2sb9a
自分もuse strict;を使って見ようと思いちょっと短いコードを
書いてみたのですが疑問があります。

use strict;
print "content-type: text/html\n\n";
print $a;
exit;

$aは宣言されていないのになぜかエラーがでません。

$abに変えるとエラーがでました。これはなぜなのでしょうか?
0411nobodyさん04/03/14 10:23ID:???
$aと$bはsortで使う特殊変数だからじゃ?
0412nobodyさん04/03/14 10:30ID:YQY2sb9a
そうなんですか。なるほど勉強になります。ありがとうございました。
0413nobodyさん04/03/14 12:54ID:YQY2sb9a
もうひとつ聞きたいのですが、

今作ってるBBSのタイトルや文字色などの設定はsetting.cgi

というものに書かれています。

$title = 'BBS';
$color = '#555555';

のように

それを呼び出して変数をセットしていたのですが、use strictを
使った場合はmainパッケージを指定して

$main::title

のようにしないとだめなのでしょうか?
使うたびにいちいち$main::

と記述するのが面倒なのですが・・・


0414nobodyさん04/03/14 12:57ID:2Zg8YvJb
http://qb3.2ch.net/test/read.cgi/operate/1078972549/122
>122 :root ★ :04/03/13 21:30 ID:???
>こっちにも貼っておこう。
>916 名前:root ★[sage] 投稿日:04/03/13 21:28 ID:???
>・同時に動くread.cgi数を制限するディレクティブorモジュール
>・負荷(LA)を見てCGI起動を制限するディレクティブモジュール
>
>があったら、誰か教えてください。
http://qb3.2ch.net/test/read.cgi/operate/1078921755/829
http://qb3.2ch.net/test/read.cgi/operate/1078921755/831
http://qb3.2ch.net/test/read.cgi/operate/1078921755/916
0415nobodyさん04/03/14 13:29ID:???
>>413
mainパッケージなら、パッケージ名を省略できるぞ。

$::title
0416nobodyさん04/03/14 13:51ID:???
>>413
名前空間が同じなら、
use vars qw($title);
とか
0417nobodyさん04/03/14 13:56ID:???
>>413
自分ひとりで使うなら自由だろうけれども。
他人や素人にも可能なように、設定ファイル形式にするのはどうか。
0418die($/);04/03/14 14:24ID:ntUNbT3i
cpan ってなんて読めばいいのでしょうか?
気になって朝も起きれません
0419nobodyさん04/03/14 14:43ID:???
しー○ん
0420die($/)04/03/14 14:48ID:ntUNbT3i
しーぽんですか、ありがとうございました
0421nobodyさん04/03/14 17:11ID:???
(´ω`)・・・
0422nobodyさん04/03/14 18:06ID:???
まことに初歩的な質問かもしれませんがどうか教えて下さい。

既存のスクリプトを改造しているのですが、以下のようなことをしようと
思っています。

1)フォームより***.txtといったようなファイルを送信する
2)入力されたファイルを解析して結果を表示する

・・・というものです。

フォームにテキストそのものを書き込む方法ならその値を読み込む
方法なら簡単だと思うのですが・・・
フォーム入力から例えば***.txtというファイルを送信した場合に
これを一旦任意のディレクトリにアップロードして、スクリプト内で
ファイルをopenして処理する以外に方法はないのでしょうか?
042341304/03/14 19:33ID:MYhrucqa
レスありがとうございます。

use strict;

としたあとに、

my $val = 10;

print "Content-type: text/html\n\n";
print $val;

exit;

としたところ動きました。どうもありがとうございました。
0424nobodyさん04/03/14 19:42ID:???
>>422

>これを一旦任意のディレクトリにアップロードして、スクリプト内で
>ファイルをopenして処理する以外に方法はないのでしょうか?

どうもないらしい。少なくとも俺は知らん。
CGI.pmのドキュメントを読めばわかると思うが、
同じように一時ファイルに保存する分、それがセキュリティの穴になりうる可能性があるとのこと。
まあ、さっと保存してさっと処理してさっと消して、穴になる確率を極力減らす努力をしよう。


0425nobodyさん04/03/14 19:45ID:wZU93kf1
http://2.pro.tok2.com/~mg7/cm/benri.htm
0426nobodyさん04/03/14 20:01ID:???
>>422
ファイルのアップロードはCGI.pmやCGI::Liteを使えば簡単。
って話じゃないのかしらん。
042742204/03/14 20:14ID:???
>>424さん、>>426さん
ありがとうございます。
必死にぐぐってみているのですが、どうもそれらしい資料が見当たらない
のはそういう理由なのでしょうね。
>>424さんいアドバイスいただいたようにセキュリティの穴を作らないよう
素直にテンポラリファイルを作って対処したいと思います。
何分perlの勉強を始めたばかりでわからないことばかりですがひとつひとつ
問題を乗り越えていきたいと思います。
どうもありがとうございました。
042842204/03/14 20:21ID:???
>>426さん
考えていたのは送信したpostで受けたファイルをいちいち保存しないでそのまま
メモリ上に展開して解析、値を返す、、、ようなことを考えていました。
もっと精進します。
0429nobodyさん04/03/14 22:25ID:???
アップロードされたファイルは標準入力に入ってやってくるわけだから
multipart を自力でデコードすれば原理的に不可能な話じゃないだろう

CGI.pm の man に書いてあるのは、
「CGI.pm はテンポラリファイルを作るので盗聴の恐れもあるんだよ」ということで、
本来はテンポラリファイルを作らず自力でデコードする方がセキュリティは高い。

なんだが、自力でデコードするのがめんどいので、
たいていみんな「盗聴されてもいいやー、どーせuploaderだしぃ」とか妥協して
CGI.pm に頼ってしまうわけだ。

自力でデコードするなら、
ttp://www.hk.airnet.ne.jp/~ahero/cgi/cgiex11.html
あたりを参考にしてみては。
0430nobodyさん04/03/14 22:47ID:???
>>429
そのサイト見たけど、えらいテキトーなコードだな
■ このスレッドは過去ログ倉庫に格納されています