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

このエントリーをはてなブックマークに追加
925nobodyさん:04/07/10 08:09 ID:???
926nobodyさん:04/07/10 08:10 ID:???
>>924
あんたにゃ無理かもしれんが、
エンコード文字列だけのスレの54がすごいぞ
http://pc5.2ch.net/test/read.cgi/php/1065258181/54

縦読みっていうレベルの話じゃないぞ。
見たら「ビックリ」するぞ。
漏れも初めてあのスクリプトを見たとき、perlの行き着く先には絶望しかないかと思ったよ。

じゃ、がんばって解凍してね。
927nobodyさん:04/07/10 12:46 ID:???
>>926
つーか、エバッてるから、ちーともびっくりしない。
928nobodyさん:04/07/10 14:43 ID:???
ユーはパアルのなにが知りたいんだい?

答えてやるよ!
929nobodyさん:04/07/10 15:06 ID:???
存在価値
930nobodyさん:04/07/10 15:31 ID:???
そうかい。ユーは存在価値が知りたいのかい。

存在していて、害にならなければ存在価値はあると言っていいだろう。

でも大事なことを教えてやろう。パアルのコージングとは無関係な質問ね。
931870:04/07/11 06:02 ID:???
あがいて結局できなく、半べそかいてもどってきました870です。

>>888
一応&Form_Input();にはしてあります。
それで、アドバイスがあった
  print $input{'1'} ;
を入れてみたのですが、表示されません。
一応ソースですが、再アップしてみたので、よかったらご覧になってください。

もう自分挫折しそうですorz
どなたか、愛の手を・・・
932nobodyさん:04/07/11 06:15 ID:???
>>931
print "Content-type: text/html;\n\n";

それと、ソースのファイル名が100q.zipじゃなくて100.zipになってたぞ。
933932:04/07/11 06:50 ID:???
>>931
ヘッダの問題じゃなかったのかな?

print $input{'1'} ;
って何を表示するのかわかってる?
print $input{$_} for 1..100; こうした方が君にはいいかも
>>888
$input{'1'}

foreach (1..100){
print qq($_ : $input{$_} <BR>\n);
}
にしてみる。
>934 Perlスレッドでのレスありがd
こんなスクリプトを書きましたが、結局画像の形だけが表示されてしまいしまた。
画像を出して、Locationで飛ばしたかったんだけど。
#!/usr/local/bin/perl
$image = "./image.gif";
$SIG{ALRM} = \&timeout;
#GIF画像の出力
sub timeout{
print "Location: http://******/success.html\n\n";
alarm 0;
exit;
}

alarm 5;

print "Content-type: image/gif\n\n";
#画像の書込
open(IMG,"$image");
binmode(IMG);
print <IMG>;
936935:04/07/11 18:26 ID:???
あ、「GIF画像の出力」コメントは、なしです。
937nobodyさん:04/07/11 21:09 ID:???
ttp://****/*.cgi?f=filename.jpgで
filename.jpgへリンクしたhtmlを出力させたいと思ってます。

<a href="特定のURL指定/$f">●</a>とおいたときに$fがfilename.jpgじゃなく空白になります。
filename.jpgを出力するために何か処理が必要になるのでしょうか?
htmlの出力、URLの指定などは問題なしです。
アドバイスお願いします。
938nobodyさん:04/07/11 21:16 ID:???
>>937
>>1
> 1: 自分はこう言う事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。

2が抜けてる。
?f=filename.jpg を $f にどうやって代入してるの?
939937:04/07/11 22:16 ID:???
>>938
レスありがとうございます。
?f=filename.jpgが$f指定してると思ってたので特に記述してなかったです。

?f=のような指定について調べてみたのですが、参考になるページが見つかりませんでした。
情報ありましたらアドバイスいただけないでしょうか?
940nobodyさん:04/07/11 22:26 ID:???
>939
QUERY_STRINGでぐぐれ。
941nobodyさん:04/07/11 23:12 ID:YH96401L
PHPだと
$array[] = "apple";
とすると配列の最後に"apple"を追加してくれるのですがこれをPerlでやる場合
簡単な方法ってどうやりますか?
942nobodyさん:04/07/11 23:14 ID:???
>>941
push
943nobodyさん:04/07/11 23:20 ID:???
どもです
944937:04/07/12 01:23 ID:???
>>940
ありがとうございます。解決しました。
945nobodyさん:04/07/12 09:47 ID:???
>>942
pushって遅くね?
946nobodyさん:04/07/12 10:17 ID:???
GD::Graphでグラフを描こうとしてるんだけど
$gd=$graph->plot(\@data);
open(IMG, '>test.gif' ) or die $!;
binmode IMG;
print IMG $gd->gif; ★
close IMG;

