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

Perlコーディング初心者質問スレ Part 49

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん2006/05/31(水) 04:32:28ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0826nobodyさん2006/06/22(木) 14:01:39ID:1JauVdIN
@a=("a,1","b,2","c,1");
上記のように、カンマ区切りのCSVデータを文字列として配列に入れた状態で、

CSV内、2つめの値が1のものだけを@bの配列にいれるには、
foreachで全レコードを回し、条件式を使って@bにpushするしかないんでしょうか?

こういった状態にしたいんですが。
@b=("a,1","c,1");
0827nobodyさん2006/06/22(木) 14:05:22ID:???
まp
0828nobodyさん2006/06/22(木) 14:05:51ID:???
gれp か・・・
08297372006/06/22(木) 14:17:17ID:fNuZm9nk
>>822
あ!その通りですね・・・。
できるなら配列を短くした方が処理としては良いと思って削ってました。

>>823-824
なるほど。最初から細かい部品に分けておいて
必要に応じて連結して対応する形にする方が効率的ですね。
一応、既存のデータはありますがそれほど数は多くありませんし
テキストエディタでも使えばすぐに書き換えられそうなので
データファイルの構造を変えようと思います。

繰り返しになりますが「フォームで選択された項目のみを出力する」という方法については
whileで1回1回全て開いてから、選択されているかどうかをチェックする方法(>>820の前段)で良いんでしょうか?
もちろん動くことは動くんですが、選択の有無のチェックを各行ごとに行う処理を
1回のチェックでできないかと悩んでいます。
0830nobodyさん2006/06/22(木) 14:21:42ID:???
いつまでデバッグさせるの?
そろそろ自分でやりなよ
0831nobodyさん2006/06/22(木) 14:24:10ID:???
spliceしたら配列ずれませんかね・・・
0832nobodyさん2006/06/22(木) 14:26:23ID:???
わざわざ消すぐらいならView側で表示しないよう分岐させちゃう
のはダメ?
0833nobodyさん2006/06/22(木) 14:28:18ID:???
>>829
アイデア次第でできないこたないけど、たいして変わらないからいいんでねw
0834nobodyさん2006/06/22(木) 14:28:59ID:???
>>832
ああ、うちもそうする。
0835nobodyさん2006/06/22(木) 14:33:56ID:/RLzZFvL
sub password{
undef my $pass;
undef my @temp;

my $val = 7; #パスワード8文字
my @char = ('a'..'k','m','n','p'..'z','A'..'H','J'..'N','P'..'Z','2'..'9');

srand(time ^ $email);
foreach (0..$val) {
{
push(@temp,splice(@char,rand(@char),1)) while @char;
@char = @temp;
}
$pass = $char[($_)] . $pass;
}
return $pass;
}

として、パスワードを生成しているんですが、同一プロセスで二つ以上の異なったパスワードを生成したい場合
どうしたらいいんでしょうか?
$emailはグローバル変数でユニークです。$emailが違う毎に違うパスワードを生成したいんですが、
同じ値が返ってきます。

srandって呼び出しできるの一回だけなんですよね。
0836nobodyさん2006/06/22(木) 14:37:24ID:???
srand しなきゃいいんじゃね
0837nobodyさん2006/06/22(木) 14:43:03ID:???
5.004以降はsrand(time)が自動で呼ばれます
0838nobodyさん2006/06/22(木) 14:43:23ID:/RLzZFvL
>>836
おお。できました
ありがとです<(_ _)>
08397372006/06/22(木) 14:45:33ID:fNuZm9nk
>>830
デバッグ・・・そんなつもりはなかったんですけど、
結果的にそういうことになってましたか・・・。
すみません。
「配列の中から必要なものだけ」という点についても
何かアドバイスが欲しかったので、しつこく聞いてしまいました。
すみませんでした。

>>831
その通りでした。
>>822にて指摘していただいた通り
spliceするのではなく要素を空にする方法にします。

>>832>>834
>View側で表示しないよう分岐
にしても、結局同じように@data内を1行ずつ展開して
表示させるかどうかのチェックをする方法しか思いつきませんでした。
アドバイスありがとうございました。

