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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0583nobodyさん04/06/27 23:24ID:???
>>582
AからBに処理を渡してその戻り値をAで使いたい。
別に普通にできるし、なんでSSIとか掲示板とか許可とかの話になるん?
すいませんが、何を悩んでるのかわかりません。
0584nobodyさん04/06/27 23:48ID:???
>>583
その方法を577は教えろと言ってんじゃないの?
0585nobodyさん04/06/27 23:54ID:???
以前こちらで質問した>216なんですが、また少しお聞きしたい事があります。

@data = ('A,7,緑',
'C,6,青',
'B,4,赤',
'A,9,紫',
'A,2,黄緑',
'B,10,黄',
'C,3,青紫');

上記のような配列があり、これを一項と二項目でソートしたいのですが、
ここでもう一つの条件、
二項目の比較にある数字にもっとも近い数字からソートする、
という条件を加えたいのです。

例えば 二項目が 8 にもっとも近い数字からソートした場合

@data = ('A,9,紫',
'A,7,緑',
'A,2,黄緑',
'B,10,黄',
'B,4,赤',
'C,6,青',
'C,3,青紫');

といった感じにしたいのです。

前にお聞きした方法で作業を進めていたのですが、
どうしてもこの問題で詰まってしまい困っています。
何か良いお知恵があれば何卒ご教授下さい。
0586nobodyさん04/06/27 23:59ID:???
方法ったって、標準出入力介してもいいだろうし、
AからBをrequireするなり、モジュールにしてuseしてもいいだろうしさ。
evalとかdoとかの話もするの?

あ、ただCGIスクリプト内で別のCGIスクリプトの出力をそんまま
取り込みたい、って話なら、それは「CGIのお作法」の話なので、
別をあたってください。
でもそれならperlスクリプトAとBでって聞き方はおかしいよ。
0587nobodyさん04/06/28 00:54ID:???
>>585
前言われたやり方+シュウォルツでうまいことやりなさい。
0588nobodyさん04/06/28 01:40ID:???
$base= 8;
for (map{$_->[0]} sort {($a->[1] < 0 ? -$a->[1] : $a->[1]) <=> ($b->[1] < 0 ? -$b->[1] : $b->[1])} map{[$_,$base-(split',')[1]]}@data){
print $_,"\n";
}
0589nobodyさん04/06/28 03:19ID:???
>>588
わかりづら!
0590nobodyさん04/06/28 05:19ID:???
変数名に使えるのってアンダーバーと英数字だよね?

<input type=image src="hoge.jpg" name=test>

でも↑をsubmitとして使って、PERLで受けとると
test.x=
test.y=
が付いてきて、
foreach ( split /&/,$ENV{'QUERY_STRING'} ) {
(my $a , my $b ) = split /=/;
$form{$a} = $b;
}
とかやると、%formのキーにtest.xっていうのができちゃう。
一応動作に支障はないけど、ハッシュのキーにピリオド使っていいの?
0591nobodyさん04/06/28 05:45ID:???
>>585
my $base = 8;
my @sorted =
  map $_->[3],
  sort { $a->[0] cmp $b->[0] || $a->[1] <=> $b->[1] || $b->[2] <=> $a->[2] }
  map { /^([^,]+),([^,]+)/; [ $1, abs($2 - $base), $2, $_ ] }
  @data
;
print map "$_\n", @sorted;
0592nobodyさん04/06/28 06:02ID:???
条件式?:の条件演算子って条件式で真なら左辺を偽なら右辺を返すから普通は
$a = $b == 0 ? 1:2;
みたいに使うんだろうけど、
map{ /a/ ? $a += $a : $b += $a } @array;
みたいに真と偽の時の処理に↑みたくやるのも正しい使いかた?

これ使うと今の長いソースが短くできるからやりたいんだけど、HTMLでStrict厨な俺は
PERLでもなるべく正しい関数の使い方をしたいとか思ってる;

?:をifみたく処理の分岐で使うのはどうなの?
0593nobodyさん04/06/28 06:16ID:???
>>591
sort関数ってどうなってるんですか?
@old=(1,a,4,f,5);
@new = sort{$a <=> $b}@old;
こうゆうのよく見ますけど、どうゆう流れで処理が行われているのかわかりません。
mapみたいに@oldからはひとつづつ要素が渡されてるんですよね?
その渡された要素は$_に入っているわけではなさそうですが、$aと$bには何が入ってるんでしょうか?

