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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
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
そのサイト見たけど、えらいテキトーなコードだな
0431nobodyさん04/03/15 00:31ID:???
ファイルなんだから「盗聴」じゃなく「盗視」というべきなんではw

それはともかく、アップローダーとかなら見られても問題ないが、
そうでないなら自力でデコードするべきということだな。
つーか何でCGI.pmが危険を承知でそんな設計になってるんだ?
0432nobodyさん04/03/15 00:45ID:???
>>431
CGI.pmはメモリーをガンガンに食うので、とりあえず気休めにメモリ効率のいい方法を使ってみた、とか。
0433nobodyさん04/03/15 01:07ID:???
432はちょっと431に対してまとはずれなことを言っているようです。
0434nobodyさん04/03/15 01:15ID:???
CGI.pmは使った事無いけど、テンポラリファイルを
外から不可視のディレクトリ内に作らせるようには出来ないのかい。
0435nobodyさん04/03/15 01:37ID:???
>>434
できるんだけど、その場合でも CGI プロセス自身からは見えないとまずいので、
そういうパーミッションのディレクトリにせざるを得ない。
で、suexec 使ってない apache だと、全ての CGI プロセスから丸見えってことだよね、
とかそういう話。

man CGI にも 「suexec にしる」 と書いてあるんだが、
mod_perl な人とかは suexec できないので辛いよな。
0436nobodyさん04/03/15 02:14ID:???
ファイルロックって何でいるんですか?
ファイルに書き込むときには使ったほうがいいんですかね?
いまいち必要かがわからないので誰か教えて…
0437nobodyさん04/03/15 02:32ID:L0Oup+5/
以下のようなDBから必要なレコードとってきてタブ区切りテキストをダウンロードしようとしています。

# SQLの発行
$sql = "select no, date, standard, exception, company, address, quality, class, url from $tblname where del = 0 order by no";
$result = $conn->exec($sql);
# 行数、フィールド数の取得
$rows = $result->ntuples;
$fields = $result->nfields;
# データファイルを作成
for($r = 0; $r < $rows; $r ++)
{
for($f = 0; $f < $fields; $f ++)
{
$v = $result->getvalue($r, $f);
$data .= qq|$v\t|;
}
chop($data);
$data .= qq|\n|;
}
print "Content-type:text/plain\n\n";
&jcode::convert(\$data, 'sjis');
print $data;

ここで、実際にIEでダウンロードすると、当たり前といえば当たり前ですが、ダウンロードファイル名がデフォルトでスクリプトのcgiファイル名となってしまいます。
一度、サーバーにファイル書き出しして開いて送ればいいのですけど、それをしないで好きなファイル名でダウンロードできるようにする方法ありますか?
perlというより、CGIですが。。
043842204/03/15 02:40ID:???
>>429
お礼が遅くなってスマソです。教えていただいたリンク先ですが。。。
当方にはまだまだ敷居が高そうですが、今後の参考にさせていただきます。

>>436
未熟者が語るようなことではありませんが、例えば1つのファイルに複数の
書き込みがあったとしたらどうなると思います?
何らかの制御をして順番を決めないと競合してファイルが壊れてしまうはずです。
そのためにロックして1つの書き込みを処理している間は他の書き込みをロック
して防ぐことでファイルの破損を防ぐ。。。ということだと解釈していますが。
諸先輩方、いかがでしょうか?
0439nobodyさん04/03/15 02:43ID:???
>>438
あってます<ファイルロック
0440nobodyさん04/03/15 02:55ID:???
>>438
ファイルロックは書き込み処理の寸前にするのでしょうか?
またflock($fp,LOCK_UN);といった感じでロックを開放する処理も書き込み後行った方がいいのでしょうか?
044142204/03/15 03:17ID:???
>>439
ありがとうございます。