>>833
もしかしたら、自分のやりたいことと書いてるコードが全然見当違いのことをやっていて
「そんな無駄な処理しなくても、こうやった方が良い」というのがあるのかな、と思って質問しました。
特段、妙なコードを書いているわけではないと分かっただけでもありがたいです。

同じような質問、くだらないことを何度もしつこく書き込みをしてすみませんでした。
今まで懇切丁寧に色々と教えて下さった方々本当にありがとうございました。
0840nobodyさん2006/06/22(木) 14:53:39ID:???
#先に設定
my @checked = qw(1 0 1);# 「年齢」「性別」「電話番号」を出すか

#ループ内で消す
my $i = 0;
foreach my $flg (@checked){
undef $tmp[$i] if $flg;
}

こうするとか。
まぁViewでやるけど。
0841nobodyさん2006/06/22(木) 15:24:19ID:???
>>839
じゃあ最後に土産

my %in = (denwa => 1, seibetsu => 0, nenrei => 0, juusyo => 1, hoge => 'hogehoge'); # クエリのデータ?
$in{namae} = 1;    # 名前は必ず必要
my @checks = qw(namae seibetu nenrei denwa juusyo);    # 含まれるデータの名前
# データ取得
my @data = qw();
open ( LOG, "< name.txt" ) || die ( "ERROR: $!" );
flock ( LOG,1 );
while ( <LOG> ) {
    my $d = {};
    @{$d}{ @checks } = split (/<>/);
    foreach my $key (@checks) {
        delete $d->{$key} if (!$in{$key});
    }
    push (@data, $d);
}
close ( LOG );
# ソート
my $i = 0;
my %jusho = ();
foreach my $name ('北海', '東京', '愛知' , '大阪', '京', '福岡') {
    $jusho{$name} = $i++;
}
@data = map {$_->[0]}
            sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}
                map { $_->{juusyo} =~ /^(.*?)(?:県|都|府|道)/; [$_, $1] } @data;
# print
foreach my $d (@data) { while (my ($k, $v) = each %$d) { print $k, ': ', $v, ', '; } print "\n"; }
0842nobodyさん2006/06/22(木) 15:27:23ID:???
甘やかすなw
0843nobodyさん2006/06/22(木) 15:30:29ID:???
もう来ないらしいからいいかと思ってww
0844nobodyさん2006/06/22(木) 17:30:21ID:???
$hoge{"aaa1"} を参照する際、
$i = 1;
print $hoge{aaa$i}; だとエラーになるのですが、正しい記述方法は何でしょうか?
0845nobodyさん2006/06/22(木) 17:36:13ID:???
なんでわざわざダブルクオーテーション外したのかkwsk
0846nobodyさん2006/06/22(木) 17:38:57ID:???
こういうのって bare word で書くから出て来ちゃった弊害だよね
0847nobodyさん2006/06/22(木) 17:50:11ID:fJKTYP9w
関数で帰ってきた文字列を、そのままprintの中に埋め込みたい時は
どうすれば良いのでしょうか?現在は↓のように書いています。
  print "ほげ".&hoge('abcd')."ほげ";
しかし、なんか綺麗じゃないので、↓のような感じで書く方法とか
あったら、良いなぁと思ってます。
  print "ほげ&hoge('abcd')ほげ";
↓のような書き方も良いのですが…。
  print sprintf("ほげ%sほげ",&hoge('abcd'));
まだPerlを始めたばかりなので、皆さんの知恵をかしてください。
0848nobodyさん2006/06/22(木) 17:52:45ID:???
>>847
print
    "ほげほげほげ",
    hoge('abcd'),
    "はげはげはげ";

とか?
0849nobodyさん2006/06/22(木) 17:54:49ID:???
print
"ほげ",
&hoge('abcd'),
"ほげ"
;
#改行しちゃえば?
0850nobodyさん2006/06/22(木) 17:57:17ID:???
>>847
printの中に埋め込まない方が良い

個人的には、
print "ほげ", &hoge('abcd'), "ほげ"; # 連結コスト無し

