Perl コーディング初心者質問コーナー Part35
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
04/05/26 16:48ID:kkhhiYmo【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0877nobodyさん
04/07/08 22:51ID:???0879nobodyさん
04/07/08 23:00ID:???sub Form_Input {
my($buffer,@pairs,$value,$name);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs =split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$input{$name}=$value;
}
}
を最後の行にぶち込み、%Form_Input(); を条件分岐(# メイン処理 つーところ)の前で呼びだし、$mode を $input{'mode'} に変更し、
サブルーチン、registを、
sub regist {
&header;
print "$buffer";
&footer;
exit;
}
とすればとりあえず動く。長くてスマソ。
0881nobodyさん
04/07/09 01:31ID:???0883nobodyさん
04/07/09 02:16ID:???0886nobodyさん
04/07/09 02:27ID:???俺も>>882見た瞬間に
「なんでそうつなげるんだろ?面白い人だなぁ」
と思ったんだけどな。
俺も必死杉な質問者扱いされる仕様なのか…。
# このスレ、どうなっとるんだ?
>>866
% vi ~/tateyomi.pl
0887870
04/07/09 08:45ID:???レスありがとうございます。
ご指摘があった箇所を書き換えたところ、一応動きました。
が、$bufferが書き出されません・・・。
sub Form_Input の処理というのは
Formデータを読み込んで$bufferにいれ
それを&で切り分けたものを@pairsにいれる。
@pairsに入れたものを=でさらに分けて、$nameと$valueにいれる。
$valueに対してデコード処理。
で合ってますか?
これならば、$bufferは生データが表示されるはずですよね・・・。
(´ヘ`;) う〜ん・・・
もうちょっと頑張ってみます。
0888nobodyさん
04/07/09 11:39ID:???%Form_Input();じゃなくて&Form_Input();だよな。キー隣だもんな。
>>870
ソース見れないので、間違ってたらスマソ。
print $input{'1'} ;
にするとどうなる?
0889863
04/07/09 11:42ID:???朝起きて、もう一度みたら気が付いた・・・・。
>>880以降の人たち
漏れには0時過ぎに起きて2ちゃんやれるほどの元気はないぞ・・・いいな若いって。
0890nobodyさん
04/07/09 11:44ID:6LTGfdJzif ($aaa_tel eq $bbbtel){print "同じ電話番号が存在します。";}
こうしたソースで、$aaatelが0123-45-6789の場合、$bbbtelの中が
0123456789や、01-2345-6789、012-345-6789、012-345-6789
0123-45-6789、01-2345-6789なども
同じ番号と判定して警告を出すためには、どのように書き直した方が
いいのでしょうか?
0892nobodyさん
04/07/09 12:04ID:???とかやった上で比較するわけだな。
一般には「正規化」と呼ばれる。
0893890
04/07/09 12:05ID:6LTGfdJz0894nobodyさん
04/07/09 12:11ID:???0897nobodyさん
04/07/09 13:37ID:???1. 双方とも全角→半角する。Encode でも Jcode でも。
2. 双方とも tr/0-9//d; にする。
3. 双方を比較する。
4. おしまい。
0899nobodyさん
04/07/09 17:20ID:???%table = ('A' => '5',
'B' => '10',
'C' => '8',
'D' => '13');
sub number {
if ( $table{$a} > $table{$b} ) {
return 1;
}
elsif ( $table{$a} == $table{$b} ) {
return 0;
}
elsif ( $table{$a} < $table{$b}) {
return -1;
}
}
foreach $KEY (sort number values %table){
print "It's $KEY \n";
}
上記のプログラムを実行したところ、tableの値がソーティングされておらず、しかもデバッグにより、サブルーチン内の$aと$bに値が入っていないことが解りました。時分でも減員を調べたのですが解らなかったので、教えて頂けませんでしょうか?
0900nobodyさん
04/07/09 17:51ID:???foreach( sort{$table{$a} <=> $table{$b}}keys %table){
print "It's $_ \n";
}
何してるんだか、どっから説明すればいいんだか、
なんで何の為にこねくり回してるんだか
0901nobodyさん
04/07/09 18:03ID:???| | __,-'ニニニヽ . | |
.. | `、ヽ ヾニ二ン" / |
| ヽ\ / |
AA略
誤字は誤字であると見抜ける人でないと
(Perlのコーディングは)難しい
0902nobodyさん
04/07/09 18:55ID:???cgiを通してネット上のファイルを書き換えてレンダリング、というのをやりたいんですが、
同じサーバーのものしか扱えなくて困ってます。
0903nobodyさん
04/07/09 19:40ID:???0905nobodyさん
04/07/09 20:00ID:???どういうものを想像してるのかわかんないんですが、
ファイルを書き換えて保存するわけじゃなくて、
ファイルを読み込んで、書き換えたものをレンダリング、です。
電波ニュースとかご存じないでしょうか。あんな感じなんですが。
0907nobodyさん
04/07/09 20:43ID:???相手がhttpならLWP使って読めばいいんじゃねーの?
変数なりなんなりに中身入っちまえば後は煮るなり
焼くなり好き勝手すりゃいいわけで。
0908nobodyさん
04/07/09 21:08ID:???でも、素人はperl使っててください、お願いだからPHP使わないでね^^
0909nobodyさん
04/07/09 22:21ID:???tr/0-9//d;ってのは、変換する文字が数字で
変換する文字のリストが無い訳ですよね。
すみません、どのような効果があるのかわからないのですが。
0911nobodyさん
04/07/09 22:33ID:???ハイフンの有無が混在してると比較の邪魔。
それを比較しやすいデータにして返してくれる、という効果。
tr///d; ←この d の意味を調べると幸せになれる予定。
0912nobodyさん
04/07/09 22:37ID:170SmloAこまった899の顔に見えるな
0914911
04/07/09 22:42ID:???0916nobodyさん
04/07/10 00:50ID:???>915
有難う御座います。ざっと具具って読んでみましたが、鯖にインストールしないと使えないみたいですね。
借り鯖なんで、試して無理なら無理、ってことでしょうか。
0917nobodyさん
04/07/10 01:48ID:???という感じで($fileは動的で、ファイル名が入ります)、
そのディレクトリ、を特定したいのですが、(つまりファイル名だけ省く)どうすればいいんでしょうか。
一番最後の . 〜その直前の / までの割り出し方があればなんとか出来そうなんですけど。
0918nobodyさん
04/07/10 02:02ID:???0919917
04/07/10 02:05ID:???で拡張子だけはずす事までは出来るんですけど。
$fileに入るファイルURLは / がいくつはいるか特定できないので / で区切るわけにもいかないし。
どうしたらいいんでしょうかね。
0921917
04/07/10 02:22ID:???最後のスラッシュを書き換えればその書き換えたもので区切って、前方を、ってできるような気がしたんですけど。
#完全におかしなことを言ってるような気がしてきた。
>>918
えっと調べてみたんですが、「一番最初に見つかった○○」〜「一番最初に見つかった××」ですかね。
$file = 'system/news/index.html';
だと「system/」しか拾ってくれないのではないでしょうか?
誤読してますかね。
0922nobodyさん
04/07/10 03:15ID:???$file =~ s/(.*\/).*/$1/;
とか
$dir = substr($file, 0, rindex($file, "/") + 1);
0924nobodyさん
04/07/10 07:39ID:INTe94T2そこでperlのソースコードで縦読みって作れるんでしょうか?
一見、ふつうのソースだが、縦とか斜めに読むと
面白い事が書かれているとか。
変数名だけじゃなくて、命令や関数が組み合わさって縦読みできたら、かなりすごいんじゃないでしょうか。
0925nobodyさん
04/07/10 08:09ID:???http://books-support.softbank.co.jp/pq/backnumber/036_ans_reader.html
の一番下。
0926nobodyさん
04/07/10 08:10ID:???あんたにゃ無理かもしれんが、
エンコード文字列だけのスレの54がすごいぞ
http://pc5.2ch.net/test/read.cgi/php/1065258181/54
縦読みっていうレベルの話じゃないぞ。
見たら「ビックリ」するぞ。
漏れも初めてあのスクリプトを見たとき、perlの行き着く先には絶望しかないかと思ったよ。
じゃ、がんばって解凍してね。
0928nobodyさん
04/07/10 14:43ID:???答えてやるよ!
0929nobodyさん
04/07/10 15:06ID:???0930nobodyさん
04/07/10 15:31ID:???存在していて、害にならなければ存在価値はあると言っていいだろう。
でも大事なことを教えてやろう。パアルのコージングとは無関係な質問ね。
0931870
04/07/11 06:02ID:???>>888
一応&Form_Input();にはしてあります。
それで、アドバイスがあった
print $input{'1'} ;
を入れてみたのですが、表示されません。
一応ソースですが、再アップしてみたので、よかったらご覧になってください。
もう自分挫折しそうですorz
どなたか、愛の手を・・・
0932nobodyさん
04/07/11 06:15ID:???print "Content-type: text/html;\n\n";
それと、ソースのファイル名が100q.zipじゃなくて100.zipになってたぞ。
0933932
04/07/11 06:50ID:???ヘッダの問題じゃなかったのかな?
print $input{'1'} ;
って何を表示するのかわかってる?
print $input{$_} for 1..100; こうした方が君にはいいかも
0934名無しさん@そうだ選挙に行こう
04/07/11 08:06ID:???$input{'1'}
を
foreach (1..100){
print qq($_ : $input{$_} <BR>\n);
}
にしてみる。
0935名無しさん@そうだ選挙に行こう
04/07/11 18:24ID:???こんなスクリプトを書きましたが、結局画像の形だけが表示されてしまいしまた。
画像を出して、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>;
0936935
04/07/11 18:26ID:???0937nobodyさん
04/07/11 21:09ID:???filename.jpgへリンクしたhtmlを出力させたいと思ってます。
<a href="特定のURL指定/$f">●</a>とおいたときに$fがfilename.jpgじゃなく空白になります。
filename.jpgを出力するために何か処理が必要になるのでしょうか?
htmlの出力、URLの指定などは問題なしです。
アドバイスお願いします。
0938nobodyさん
04/07/11 21:16ID:???>>1
> 1: 自分はこう言う事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
2が抜けてる。
?f=filename.jpg を $f にどうやって代入してるの?
0939937
04/07/11 22:16ID:???レスありがとうございます。
?f=filename.jpgが$f指定してると思ってたので特に記述してなかったです。
?f=のような指定について調べてみたのですが、参考になるページが見つかりませんでした。
情報ありましたらアドバイスいただけないでしょうか?
0940nobodyさん
04/07/11 22:26ID:???QUERY_STRINGでぐぐれ。
0941nobodyさん
04/07/11 23:12ID:YH96401L$array[] = "apple";
とすると配列の最後に"apple"を追加してくれるのですがこれをPerlでやる場合
簡単な方法ってどうやりますか?
0943nobodyさん
04/07/11 23:20ID:???0946nobodyさん
04/07/12 10:17ID:???$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にしてもだめなので、ここで何をサポートしているのか知りたい。
サポートしているファイル形式を知るためのメソッドってありますか?
0949nobodyさん
04/07/12 11:03ID:???@a = qw( 0.1 0.2 0.3 );
だとちゃんと入るんだけど
@a = { 0.1, 0.2, 0.3 };
だとなんかすっげー数字が入っている
なんでだすか?
0950nobodyさん
04/07/12 11:26ID:???0953nobodyさん
04/07/12 12:53ID:???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
0956nobodyさん
04/07/12 19:33ID:???0957nobodyさん
04/07/12 20:56ID:???例えばpingを打ちたいと思ったら
CGIだと
クライアントから要求→サーバがping実行→クライアントに実行結果を返す
ですが、
HTMLの中にスクリプトを埋め込むことによって、クライアントからpingを打つことは可能でしょうか?
うまく意味が伝わらなかったらごめんなさい_no
0959nobodyさん
04/07/12 21:26ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_can_I_make_a_filehandle_loca
>>957
"PerlScript" で調べ回れ。
0960957
04/07/12 21:40ID:???回答ありがとうございます。
ゼミの教授が「タグで簡単に出来る」と言ってきて、
自分なりに色々調べたのですが、全くそのような情報がなかったので質問させて頂きました。
胸を張って「そんなこと出来ませんよ」って言いたいと思います!
0962nobodyさん
04/07/13 03:39ID:???恥かくのは本人なんだから
0963nobodyさん
04/07/13 05:45ID:???ゼミの教授は嘘つきだ
Perlにタグなどない!
だいたいHTMLに埋め込むのってCGIじゃなくてSSIでしょー
確かにSSIをHTMLに埋め込むのはタグだけどなぁ
0964nobodyさん
04/07/13 06:00ID:???学生「先生!あのpingの話ですけど、できませんよ!」
教授「ほう、何か調べたのですか」
学生「はい。調査の結果、2chのnobodyさん(958)が『無理』と。句読点なしで」
教授「…帰れ」
…こんな感じのコじゃないかな。
「タグで出来る」ってのも、>>960さん用語に変換されてるだけかもしれない。
0965nobodyさん
04/07/13 08:12ID:???「<img>タグ」でアクセスとかだったら、
ちょっと、いぢわるだなぁ、その教授。
>957とりあえずガンガレ。。
0966nobodyさん
04/07/13 11:28ID:???「クライアントからpingを打つ」てのは難しそうに思えるなあ。
それができるとたぶん物凄いセキュリティホールになる。
0967nobodyさん
04/07/13 12:36ID:???無理
って言ったんですけどね・・・
0968nobodyさん
04/07/13 13:17ID:Q7wc8BxWprint "<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形式で表示させるためのサブルーチンです。
0970nobodyさん
04/07/13 13:33ID:???0971nobodyさん
04/07/13 13:38ID:???whileの中でhtml出力まで一気にやらなけりゃいいんじゃないの?
while内でhashなりにデータ格納して、
後で好きなようにソートなり何なりしてHTML出力すれば?
0972968
04/07/13 13:57ID:Q7wc8BxW>>969
system "ls -lt" >hoge.txt
・・・みたいな感じですね。system禁止されてなきゃいいのですが。
>>970
そうか。
アップローダーCGIを参考にすればよかったのですね。
全然思いつきませんでした。
ファイルのアップはFTPです。アップローダーなんて高機能なもの、まだ作る腕がありません。。
>>971
perlのsortを調べてて、「先頭からn番目(今回の場合は4番目)のものをキーにして・・・」というのが、探し当てられませんでした。リャマ本にも「すぐわかるperl」にもなかったですし、いろいろ探し回ったのですが。。
・・・と書いてて今思いつきました。
タイムスタンプを先頭に格納すればいい?
がんばってみます。
0974nobodyさん
04/07/13 14:12ID:???<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
0975968
04/07/13 15:40ID:pa0oo0i5ヒントの宝庫ですね。
特に
>sort { $b->[3] <=> $a->[3] } # 最新更新時間を降順に並べ替え
添え字の位置はそこだったのか。。
あとアップロードされた時間を所得するのは$mtimeなんですね。。($ctimeだと思い込んでた)
一生懸命がむばってみます。ありがとうございました。
0976nobodyさん
04/07/13 16:09ID:???別のファイルをFHで書き出しをしてフラッシュした場合、以前の書き出しも
フラッシュされるのでしょうか?
レス数が950を超えています。1000を超えると書き込みができなくなります。