0594nobodyさん04/06/28 06:49ID:???
>>593
リスト中のどれか2つの要素。
どれがどの順で何回渡されるかは決まってなかったような。
(sortで使ってるアルゴリズムにもよるだろうし)
0595nobodyさん04/06/28 09:18ID:???
>>592
Perlの存在自体を否定しているのですね。
0596nobodyさん04/06/28 09:39ID:???
>>592
なるべくなら $a $b は使わない方がいい。
あとは、perl 添付のドキュメントを読む。描き方に関しては perlstyle あたりを中心に。
0597nobodyさん04/06/28 14:51ID:cJ2UZAf9
次のようなリストを読み込んでレコードを追加したいのです
データ区切りは<>を使い文字列にカンマが入っても対応できる
ようにしてあります。
一番先頭のデータを重複の無いキー番号としたいのです

そこでレコード追加時に先頭のデータをチェックして
最大値の次の値と先頭にアルファベットを追加してキー番号を
生成したいのですが、どの様にプログラムを組めばよさそうでしょうか?


A000001<>xxxx<>XXXXX
A000003<>xxxx<>XXXXX
A000010<>xxxx<>XXXXX
A000004<>xxxx<>XXXXX
A000008<>xxxx<>XXXXX
0598nobodyさん04/06/28 15:04ID:???
>>597
既出レコードIDの最大値に+1=追加レコードのID、てわかってるならそうすればいいじゃん。
途中まででもいいから自分でやってみるべし。
0599nobodyさん04/06/28 15:23ID:whqvquC3
<form method="post">で送られてきたデータを
read(STDIN,$in,$ENV{'CONTENT_LENGTH'});

な形で取得しようとしているのですが長い文章の場合に途中までしか取得
できません。

$inを以下のような感じで出力させると、
print $ENV{'CONTENT_LENGTH'};
print length($in);

$ENV{'CONTENT_LENGTH'} が 8205 のときはlength($in)は 8000 と出力され、
$ENV{'CONTENT_LENGTH'} が 9252 のときもlength($in)は 8000 と出力されます。
$ENV{'CONTENT_LENGTH'} が 8000を下回った場合にはlength($in)は同じ数値が出力されます。

どっちにしても8000しかreadが出来ていないようなのですがどうしてなんでしょうか?

環境はIE6 + redhat9 + perl v5.8 です。
0600nobodyさん04/06/28 15:30ID:vj4wrqzo
教えてください。
cgiを直接呼ばれたのとpostで来たのとを区別するにはどうしたらいいのでしょうか?
0601nobodyさん04/06/28 15:33ID:???
readって必ず指定した長さまで一気に読めるわけではないので、
ループしないとだめじゃない? とくに入力元がpipeやsocketのときは
適当にどこかのバッファ長まで読まれた状態でひとまず戻ってくる
ことはよくある。

0602nobodyさん04/06/28 15:36ID:???
>>593
http://perldoc.com/perl5.8.4/pod/func/sort.html
http://flex.ee.uec.ac.jp/texi/perl/perl_54.html

>>599
ご利用の httpd のスレへ行って下さい。

>>600
http://pc5.2ch.net/test/read.cgi/php/1055597189/

>>601
http://perldoc.com/perl5.8.4/pod/func/read.html
http://flex.ee.uec.ac.jp/texi/perl/perl_90.html
0603nobodyさん04/06/28 15:38ID:???
>>599
勉強のためとかじゃなけりゃCGIモジュール使った方がいいような気がする。
060459304/06/28 16:26ID:???
>>594
>リスト中のどれか2つの要素。
>どれがどの順で何回渡されるかは決まってなかったような。
>(sortで使ってるアルゴリズムにもよるだろうし)

ランダムに選ばれた?二つの要素が$aと$bに入れられて、$aの方が大きければ1を等価なら0を
左の方が大きければ-1を返す?$aの方が大きければ$aに入っている要素を左に返す?
$aの中身を左辺に返した場合は元のリストの中からは消えるのですか?

なんかイマイチ流れがわかりません。sort関数については色々見に行きましたが、内部の具体的な
流れが解説されてるサイトが見つかりませんでした;