print "ほげ" . &hoge('abcd') . "ほげ"; # だと2回分、文字列連結コストがかかる
print "ほげ&hoge('abcd')ほげ"; # 動作せず
printf("ほげ%sほげ", &hoge('abcd')); # printf, sprintf のコストは重い
0851nobodyさん2006/06/22(木) 18:02:27ID:???
配列リファレンスをデリファレンス、だけど、、、。
見栄えはあまりねぇ。

逐次出力したくないときは、どっちにしろ文字列連結コストがかかるし。
0852nobodyさん2006/06/22(木) 18:03:49ID:???
>>844
print $hoge{ 'aaa' . $i };
08538472006/06/22(木) 18:05:43ID:???
なるほど。" ."で連結するのと" ,"で繋げる事に
対するコストなんて考えてませんでした。

皆さんの意見が" ,"で繋げる事で一致しているみたいなので、
これからは、" ,"で繋げる方法でいこうと思います。
0854nobodyさん2006/06/22(木) 18:10:46ID:???
そこで、@{[]}
0855nobodyさん2006/06/22(木) 19:14:15ID:???
そこでPerl6ですよ
0856nobodyさん2006/06/23(金) 00:51:44ID:???
Script Error
The script did not produce proper HTTP headers.
Please see the error log to see the detail of the errors.
Depending on the server configuration, you can also run thisscript under CGIWrap debugging.
Usually, either rename or linkthe script temporarily to a file which ends with.
cgidextension, or add a AddHandler cgi-script-debug .cgiline to your .htaccess file.
─────────────────────────────────────
Perlで組んだCGIを実行するとこの様なエラーが出てしまい、困っています
CGIのログファイルに、既にデータが入っていれば、↑のエラーは出ないのですが、
ログファイルの中身が空っぽの場合↑のエラーが出ます。

なぜでしょうか?ログファイルを処理するコードに問題があるのでしょうか・・・・・・?
08578562006/06/23(金) 00:52:17ID:???
ちなみに問題があると思しきソースはこんな感じです
─────────────────────────────────────
sub data {

open(LOG,"< $logname") || &error("ログファイルが開けませんでした");

@logs=<LOG>;

close(LOG);

foreach $line(@logs) {
chop($line);
($atai1,$atai2,$atai3,$atai4,$atai5,$time,$value,$name,$titles,) = split(/\,/,$line);
if (!$line){last;}

print "<TABLE border=\"1\" align=\"center\" width=\"500\">\n";
print "<TR><TD>名前</TD><TD>$name</TD></TR>\n";
print "<TR><TD>タイトル</TD><TD>$titles</TD></TR>\n";
print "<TR><TD>投票</TD><TD>$atai1/$atai2/$atai3/$atai4/$atai5/</TD></TR>\n";
print "<TR><TD>書き込んだ時間</TD><TD>$time</TD></TR>\n";
print "<TR><TD>本文</TD><TD>$value</TD></TR>\n";
print "</TABLE><br>\n\n";

}

}
0858nobodyさん2006/06/23(金) 01:09:56ID:???
>>856
見慣れないエラーだな…XREAの鯖か?
それを見る限り、ログファイルが空というだけじゃ特に問題を起こしそうなコードじゃない。
が、それが出るのってもしかしてログファイルが存在しない場合、じゃない?
そうだとしたらerrorサブルーチンのほうをチェック。
特にHTTPヘッダをちゃんと出しているかどうかを確認汁。

どうでも良いが変数名はもうちょっと考えたほうが良いぞ…
valueって日本語で値なんだが…本文は大抵bodyとかtextとかかと。あとなぜにtitleが複数形なのよ。
0859nobodyさん2006/06/23(金) 01:42:46ID:???
ttp://sb.xrea.com/showthread.php?s=&postid=23784
08608562006/06/23(金) 01:57:18ID:???
今ちょっと調べてみたところ、無限ループがありました。
それがどうも、>>858さんがおっしゃっられた通り「&error;」に問題があるっぽいです・・・・。
ためしに、>>857(&data;)のログファイルの変数を適当な文字列に変え、実行したところ、
「ログファイルが開けませんでした」が無限と出てきました。