>>440
ファイルをopenする前にロック、closeしてから開放しないと
ロックする意味がないと思われますが?
http://www.google.com/search?q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB+%E3%83%AD%E3%83%83%E3%82%AF+%E3%81%A8%E3%81%AF&sourceid=opera&num=0&ie=utf-8&oe=utf-8
で
http://216.239.53.104/search?q=cache:JjxLPe-vA5IJ:tohoho.wakusei.ne.jp/wwwcgi8.htm+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB+%E3%83%AD%E3%83%83%E3%82%AF+%E3%81%A8%E3%81%AF&hl=ja&ie=UTF-8
のような感じでしょうか。
0442nobodyさん04/03/15 03:27ID:???
>>441
ありがとうございます。もっと勉強して出直してきます。
0443nobodyさん04/03/15 04:19ID:???
本来初心者スレかファイルロックスレの範疇だが……

>440-441
基本的には「ロック > 処理 > アンロック」、
例えば一つのファイルを更新する場合は「ロック > 読み > 書き > アンロック」
の順番が守られていれば、open() はロックの先でも後でも良い。
#ロックの方法論は別の話

現に、flock() は以下のようにして使う。

open(FILE, 'file.dat');
flock(FILE, 2); # ロックは open() の後
..
#読み書き等の処理
..
flock(FILE, 8); # アンロック
close FILE; #   そして close()

ロックスレは途中荒れてるが読んでみると良い。
0444nobodyさん04/03/15 04:23ID:???
あれ初心者スレとのマルチか……まあ良いや。
0445nobodyさん04/03/15 04:39ID:???
>>437
ブラウザ依存だけどこんな感じのを吐けばいい。IEなら動く
Content-Type: application/octed-stream
Content-disposition: attachment; filename=xxx
044642204/03/15 04:39ID:???
>>443
なるほど。勉強になります。
ロックスレもじっくり読ませていただき勉強します!
今日はいろいろ勉強になります。諸先輩方に感謝します。
0447nobodyさん04/03/15 09:46ID:???
掲示板を作る際に記事のキーとして現在時刻を用いようと思うのですが
同じ時間になってしまうことはあるのでしょうか。
$key = time(); こんな感じで。
0448nobodyさん04/03/15 09:56ID:???
キー値として時間を使うのは不適当だと思うがどうだろうか。
0449nobodyさん04/03/15 09:58ID:???
>>447

CGIを同時起動させて時間取得を千回ほどループさせてみてはどうだろうか。
0450nobodyさん04/03/15 11:59ID:???
CGI.pmを使ったアップローダーのサンプルなのですが、どうもうまく実行できません。
line 27のハッシュの使い方がまずいようなのですが、いまいちわからず何が悪いのかわかりません。
環境はWinXP + Active Perl 5.6 + An HTTPDです。
0451nobodyさん04/03/15 12:01ID:???
#!/usr/local/bin/perl

BEGIN {
use CGI::Carp qw(carpout fatalsToBrowser);

carpout(STDOUT);
}

# 画像ファイルのサイズ制限(KB)
$img_max = '100';

# 画像を保存するディレクトリー
$images = '画像を保存するディレクトリー';

use CGI;
$query = new CGI;
$filename = $query->param('File');

# ファイルを読み込む
while(read($filename, $buffer, 2048)) {
$file .= $buffer;
$file_size ++;
if($file_size > $img_max / 2) { &Error("ファイルサイズが大きすぎます"); }
}
0452nobodyさん04/03/15 12:02ID:???
# 拡張子を取り出す
$type = $query->uploadInfo($filename)->{'Content-Type'};
if ($type =~ /jpeg/i) { $ext = 'jpg' };
elsif ($type =~ /gif/i ) { $ext = 'gif' };
else { &Error("その形式の画像ファイルは保存できません"); }

$new_file = "test" . ".$ext";

# ファイルを指定ディレクトリにコピー
open(OUT, "> $images/$new_file");
binmode(OUT);
print(OUT $file);
close(OUT);
chmod(0666, "$images/$new_file");

# 完了メッセージの表示
print <<END_OF_HTML;
Content-type: text/html

<HTML>
<BODY>
ファイルのアップロードに成功しました。
</BODY>
</HTML>
END_OF_HTML