>>602
perldocは英語ですよね;翻訳かけると関数名まで翻訳されちゃってイマイチ理解できないんですよね;
したのサイトは見たことあります。
0605nobodyさん04/06/28 16:30ID:???
>>604
QuickSortのアルゴリズムを調べてみれ。多分分かる。
0606nobodyさん04/06/28 18:51ID:???
>>602
英語が読めないなら駱駝本を買えばいいのに。
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod

$a と $b に何が入るかは >>602 のページに明示されているし、
sort 関数の使い方ではなくソートアルゴリズムの話ならこの辺
行った方がいいよ。
http://pc5.2ch.net/test/read.cgi/tech/1088022524/
060752604/06/29 04:35ID:???
>>526で質問したものですが、自分で作ったモジュールを@INCに追加したい場合は
use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
か
BEGIN{
push @INC,'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
}
でやるのはわかったのですが、'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test'
は絶対パスでないといけないのですか?

サバにアップしたときの事を考えて相対パスでいいならそうしておきたいのですが、
use lib '../c';
use lib '..\c';
などをやってみたところ文法チェックでエラーがでました。ローカル環境ではライブラリを@INCに
追加する時のパスをドライブ名からの絶対指定でないと無理でしょうか?

環境は
win98/ie6/httpd/activeperl5.6/
です。
0608nobodyさん04/06/29 05:03ID:???
>>607
漏れはローカルとサーバ両方でパスとかを書き換えず動かしたいので、
my $server = $ENV{'REMOTE_ADDR'} eq '127.0.0.1' ? 'http://127.0.0.1/' : 'http://www.鯖.com/' ;
って事をしている。
0609nobodyさん04/06/29 05:55ID:???
>>607
>文法チェックでエラーがでました。
そのエラーメッセージを書こう。

ちなみに相対パスの指定は可能。存在しないパスを指定する事も可能。
e.g. use lib qw(../ /home/you/lib/perl E:/lib/perl);

>>608
use CGI ':cgi';
print server_name();
061060704/06/29 06:07ID:???
>>608
それいいですね。でも相対指定ができるならそのほうが楽ですが。
>>609
エラー文は以下の通りです。続いてファイルの中身を挙げます。

C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI
Can't locate Test1.pm in @INC (@INC contains: ../c D:/Perl/lib D:/Perl/site/lib
.) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI line 3.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
\A.CGI line 3.
061160704/06/29 06:09ID:???
a.cgiの中身

#!/usr/local/bin/perl
use lib '../c';
use Test1;
#京
print "Content-type:text/html;charset=euc-jp\n\n";
print "aiueo";

Test1.pmの中身

package Test1;
#京
sub new{
my $self = shift;
my $obj = {a => 1 , b => 2};
bless $obj,$self;
}
1;

a.cgiのlibの一行を
use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test\c';
にするとオーケーがでます。\を/に変えてもオーケーはでます。

相対パスにすることは可能でしょうか?
0612nobodyさん04/06/29 06:16ID:???
質問!
演算子って同じような意味のものがあったりするけどどうしてでしょうか?
>や<の比較系は
数値用として<,>,==,<=,>=
文字列用としてgt,lt,eq,ge,le

それで、
and,or
と
||,&&
も用途別なんでしょうか?優先順位は||,&&の方が高いみたいですが。
これも
数値用||,&&
文字列用or,and
なのですか?でも
$a == 1 || $a == 2
ならいいですが、
$a == 1 || $a eq "ふたつ"
の場合は||とorのどちらを使えばいいでしょうか?
0613nobodyさん04/06/29 06:22ID:???
CGIで単純にtextを出力してブラウザに表示させたいのですが
ブラウザで開くとダウンロードのダイアログが開いてしまいます。
ダウンロードではなくそのままブラウザに表示したいので
アドバイスをください。
以下のようにして出力しています。

#!/usr/bin/perl
print qq(Content-type: text/plain\n\n);
print "minapon";
exit;

宜しくお願いします。
0614nobodyさん04/06/29 06:23ID:???
$fooの「何文字目まで」を抜き出す、というやり方はありますか?
ありましたらお教え下さいますようお願いいたします。
061560704/06/29 06:29ID:???
>>614
$newfoo = substr $foo,hoge1,hoge2,"hoge3";