しかし、↓はその「error」のサブルーチンですが、取り分け私の目には可笑しいようには見えないのですが・・・・
─────────────────────────────────────
sub error {
local($msg) = @_;
print "<br>\n";
print "<table border=\"0\" cellpadding=\"3\" width=\"500\" cellspacing=\"0\" align=\"center\">\n";
print "<tr><td width=\"100%\" bgcolor=\"#C0C0C0\" align=\"center\">\n";
print "$msg\n";
print "</td></tr>\n";
print "</table>\n";
&data;
&foot;
exit;
}
─────────────────────────────────────
sub foot {
print "</BODY>\n";
print "</HTML>\n";
exit;
}
─────────────────────────────────────
0861nobodyさん2006/06/23(金) 02:32:49ID:???
sub errorの中で&dataを呼んでるので、またエラーが出る、さらにエラーが出る、→無限ルーーーーーーーーーープ!
0862nobodyさん2006/06/23(金) 07:34:25ID:???
なんでエラー表示するときにデータ読もうと思ったのかkwsk
0863nobodyさん2006/06/23(金) 14:40:13ID:???
なんでこういうの自分で気付かずに掲示板で質問しちゃうんだろうね…。
そこが分からん
自分では分からないものなのか?
0864nobodyさん2006/06/23(金) 15:26:05ID:???
>>863
考える前に聞く癖がある。聞いてから考えようと思ってる。そもそも考えない。
の、どれかではないでしょうか。
0865nobodyさん2006/06/23(金) 16:01:22ID:???
考えて分かるような人は、始めからこんなスレ来ないから
0866nobodyさん2006/06/23(金) 16:58:29ID:QUOZQBvk
Perl5.8.8 をWindowsXP上で、コマンドプロンプトで実行してます。
しょーもないところでハマってしまったので、教えてください。

pack("C",8) → 0x08
pack("C",9) → 0x09
pack("C",10) → 0x0D 0x0A
pack("C",11) → 0x0B

どうも10をバイナリ変換したときだけ0x0Dがついてしまうんですが、
これってなんでですか?
0867nobodyさん2006/06/23(金) 17:07:46ID:???
>>866
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
0868nobodyさん2006/06/23(金) 17:08:13ID:???
windowsの改行。
大雑把に書けば \r\n
0869nobodyさん2006/06/23(金) 17:18:27ID:QUOZQBvk
やっぱ改行コードが絡むのか。。。orz

$bin='';
for(1..100){
$bin.=pack("C",$_)
}
open(OUT, "> test.bin");
print(OUT $bin);
close(OUT);
exit 0;

↑のコードに意味はないですが、こんな感じで「pack()の第2引数に何か数値が入る」という場合に、
10が入ってきても正しく動くようにするにはどうすればよいのでしょう?
0870nobodyさん2006/06/23(金) 17:20:41ID:???
ボインモード
0871nobodyさん2006/06/23(金) 17:22:53ID:QUOZQBvk
そうか!!!
助かりました。ほんとにありがとう。
0872nobodyさん2006/06/23(金) 22:21:11ID:HrkNw3LR
Bzというバイナリエディタを入れてみました。

print "content-type:image/gif;\n\n";

というヘッダを吐き出して試しに画像を返すCGIを作ってみようと思いました。
最終的には画像をいじるCGIを作ろうと思ってるのですが。

バイナリをコピーしてテキストファイルに貼り付けても何故か

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52

という形で張り付きません。何か方法がありますでしょうか?
0873nobodyさんNGNG
クリップボードの末尾はNULLで判断されるから
08748722006/06/23(金) 22:58:10ID:HrkNw3LR
>>873
なるほど。
それではどうすればいいのでしょうか?
手書きで移すしかないのでしょうか。
0875nobodyさん2006/06/23(金) 23:16:19ID:???
画像ファイルとして保存しておいて読み込めばいいじゃない。
ソースにバイナリを埋め込もうとするなよ、と。
0876nobodyさん2006/06/24(土) 00:26:02ID:???
すいません質問があるんですが

「 $hoge /= $fuga; 」