★のところで Can't call method "gif" on an undefined value
pngにしてもだめなので、ここで何をサポートしているのか知りたい。
サポートしているファイル形式を知るためのメソッドってありますか?
947nobodyさん:04/07/12 10:35 ID:???
>>946
ソースを読め
948nobodyさん:04/07/12 10:39 ID:???
>>945
SVとかPVとか何のことだか分かる?
949nobodyさん:04/07/12 11:03 ID:???
配列に小数点を入れるとき
@a = qw( 0.1 0.2 0.3 );
だとちゃんと入るんだけど
@a = { 0.1, 0.2, 0.3 };
だとなんかすっげー数字が入っている
なんでだすか?
950nobodyさん:04/07/12 11:26 ID:???
@a = ( 0.1, 0.2, 0.3 );
951nobodyさん:04/07/12 11:44 ID:???
>>950
なんですっげー数字が入るのか聞いているんだすよ。
952949:04/07/12 11:48 ID:???
>>950
ああ、そうだった
サンクスコ

>>951
確かにそれも気になるけど
953nobodyさん:04/07/12 12:53 ID:???
>>951
my @a = { 0.1, 0.2, 0.3 }; # ハッシュリファレンス 1 つを @a に代入
print @a, "\n"; # リファレンスを文字列として評価 → "HASH(0x10c1350)"

# 文字列 "HASH(0x10c1350)" を強制的に数値コンテキストで評価
# 0x10c1350 → 17568592
$_ += 0 for @a;

print @a, "\n"; # 17568592
954nobodyさん:04/07/12 12:58 ID:???
>>953
正確には文字列→数値じゃないな。リファレンスを数値コンテキストで
評価するとアドレスの値が返る。
955nobodyさん:04/07/12 13:28 ID:???
>>953
あ、なるほど。
956nobodyさん:04/07/12 19:33 ID:???
サブルーチンにファイルディスクリプタを渡したいんですが
957nobodyさん:04/07/12 20:56 ID:???
perlスクリプトをHTMLに埋め込むことって出来ますでしょうか?
例えばpingを打ちたいと思ったら
CGIだと
クライアントから要求→サーバがping実行→クライアントに実行結果を返す
ですが、
HTMLの中にスクリプトを埋め込むことによって、クライアントからpingを打つことは可能でしょうか?
うまく意味が伝わらなかったらごめんなさい_no
958nobodyさん:04/07/12 21:16 ID:???
>>957
無理
959nobodyさん:04/07/12 21:26 ID:???
960957:04/07/12 21:40 ID:???
>>958
回答ありがとうございます。
ゼミの教授が「タグで簡単に出来る」と言ってきて、
自分なりに色々調べたのですが、全くそのような情報がなかったので質問させて頂きました。
胸を張って「そんなこと出来ませんよ」って言いたいと思います!
961nobodyさん:04/07/12 21:52 ID:???
>>960
お前さ、一つ前のレスも読めないのか?
962nobodyさん:04/07/13 03:39 ID:???
いいじゃん
恥かくのは本人なんだから
963nobodyさん:04/07/13 05:45 ID:???
>>960
ゼミの教授は嘘つきだ
Perlにタグなどない!

だいたいHTMLに埋め込むのってCGIじゃなくてSSIでしょー
確かにSSIをHTMLに埋め込むのはタグだけどなぁ
964nobodyさん:04/07/13 06:00 ID:???
>>963
学生「先生!あのpingの話ですけど、できませんよ!」
教授「ほう、何か調べたのですか」
学生「はい。調査の結果、2chのnobodyさん(958)が『無理』と。句読点なしで」
教授「…帰れ」
…こんな感じのコじゃないかな。

「タグで出来る」ってのも、>>960さん用語に変換されてるだけかもしれない。
965nobodyさん:04/07/13 08:12 ID:???
ヘッダをimage/gifとかにして、
「<img>タグ」でアクセスとかだったら、
ちょっと、いぢわるだなぁ、その教授。
>957とりあえずガンガレ。。
966nobodyさん:04/07/13 11:28 ID:???
HTMLの中にperlを埋め込むだけなら PERL_SSI とかいう手もあるが、
「クライアントからpingを打つ」てのは難しそうに思えるなあ。
それができるとたぶん物凄いセキュリティホールになる。
967nobodyさん:04/07/13 12:36 ID:???
だから
無理
って言ったんですけどね・・・
968nobodyさん:04/07/13 13:17 ID:Q7wc8BxW
特定のフォルダにあるファイルを表示し、ファイルにリンクを張り、ファイルサイズとアップロードされた時間を表示しています。