hoge1=オフセット。取り出しの起点。
hoge2=取り出す長さ。
hoge3=取り出した後にそこに何か入れる場合は。取り出したものを削除するなら""とする。

詳しくは
perl substrでググれば見つかるかと。
061660704/06/29 06:32ID:???
>>613
#!/usr/local/bin/perl
print qq(Content-type:text/plain\n\n);
print "qwertyui";
exit();

をローカル環境でやったけど何も問題はなく表示されたよ?
0617nobodyさん04/06/29 06:50ID:???
>>613
激しく板違い。Web鯖の設定。

Options ExecCGI
AddHandler cgi-script .cgi
AddType application/x-httpd-cgi .cgi

各行の意味を確認したうえで好きなようにどうぞ。
0618nobodyさん04/06/29 06:52ID:???
>>616ありがとう御座います
私の環境で>>616のコードでローカルでテストしてみましたが
やはりDLのダイアログが開きます
サーバにアップロードしても同じでした。

ブラウザ側の問題かも知れませんが
ちゃんとtextをブラウザで開ける場合もあるし・・・
0619nobodyさん04/06/29 09:51ID:???
DLダイアログ上のファイル名はなに?
DL後のファイルの中身はなに?
HTTPサーバーは?ブラウザは?

まぁ、どっちにしろサーバー設定かブラウザの問題だね。
0620nobodyさん04/06/29 10:18ID:???
どういう環境でやってるか知らんが、MIMEタイプ周辺の問題じゃないか?
0621nobodyさん04/06/29 10:50ID:???
>615
有難う御座います。
Perlのリファレンス見てたんですが、語句が思い当たらなかったのでたどり着けなかったんです。
ホントに助かりました。
0622nobodyさん04/06/29 14:33ID:???
MD5暗号化、照合ライブラリってないものでしょうか。
cryptがサーバ対応してなくてMD5使えないもので、
教えていただけたら幸いです。
0623nobodyさん04/06/29 16:29ID:???

- - - - - Perl コーディング初心者質問コーナー Part35 - - - - -
0624nobodyさん04/06/29 16:46ID:???
>>622
MD5.pm

>>612
おそらく優先度の違いだけかと。 好みの問題だけど、括弧を減らしたいときなどに、and, orを使うといいと思う。
らくだ本ではand, orのほうが自然だからこっちのほうがいい、見たいなことがかかれていた気がしないでもない。
0625nobodyさん04/06/29 17:19ID:???
>>611
> C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI
C:/WINDOWS からの相対パス ../c は C:/c で

C:/c/Test1.pm
D:/Perl/lib/Test1.pm
D:/Perl/site/lib/Test1.pm
./Test1.pm

のいずれも見つからないとエラーメッセージが言っているわけだが。

>>612
http://perldoc.jp/docs/perl/5.6.1/perlop.pod
062660704/06/29 21:39ID:???
>>625
ありがとうございます。早速
use lib 'C:/c';
にかえてやってみました。

C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI

Can't locate Test1.pm in @INC (@INC contains: C:/c D:/Perl/lib D:/Perl/site/lib
.) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI line 3.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
\A.CGI line 3.

というエラーでした。
C:/c D:/Perl/lib D:/Perl/site/lib
少しエラー内容が変わりましたがやはり駄目なようです。
0627nobodyさん04/06/29 21:47ID:???
>>626
おいアホかC:/cの中にTest1.pmがあんのかよ!?
0628nobodyさん04/06/29 21:49ID:???
>>626

>>625の
>C:/WINDOWS からの相対パス ../c は C:/c で
ってのは
 C:/WINDOWS からの相対パス ../c は C:/c のことだ
の意味だ(と思われる
0629nobodyさん04/06/29 22:17ID:???
>>626
> use lib 'C:/c';
> にかえてやってみました。

>>625がコケてそう。

use lib '../../../cgi-bin/test/c';

C:\WINDOWS>cd デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
C:\略>perl -c a.cgi
063060704/06/29 22:46ID:???
>>627-629
すみません。

>>629
C:\WINDOWS>cd デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
これをやって移動した場合はlibはなくてもエラーはでないです。
質問としましては、どのフォルダからでも文法チェックができるように自作モジュールを
コンパイルの初めに@INCに追加してやりたいんですが、そのモジュールのある場所を相対指定できませんか?
ということです。

それで一応
use lib '../../../cgi-bin/test/c';
use lib 'C:../../../cgi-bin/test/c';
に変えて試しましたが、やはり下のエラーでした。(1行目の場合のエラー内容です。)

C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI
Can't locate Test1.pm in @INC (@INC contains: ../../../cgi-bin/test/c D:/Perl/li
b D:/Perl/site/lib .) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI line
4.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
\A.CGI line 4.