で、$hugaの値は始め「0」なのですが、この場合どうすればよろしいでしょうか?
割る数が0だとエラーですよね・・・・
0877nobodyさん2006/06/24(土) 00:32:56ID:???
$hoge /= $fuga unless $fuga == 0;
0878nobodyさん2006/06/24(土) 00:34:07ID:???
>>876
経験からすると、そういう時はだいたい計算方法自体が間違ってる。ループの開始値は実は1とか。
まあこれで正しい計算ができると言うのなら $hoge /= $fuga || 1 とか。
08798762006/06/24(土) 01:54:46ID:???
>>877-878
ありがとうございます。

一応いろいろいじっていて、「$hogehoge = eval { $hoge / $fuga; };
と、形が崩れてしまったのですがこれで動きました・・・が、これでも問題ないでしょうか?
0880nobodyさん2006/06/24(土) 02:02:12ID:???
>>879
$fugaが0のとき、$hogehogeの値は何になって欲しいの?
08818762006/06/24(土) 02:06:23ID:???
>>880
一応「0」が入って欲しいと思っています。
08828762006/06/24(土) 02:10:30ID:???
あぁ、すいません・・・・
素直に>>877さんのを使わせていただきます。うまくいきました。

ありがとうございます。
0883nobodyさん2006/06/24(土) 02:17:12ID:???
>>881
0で割ったら0にならないものを、無理やり0にしようとしてるんだから
素直に場合わけした方がいいよ。
if ($fuga == 0) {
$hogehoge = 0;
} else {
$hogehoge = $hoge / $fuga;
}
eval使うと遅いし。
$ perl
use Benchmark;
timethese(1_000_000,
{'ore'=>sub{if ($fuga == 0) {$hogehoge = 0;} else {$hogehoge = $hoge / $fuga;}},
'omae'=>sub{$hogehoge = eval { $hoge / $fuga };}});

Benchmark: timing 1000000 iterations of omae, ore...
omae: 6 wallclock secs ( 6.64 usr + 0.00 sys = 6.64 CPU) @ 150625.09/s (n=1000000)
ore: 0 wallclock secs ( 0.39 usr + 0.00 sys = 0.39 CPU) @ 2557544.76/s (n=1000000)
(warning: too few iterations for a reliable count)
08848762006/06/24(土) 02:18:28ID:???
>>883
あ、はい。
こんな夜遅くにありがとうございます。
0885nobodyさん2006/06/24(土) 02:48:48ID:LjIFBTan
自分が借りてる鯖では「flock関数」が使えるんですが
その場合ためらいも無く「flock(LOG,2);」とかやっても問題無いですか?
0886nobodyさん2006/06/24(土) 04:03:57ID:???
>>885
flockが使えないような鯖で動かす予定がないなら良いんじゃない?
漏れは、もう長いことflockのためにeval使ったことなんて無いな…
# っつか、flock非対応の環境に出会ったことが無いんで、
# 対応してない環境では致命的なエラーになる事をすっかり忘れてた。
08878722006/06/24(土) 17:30:41ID:1EkY/rQf
>>875
それじゃあ画像をいじるCGIを作るのが難しいですよ。
どこの何番が何に当たるとか、逐一みたいですし。

あ、勘違いしてるかもしれません。
ASCIIコードで埋め込みたいんです。
バイナリで埋め込むという表現は間違いでした。すみません。
0888nobodyさんNGNG
$binary = "\x00\x01\x02\x03\x04";

とか、packとか
08898722006/06/24(土) 17:52:23ID:1EkY/rQf
>>888
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52


こういう感じです。
件のものですが、locationと同じですよね。
まあ

print "location:/img/logo.gif;\n\n";

でやってもエラーが出てしまって困ってるのですが。。。。
なんかスランプです。あつくtえ
0890nobodyさん2006/06/24(土) 18:06:51ID:???
どうでもいいけど、>>872が何をやりたいのかさっぱり分からない。
0891nobodyさん2006/06/24(土) 18:18:08ID:???
Locationはhttp://から
0892nobodyさん2006/06/24(土) 19:40:28ID:???
Spreadsheet::ParseExcelについての質問です。

英語で記載したセルとハイパーリンクだけは抽出してくれるのですが、日本語部分が文字化けしてしまいます。
モジュール部分には、以下のように記載しています。