print "<table>\n";
print "<tr><th>No.</th><th>FileName</th><th>FileSize</th><th>UploadTime</th></tr>\n";

opendir(DIR, "$dir" ) or die;
while(my $filename=readdir(DIR)){
    if($filename=~/^\.{1,2}$/){
        next;
    }
    ++$no;
    @fileinfo = stat("$dir$filename");
    $upldtime = &time($fileinfo[10]);
    $filesize = int ($fileinfo[7] / 1024);
    $filesize = ~ s/(\d)(\d\d\d)(?!\d)/$1,$2/g;
    print "<tr><td>$no</td><td><a href=\"$dir$filename\">$filename</a></td><td>$filesize KByte</td><td>$upldtime</td></tr>\n";
}
print "</table>\n";
closedir(DIR);

左端からNo.、ファイル名、ファイルサイズ、アップロードされた時間・・・と4つ並びます。
ここで、「アップロードされた時間」を基準にして、時間の新しいものから順にリスト表示したいのですが
根本的にやり方がわかりません。
whileより上でソートしていないといけないような気もするのですが・・・
誰か教えてください。。

&timeはここには出ていませんが、yyyy/mm/dd hh:mm:ss形式で表示させるためのサブルーチンです。
969nobodyさん:04/07/13 13:22 ID:???
>>968
lsの結果を出力すればいいじゃん?
970nobodyさん:04/07/13 13:33 ID:???
アップローダー作っておきながら、ソートもできんのか・・・
971nobodyさん:04/07/13 13:38 ID:???
>>968
whileの中でhtml出力まで一気にやらなけりゃいいんじゃないの?
while内でhashなりにデータ格納して、
後で好きなようにソートなり何なりしてHTML出力すれば?
972968:04/07/13 13:57 ID:Q7wc8BxW
みなさまありがとうございます。

>>969
system "ls -lt" >hoge.txt
・・・みたいな感じですね。system禁止されてなきゃいいのですが。

>>970
そうか。
アップローダーCGIを参考にすればよかったのですね。
全然思いつきませんでした。

ファイルのアップはFTPです。アップローダーなんて高機能なもの、まだ作る腕がありません。。

>>971
perlのsortを調べてて、「先頭からn番目(今回の場合は4番目)のものをキーにして・・・」というのが、探し当てられませんでした。リャマ本にも「すぐわかるperl」にもなかったですし、いろいろ探し回ったのですが。。
・・・と書いてて今思いつきました。
タイムスタンプを先頭に格納すればいい?

がんばってみます。 
973970:04/07/13 14:03 ID:???
>>972
>ファイルのアップはFTPです。
そうだったのか・・・スマンコ
974nobodyさん
print <<"EOS";
<table summary="アップロードされたファイルの一覧">
\t<tr><th abbr="番号">No.</th><th abbr="ファイル名(リンク)">FileName</th><th abbr="サイズ(Kilo bytes)">FileSize</th><th abbr="アップロード時刻">UploadTime</th></tr>
EOS

my $count = 0;
local *DIR;
if (opendir DIR, $dir) {
foreach my $filestatus (
sort { $b->[3] <=> $a->[3] } # 最新更新時間を降順に並べ替え
map { [ $_, qq|$dir/$_|, (stat qq|$dir/$_|)[7,9] ] } # [ファイル名、ファイル位置、ファイルサイズ、最終更新時間]
grep { !/^\.+/ } # . .. を排除
readdir DIR # 読む
) {
printf qq|\t<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n|,
++$count, # ファイル番号
sprintf (qq|<a href="%s">%s</a>|, $filestatus->[1,0]), # ファイル名とそのリンク
sprintf (qq|%s KBytes|, int($filestatus->[2]/1024) =~ s/(\d)(\d\d\d)(?!\d)/$1,$2/eg), # サイズ(KBytes)
×tamp($filestatus->[3]) # 最終更新時刻
}
}
print qq|<td colspan="4">ファイルがないかも (´・ω・`)</td>\n| unless $count; # $count が 0 ならば
print <<"EOS;
\t</tr>
</table>
EOS

脳内処理につきご勘弁m(_ _)m