>>628
ここまで書いて今気づきました。
>C:/WINDOWS からの相対パス ../c は C:/c で
../cはC:/cと書いてるのと同じことになるってわけですね;すみません勘違いしました。

それでやはり相対指定はムリなのでしょうか?
063160704/06/29 22:50ID:???
今やっと気づきましたが、この場合の相対指定っていうのは、コマンドプロンプトの現在位置
からによる相対していなのですね?合ってます?

そうなるとコマンドプロンプト自体がフォルダ移動すると、パスが変わってくる。だからムリ?

でもなんかまだ勘違いしてるかもしれません。a.cgiに書くパスを相対パスにすると
何に対しての相対になるんでしょうか?a.cgiではないですよね?
0632nobodyさん04/06/29 23:22ID:???
>>631
> use lib '../../../cgi-bin/test/c';
スマソ、↑寝ぼけてますた。
吊ってきます。

カレントディレクトリ。
063360704/06/29 23:30ID:???
>>632
カレントディレクトリということはやはり、プロンプト画面の現在作業場所からということになり、
結局libは相対指定が効かないということでよろしいでしょうか?
0634nobodyさん04/06/29 23:43ID:d2XzHbrj
変数に入っている特定の文字の長さを調べるにはどのようにすればよいでしょうか?
$test = abc123;
と入っている場合、数字の数だけ調べたいのです。
どなたか、ご教授お願いします。
0635nobodyさん04/06/29 23:47ID:???
>>633
気づいてなかったんか。 DOSの作業ディレクトリだべ
063660704/06/29 23:59ID:???
>>635
ですよね。でもそうなると、libに渡すパスは相対指定が不可能ですよね?
でも>>609さんが相対パスは可能と言っていたのでよくわかりません。

ちなみにサーバにあげた場合もlibのパスを相対で書くと、DOS(UNIX系なので違うぽ)作業ディレクトリ
が基準になりますよね?

その場合はDOSは自動で、a.cgiがある場所まで移動してからコンパイルを行うのでしょうか?
そうだとするとサバ上ではa.cgiがあるフォルダからの相対パスで行けますよね。
でもわざわざ作業ディレクトリを移動してからコンパイルなんてしませんよね。

結局相対パスはあまり使い物にならないんですかね。サバのカレントディレクトリから書けば
サバでは相対にできそうですがやはり絶対指定しておくのが無難ぽいですね。

長くお付き合いいただきありがとうどざいました。失礼します。
063760704/06/30 00:00ID:???
>>634
まずは正規表現で数字だけ抜き出して、その長さを測ってみてはどうでしょうか?
0638nobodyさん04/06/30 00:18ID:???
>>632 >>636
スクリプト中に書かれた相対パスは全てカレントディレクトリからの
相対パスであって、スクリプトが置かれているディレクトリからの
相対パスではない。@INC に相対パスを指定する事は可能だが、
君が常にスクリプトの置かれているディレクトリをカレントディレクトリ
として起動しない限り、期待するディレクトリを指す事にならない。
故に、モジュールやライブラリは通常特定のディレクトリに置き、
絶対パスで指定する事でどこからでも利用可能にする。

どうしてもスクリプトが置かれているディレクトリからの相対パスを
使いたいのなら、スクリプトの最初に以下のような阿呆らしいコード
を追加する事で可能になる。

BEGIN {
  __FILE__ =~ m|^(.*[/\\])[^/\\]+\z|;
  require 'lib.pm';
  lib->import($1 . '../log');
}
0639ウド04/06/30 18:25ID:???
サーバー:Turbo Linux、apache1.3.xx、Perl5
クライアント:WindowsXP Pro
これまで同じスクリプト(簡単なメモCGI)をWindows2k、apache2.0.x、perl5にて動作させておりました。
サーバー変更に伴い、文字コードをshift-jisからeucに変更しました。