use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan;
use Unicode::String;

Googleなどの検索では、これで上手く言っている人が大部分でした。お判りになる方がいたら、教えてください。
08938722006/06/24(土) 21:10:03ID:1EkY/rQf
とりあえず以下で件の読み込んでやるというのをやってみました。

print "Content-type: image/gif\n\n";
open FH,"../img/logo.gif";
my @img = <FH>;
pack "h", @img;
print @img;
close;

そうしたら正常でない画像が表示されました。多分変換部分が間違いなんですね。
hじゃなかったのかな。

>>890
すみません。暑さに参っておりました。35度って凄いですね。
冷房使えない体なので。

フォトショップみたいなCGIを作ろうと思ってます。
ご覧の通り未熟ですので今年一杯の趣味感覚で取り組んでいます。

>>891
ありがとうございましたm(__)m
やさしさを感じましたm(__)m
08948722006/06/24(土) 21:12:18ID:1EkY/rQf
>>892
文字コード問題では?
モジュールに渡す時に決められた文字コードにしておかないといけないとかはないのですか?
その他もジーコ度全般を見直してみhてあ。
0895nobodyさん2006/06/24(土) 21:23:27ID:???
>>894
ありがとうございます。
とりあえず、そこから調べてみることにします。
0896nobodyさん2006/06/24(土) 22:54:50ID:???
>>893
おそらくbinmodeでrawにすればおk
さもないと改行コードが自動的に変換されたりしてしまうので。
0897nobodyさん2006/06/25(日) 00:04:20ID:???
ログから特定の行数だけ抜き出す時は、どうしたらいいんでしょうか。
掲示板ログから出力すると、行数が多いので、
件名だけか、本文の何行まで抜き出すという風に出来たらと思うんですけど。