exit;
045345004/03/15 12:24ID:???
すみません。自己解決しました。
このソ−スではファイルの入力部分のhtmlが不足していました。
書き足したところ上手くできました。お騒がせしました
0454nobodyさん04/03/15 13:47ID:L0Oup+5/
>>445
おおお。うまくいました。ありがとうございます!
0455nobodyさん04/03/15 15:01ID:gPR3Vlyr
質問です。
@number=("1","3","7","16",,,);
のように、まったく規則性が無い数値が大量に入っている配列があるのですが、
この中から最大値および最小値を取り出す場合、何かいい方法は無いでしょうか?
0456nobodyさん04/03/15 15:06ID:???
>>455
並び替えすりゃいいんじゃないの?
0457T.K04/03/15 16:03ID:???
>>455

sortを使う。

-----------

sort @number; #@numuberを並び替える
$max = $number[0];
$min = $number[$#number];

0458nobodyさん04/03/15 16:20ID:???
>>455
> 質問です。
> @number=("1","3","7","16");
> のように、まったく規則性が無い数値が

クオートしてたら文字列だろ、
@number=("1","3","7","16");
print ((sort@number)[-1]);# 7、と表示する。
045945804/03/15 16:31ID:???
>>458
> >>455
> > 質問です。
> > @number=("1","3","7","16");
> > のように、まったく規則性が無い数値が

@number=("1","3","7","16");
print ((sort{$a <=> $b}@number)[-1]);# 16 と表示する

# 明示的に数値として比較する必要がある
0460nobodyさん04/03/15 16:32ID:???
数値としてソートすりゃいいじゃん

sort{$a <=> $b}(@number);
046145004/03/15 16:41ID:???
ちょっと必要があって>>451-452のCGI.pmを使用したファイルアップローダー
でPerlの実行ファイル***.cgiをアップロードしたのですが、アップロードした
ファイルがInternal Server Errorとなり動きません。
まったく同一なファイルをCGI.pmでアップロードしない場合は問題なく動作します。
そこでCGI.pmでアップロードしたファイルを開くと改行コードはCR+LF、文字コードも
Shift_JISで問題ありませんでしたが、改行が増えた状態になっています。
どうやらアスキーではなくバイナリでアップロードされているようだったので、
ググって調べてみたところHTMLファイルのエンコードタイプが
multipart/form-data ではバイナリデータしか送れないことがわかったので、
application/x-www-form-urlencoded と変えました。
これでアップロードすると改行が増えることなく元のファイルとまったく同一
にアップロードされているようです。
しかしそれでもアップロードしたファイルは起動できずエラーになります。
さらに調べてみたところ、

>フォーム中に <INPUT type="file"> を含む場合は "multipart/form-data" を使用して下さい。

ということが書かれてありました。
原因はどうやらエンコードに問題があるようなのですが、この矛盾した状態でどうやったらファイルを
アップロードが正しくできるのでしょうか?
046245004/03/15 16:43ID:???
>HTMLファイルのエンコードタイプが
multipart/form-data ではバイナリデータしか送れないことがわかったので、
application/x-www-form-urlencoded と変えました。

抜けていましたが、htmlファイルのフォームの記述のことです。
<FORM ACTION="./upload.cgi" ENCTYPE="application/x-www-form-urlencoded" METHOD="POST">
0463nobodyさん04/03/15 17:00ID:???
もうperlとは関係ない話じゃないかよ

アップローダースレ
http://pc2.2ch.net/test/read.cgi/php/1022299892/
046445804/03/15 17:03ID:???
>>462

LFなファイルをそんまま送ればいいじゃねえの?
俺なんかEUC-JP LFで作ってそんまま生で送ってるよ
asciiモードなんか使わない、めんどくさいし間違いの元
046545004/03/15 17:07ID:???
>>463
CGI.pmに関することだからと思ってこちらに書き込ませてもらいましたが、
仰るとおりですね。スレ違い失礼しました。

>>464
どうもありがとうございます。試してみます。
0466nobodyさん04/03/15 17:08ID:???
根本的に勘違いしてるしな
0467nobodyさん04/03/15 19:34ID:???
>>461
任意のスクリプトが実行可能なアップローダですか…。
他サイトがやばいから、公開しないでね。
0468nobodyさん04/03/15 20:00ID:???
>>455
use List::Util qw(max min);
...
my ($min, $max) = (min(@number), max(@number));
■ このスレッドは過去ログ倉庫に格納されています