Windows2kサーバーにて動作させたところ正常に動作しました。
確認後にLinuxに移しました。
Linuxにて動作させたところ、Winクライアントから書き込んだらログファイルの
文字コードがshift-jisにて保存されてしまい、正常に動作しなくなりました。

考えられる原因はなんでしょうか?
ログファイル、スクリプトファイルともにEUCにて保存、アップロード。
cgi-lib.pl使用、jcode.plは使用していません。
データの受け取りは&ReadParse(*form);として、form{'comment'}として
うけとっています。
フォームはvalue=\"comment\"です。
スクリプトの先頭で文字コードをeuc-jisと設定しています。
0640ウド04/06/30 18:54ID:???
追記
ログファイルに少しでもデータがある場合(追記のような状態)、ログファイルに
セットされた文字コードが適用されるようです。
print OUT,">log.dat";とかにすると、文字コードがshift-jisに再セットされてしまいます。
Linuxからの入力は問題ありません。
0641nobodyさん04/06/30 21:37ID:???
(スクリプトファイルではなく、)フォームのページの文字コードをEUCに変えてみよう。
もしくは、CGI側でEUCに変換してもいいと思う。
あと、cgi-lib.plはもういらないでしょ。jcode.pmかencode.pmを使おう。
0642nobodyさん04/07/01 08:22ID:???
>>639
CGIで使うのならわざわざEUCに変えなくても動くでしょ。
0643ウド04/07/01 10:36ID:???
>>641
フォームも同一スクリプトで生成しているので、ヘッダではeuc-jisで指定しています。
cgi-lib.plはフォームのハッシュを扱うのに楽だったので使用していました。
今、CPANからJcode.pmを取得しインストールしました。
これと組み合わせて使ってみます。
アドバイスありがとうございました。

>>642
動きますが、個人的にEUCが好きなものでして。
製作するスクリプトのコードもEUCにしている為なにかと都合がいいのです。
0644nobodyさん04/07/01 12:52ID:oq3ug3s3
>>598
EXCELにあるような最大値を求める関数がみあたらないのですが、どうしたらいいものでしょうか?
0645nobodyさん04/07/01 13:10ID:???
>>644
それぐらい自分でサブルーチンを作りましょう。
0646nobodyさん04/07/01 13:16ID:???
>>644
record.txt
--
A000001<>xxxx<>XXXXX
A000003<>xxxx<>XXXXX
A000010<>xxxx<>XXXXX
A000004<>xxxx<>XXXXX
A000008<>xxxx<>XXXXX
--
open IN, 'record.txt' or die "$!\n";
while(<IN>){
chomp;
$record{(split(/<>/,$_))[0]} = $_;
}
print (((sort keys %record))[-1]);
--
出力:A000010

昇順に並べれば一番後ろが最大値
降順に並べれば一番最初が最大値
0647nobodyさん04/07/01 15:27ID:???
>>644
List::Utilのmax使え。速いぞ。

ttp://pc5.2ch.net/test/read.cgi/tech/1085564875/71-72
0648 ◆u2YjtUz8MU 04/07/01 21:05ID:???
gifやjpeg画像を表示するときに
画像の大きさが一定以上大きいときだけ
縮小して表示したいのですがどうやればいいか教えてください。
よろしくお願いします。
0649nobodyさん04/07/01 21:25ID:???
>>648
if(でっかい時){ 縮小処理や縮小表示 }
else{ そのまま表示 }
これのどの部分が分からんのだ?
そのことを>>1の書き方で表すとどうなるのだ?
0650nobodyさん04/07/01 21:25ID:???
黙れ。
065164804/07/01 21:31ID:???
画像の幅を知るにはどうすればいいですか?
また、画像の縦と横の比率を崩さずに
横幅を100〜150にして表示したいときの
うまい方法はありませんか?
0652nobodyさん04/07/01 21:33ID:???
タグぐらい勉強しろよ
0653nobodyさん04/07/01 21:37ID:???
>>651
フリーの画像掲示板とかのソースを参考にしたらいい。
0654nobodyさん04/07/01 21:46ID:???
PerlMagickとか使えばいいんじゃないのかね?
0655nobodyさん04/07/01 21:49ID:???
>>651
「gif perl 画像サイズ」でググる。jpgの場合も同様。
画像サイズ取得ライブラリって形で公開してる人が多いなぁ。
ゴリゴリ書くサンプルが多いだろうと思ってググってみたんだが....
> 画像の縦と横の比率を崩さずに横幅を100〜150
こりゃ、中学か下手すりゃ小学校で習う計算だな。
0656nobodyさん04/07/01 22:48ID:???
>>651
Image::Size
あと、htmlだけどwidthだけしてすればheightは自動で同率で表示する。
>  こりゃ、中学か下手すりゃ小学校で習う計算だな。