@match = map { $_->[0] }
sort { $b->[18] <=> $a->[18] }
map { [$_, split /\|\|\|/] }
@match;
my$i = 5;
foreach $line (@match) {
@mdata = split(/\|\|\|/,$line);
if ($i > 0) {
print "<CENTER>\n";
&table_html($HoD);
&subj_date_name_hp_html ("main", \@mdata, $HoD);
0898nobodyさん2006/06/25(日) 00:14:20ID:???
エスパーかもーん
08998722006/06/25(日) 00:28:43ID:CLTK8aRM
>>896
binmodeで、rawにやってみます。ありがとうございます。
>>897
決めたバイトだけ読み取るとか・・・・というかどういう形式で保存されてるのかさえ
わかりやすく説明したらきっと詳しい人がズバリで教えてくれると思いますよ。
0900nobodyさん2006/06/25(日) 01:37:46ID:???
>897
spliceで削除しちゃえばいいんじゃないのか?
09018972006/06/25(日) 03:45:53ID:???
>>899
ありがとうございます。
バイトで読み取りをしてみたのですが、うまくいかず…。
もっと勉強します…。
spliceでいけました。

>>900
spliceでいけました。
ヒントありがとうございます。
本当に本当に助かりました!
ありがとうございました。
0902nobodyさん2006/06/25(日) 06:35:30ID:???
>>893
img/logo.gifが純正のgifファイルなら、
何も変換せずにprint <FH>で表示できる。
windows環境ならbinmodeが必要。

binaryが見たいなら、とりあえず
print unpack"H*",join"",<FH>で見れる

各要素を配列として得たいなら
my@a=unpack"C*",join"",<FH>など、・・・
0903nobodyさん2006/06/25(日) 07:42:22ID:???
>^)+++< (^_^#) (*^(^ *) [^<>^]
0904nobodyさん2006/06/25(日) 10:22:03ID:???
>>893 の 「フォトショップみたいなCGI」 ってのがすごく気になる・・・
フォトショップの何をしたいのかさっぱりわからんw 全体だったらかなり無謀だよね。
0905nobodyさん2006/06/25(日) 12:03:42ID:???
>>904
Photoshop を Web アプリとして再実装できたら面白いと思ふ。
例えば中小規模でのグラフィックワークステーション共有とか、コスト面でのメリットが出るならいけそうじゃないか?
0906nobodyさん2006/06/25(日) 12:06:28ID:???
0;
09078722006/06/25(日) 12:47:39ID:CLTK8aRM
print "Content-type: image/gif\n\n";
open FH,"../img/logo.gif";
binmode FH;
my @img = <FH>;
pack "raw", @img;
print @img;
close;

これだと画像部分が×になって表示されません。でも画像のサイズはあってます。

print "Content-type: image/gif\n\n";
open FH,"../img/logo.gif";
binmode FH;
print <FH>;
close;

だとやっぱりぐにゃぐにゃの画像になって表示されてしまいます。

winXP
apache1.3.3
active perl 6.8
です。
0908nobodyさん2006/06/25(日) 13:10:04ID:???
binmode STDOUT;

もお忘れなく
09098722006/06/25(日) 13:22:05ID:CLTK8aRM
>>908

print "Content-type: image/gif\n\n";
open FH,"../img/logo.gif";
binmode STDOUT;
print <FH>;
close;

ありがとうございました。これでできました。
binmode FH;はファイルをバイナリレベルでいじる時で、出力をバイナリにするには
binmode STDOUT;が必須だったのですね。

ありがとうございました。

>>904-905
専用サーバを借りてるので、時間掛けながらゆっくりやろうとかと思います。
どこらへんまで出来るのかは現時点の私ではわかりませんので、みなさんからすると
アホなことかもしれません。でも面白そうなので。
0910nobodyさん2006/06/25(日) 13:44:45ID:???
index,127.0.0.1,20060624210600,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
index,127.0.0.1,20060624210600,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
index,127.0.0.1,20060624210600,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)

こういうアクセスログファイルがあって、
open FD,"access.log";
while (<FD>){
print $_,"<br>\n";
}

とするとブラウザのところで何行にもなってしまいます。
つまりwhileが行末の改行以外でちょんぎってはじめてしまってるのです。
一応
open FD,"access.log";
my @line = <FD>;
close FD;
print $line[0];
も試してちゃんと行ごとの配列になってましたので、whileの影響だとは思うのですが。
0911nobodyさん2006/06/25(日) 13:46:56ID:???
index,127.0.0.1,20060624210600,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
index,127.0.0.1,20060624210600,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
index,127.0.0.1,20060624210600,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)

こういうアクセスログファイルがあって、
open FD,"access.log";
while (<FD>){
print $_,"<br>\n";
}

とするとブラウザのところで何行にもなってしまいます。
つまりwhileが行末の改行以外でちょんぎってはじめてしまってるのです。
一応
open FD,"access.log";
my @line = <FD>;
close FD;
print $line[0];
も試してちゃんと行ごとの配列になってましたので、whileの影響だとは思うのですが。
多分<FD>これでちゃんと行ごとに渡そうとしてるにもかかわらずその中の何かのコードに
whileが反応して行の途中で区切って処理を開始してしまうんだと思います。

whileに行ごとにやらせたいのですが、何かwhileのモードを変える方法でもあるのでしょうか?
0912nobodyさん2006/06/25(日) 14:09:12ID:???
ImageMagickがインストールされてないサーバで、インストールする権限もない状態で、
なんとか使うことは出来ないのでしょうか?
0913nobodyさん2006/06/25(日) 16:30:20ID:???
>>912
鯖缶にお願いメールを送信する
0914nobodyさん2006/06/25(日) 16:38:32ID:???
>>911
何言ってんの?

while (<FD>){
print $_;
}

こうすれば行ごとになるんでしょ? それに加えて \n 入れたら2行になるの当たり前じゃん。
09159152006/06/25(日) 16:58:59ID:???
$rand = int(rand(6));