だな
0657nobodyさん04/07/01 23:55ID:???
>>643
書きまちがいだと思うけど、euc-jpね。
あと、ブラウザが自動的に判断してくれるはずだから、
HTTPヘッダとかMETAタグとかは使わずに、何もせずにHTMLの出力をやってみたらどうだろうか。
065864804/07/01 23:55ID:???
みなさんありがとうございました。
一応完成しました。
ひまつぶしに見てください。
http://www.tcn.ne.jp/~majima/dog/quiz/quiz.cgi
0659nobodyさん04/07/01 23:56ID:???
そう言えば、GIFの特許切れに絡んで、GDのバージョンアップってあったんだろうか?
0660nobodyさん04/07/02 00:02ID:???
jcode.plでエラーが出てしまいます。

[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.
[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.
[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.
[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.
[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.
[Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe
) in pattern match (m//) at /home/admin/jcode.pl line 362.

何かこのエラーに関して心当たりがおありの方いらっしゃい
ましたらご教授ください。
0661nobodyさん04/07/02 00:03ID:???
>>648さん
いいと思いますけど、1点、
<input type="hidden" name="file_name" value="question1.dat">
の部分はセキュリティ上、良くないです。
このhiddenのタグは使わないような仕様にしましょう。
何で良くないかここで説明してもいいんだけど、これで逮捕された人がいたからな…。
0662nobodyさん04/07/02 00:06ID:???
>>660
jcode.plがUTF8に対応してないんじゃないの?
0663nobodyさん04/07/02 00:08ID:???
>>660
>>662も書いてるけど、
「jcode.pl Jcode.pm UTF-8」でググってみれ。
066464804/07/02 00:13ID:???
セキュリティ上良くないのはわかりますが
うまく回避する方法が思い浮かびません。
今回の場合はたいして問題ないですよね?
0665nobodyさん04/07/02 00:26ID:???
うーん。詳しく調べてないんで、なんともいえないけど。
datファイルをopenするとき、ちゃんとパスのチェックしてる?
..が含まれていたり、や/から始まる場合はエラーにしないとだめだよ。
どっちにしろ、下のページは一通り読んでおいたほうがいいよ。
http://www.ipa.go.jp/security/awareness/vendor/programming/a00.html
0666nobodyさん04/07/02 00:49ID:???
>>664
( ゚д゚)あの板でやってたこのクイズ作ってたのはお前かよっ!
どこが問題ないってよ。
http://www.tcn.ne.jp/~majima/dog/quiz/question4.datにアクセスしたら
答え全部わかっちまってるだろうが。

そもそもなんで問題を書いたファイルをhiddenで渡す必要があるんだ?
0667質問04/07/02 00:58ID:dBU8jv45
perl のスクリプト中でディレクトリを作成したら、パーミッションが変になり、削除できません。

ユーザーは www、グループも www、そしてパーミッションが301(-wx --- --t)になってます。
mvでリネームは出来ます。さらに cd で中に入ることは出来ますが、ls しても何も見えません。

そのサーバでは、CGI(Perl)、telnet、ftpが使用できますが、私はスーパーユーザーではありません。
rmdirをする簡単なPerlスクリプトを書いたり、rm -f -d directryとやってもダメでした。

分かる方が居たら、教えてください。・゚・(ノД`)・゚・。
0668nobodyさん04/07/02 01:07ID:???
stickyビットが立ったんだな。で、ログインユーザとWEBサーバの実行ユーザが違う、と。
CGIでchmod(0777)かな?ってやって、その後、telnetで入って削除すればいいよ。
0669nobodyさん04/07/02 01:11ID:???
>>662-663
ご返答有難うございます。
UTFで指定しているところはないのですが、何かの
文字がUTFと認識させてしまっているという解釈で
宜しいのでしょうか。
067064804/07/02 01:12ID:???
>>665
貴重な情報ありがとう。
openするときに..とかが含まれてたらエラーにしました。
>>666
とりあえずそこ直します。
067166704/07/02 01:19ID:dBU8jv45
>>668
削除できました。

rmやrmdirじゃなくて、一旦 chmod するのは盲点でした。
即答&的確な指示、ありがとうございました。本当に助かりました。・゚・(ノД`)・゚・。
0672nobodyさん04/07/02 01:21ID:???
>>670
いや、エラーにするとかじゃなくてデータファイル名はスクリプトに直で書けよ。
他にも設計やコーディングの誤りがありそうな予感・・・

↓ここで添削してもらえ。
自作CGIを評価するスレ
http://pc5.2ch.net/test/read.cgi/php/1049514428/
067364804/07/02 01:28ID:???
>>672
ありがとう。
複数の問題ファイルをランダムに選んでるので
ファイル名を直でかくのは無理だと思っています。
とりあえず添削してもらってきます。
0674nobodyさん04/07/02 01:37ID:???
@questions = ("q1.dat","q2.dat","q3.dat");
って書いておいて、
<input type=hidden name=question value=0>
ってやればいい。valueが添え字ね。
0675nobodyさん04/07/02 11:08ID:???
print <<"EOF";などでHTML表示する場合の質問です。
HTMLのインデントを揃えたいと思っているのですが、

print <<"EOF";
<HTML><HEAD></HEAD><BODY>
EOF

こう書くと、<BODY>とEOFの間に改行コードがあるために、続けてHTMLを出力すると、

<HTML><HEAD></HEAD><BODY>
</BODY></HTML>

のようになってしまいます。
print <<"EOF";を使っても、一番最後の改行コードを含めないようにする書き方はあるのでしょうか?
0676nobodyさん04/07/02 11:46ID:???
print "<HTML><HEAD></HEAD><BODY>";

これじゃダメなん?
""の中で改行できるし、"自身が存在するならqq使うかエスケープすりゃいい。
0677nobodyさん04/07/02 11:46ID:???
>>675
そもそもはじめから print "<HTML><HEAD></HEAD><BODY>"; とするか、
適当に変数に入れてお尻の1文字削るのが普通だと思われる。

どっちも嫌なら

print @{[<<"EOF" =~ /(.*).$/s]};
<HEML><HEAD></HEAD><BODY>
EOF

とかってのも可能だがオススメしません。
0678nobodyさん04/07/02 12:48ID:???
eval関数って使い方によっては危ないみたいですけど、こういう使い方でも危険ですか?

(test.txtの中身)
あいうえお
%{$obj->{form}}

(hoge.cgiの中身)
use Hoge2;
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'};
my &obj = Hoge2->new($buffer);

open(FH,"test.txt")
while( <FH> ){
if( $_ !~ /\$/ ){ print;
}else{
print eval $_; }
}
close(FH);

(Hoge2.pmの中身)
sub new{
my $self = shift;
@a = split/&/,shift;
foreach( @a ){
(my $a , my $b ) = split/=/;
$form{$a} = $b;
}
bless,{form => {%form}},$self;
}
1;
0679黒死犬 ◆EgxBlf8nvc 04/07/02 13:26ID:???
test.txt が常にあなたの管理下にあって、
他の人が変更不可能な状況ならば問題ナッシング
068067804/07/02 13:33ID:???
>>679
ありがとうございます!txtファイルの管理には気をつけます。

print eval $_;

の部分でもしも%formの中にPERLの命令文が入っていた場合とかに実行されちゃうのか
不安でしたが、↑では変数展開されるだけで終わるみたいですね。
展開された内容を再びevalにかけさえしなければ安全ってことですね。

ありがとうございました。
0681nobodyさん04/07/02 14:25ID:???
>>678
print eval(eval $_);
としなければセキュリティホールにはならないと思う。
0682nobodyさん04/07/02 14:33ID:???
>>678
見た感じCGIっぽいのでもしそうならXSSには注意しろよ。
■ このスレッドは過去ログ倉庫に格納されています