if($old_rand == $rand)
{ $rand = $rand + 1; }
if($rand == 0)
{ $key = "000"; $old_rand = $rand;}
elsif($rand == 1)
{ $key = "001"; $old_rand = $rand; }
elsif($rand == 2)
{ $key = "002"; $old_rand = $rand; }
elsif($rand == 3)
{$key = "003"; $old_rand = $rand; }
elsif($rand == 4)
{ $key = "004"; $old_rand = $rand; }
else
{ $key = "006"; $old_rand = $rand; }
上記の部分を処理が来るごとに使っています。
前回と同じ値の場合は+1して2度連続で同じkeyにならないようにしているのですが
何故か同じkey(例:$key = 002等が)が重なることがあります。
前回と同じ数値の場合は+1しているので重なることはないと思うのですが
なぜ同じ数値が出るのでしょうか?
どこか間違っている場所があればアドバイスいただければと思います。
0916nobodyさんNGNG
よくわかんないけど、
+=とsprintf使った方がよさげ
0917nobodyさん2006/06/25(日) 17:13:02ID:???
$rand = int(rand(6));

$rand += 1 if ($old_rand == $rand);
if ($rand < 5) {
 $key = sprintf("%03d", $rand);
} else {
 $key = "006";
}
$old_rand = $rand;

006は重なるだろうけど、他の部分で$old_rand変更しちゃってるとか。
09189152006/06/25(日) 17:21:20ID:???
レスありがとうございます。
もしかして
{}内で$old_randに入れても{}内だけで有効で
{}外では$old_randって何も入ってない状態になりますか?
もしそうなら私のバカなミスということになりますが・・・。
0919nobodyさん2006/06/25(日) 17:23:14ID:???
いや、そんな事は無い。
同じ処理が全部の条件に入っていたから括り出しただけ
0920 ◆TWARamEjuA NGNG
(´-`).。oO(前回と同じ数字が出るのも乱数(疑似乱数)だと思うけれども、、、)
0921nobodyさん2006/06/25(日) 18:51:53ID:???
>>915
こんなコード書いてみた。いろいろ弄って考えてみて。

foreach(1..1000){
r();
}
exit;

BEGIN{
my ($old_rand, $old_key) = (0, 0);
sub r
{
my $rand = int(rand(6));
$rand++ if($old_rand == $rand);

my $key = sprintf("%03d", ($rand < 5 ? $rand : 6));

print "OUT! key:$old_key,$key rand:$old_rand,$rand\n" if ($old_key eq $key);
$old_rand = $rand;
$old_key = $key;

return $key;
}
}

# 本当は、元のままのコードを使いたかったのだけれど、
# プログラム関連の板で改行制限が厳しいとはどういうこった!>ひろゆき
0922nobodyさん2006/06/25(日) 19:09:56ID:???
なぜBEGINブロックなのか不明
0923nobodyさん2006/06/25(日) 19:17:36ID:???
>>922
初期化してるから。
0924nobodyさん2006/06/25(日) 21:05:56ID:???
>>920
だから前回と同じ乱数字が出たら+1してるんじゃない?
09259112006/06/25(日) 21:28:57ID:???
>>914
my %access;
# どのページにアクセスしてきたか
$access{p} = ( p => "index" );
# アクセス人物のIPアドレス
$access{ip} = $ENV{'REMOTE_ADDR'};
# アクセス時刻の記録
$access{time} = sprintf "%04s%02s%02s%02s%02s%02s",sub{shift()+1900,shift()+1,@_}->(@{[gmtime(time+32400)]}[5,4,3,2,1,0]);
# アクセス人物のブラウザ
$access{browser} = $ENV{'HTTP_USER_AGENT'};
# 書込み処理
open FH,"+>access.log";
flock FH,2;
my @line = <FH>;
my @new_line = join ",",@access{qw/p ip time browser/};
for ( my $i=0; $i<@line; $i++ ){
my @temp = split /,/,@line;
if ( $access{ip} ne $temp[1] and 1000000000 > $access{time} - $temp[2] ){
push (@new_line,join (",",@temp));
}
}
for ( my $i=0; $i<@new_line; $i++ ){ print $new_line[$i],"\n" }
while ( <@new_line> ){ print FH $_,"\n" }
close FH;

これを実行するとブラウザには一行で表示されますが、ファイルにはブラウザの種類部分が
何行にもわたって書き込まれてます。

ファイルに書込みするのもforでやれば問題は解消します。
なぜでしょうか?
レス数が900を超えています。1000を超えると表示できなくなるよ。