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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/10/07 23:23:08ID:kiEzDCJF
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0753nobodyさん04/11/15 23:47:01ID:???
>>752
実際二つ作ってみるのが早いですよね。めんどくさがって申し訳ないです。
組み合わせの検索をする感じなんですが、大体2500〜40000くらいの組み合わせから
条件に合うものをピックアップする感じで、やはりとにかく試すことにします。
ありがとうございました。
0754nobodyさん04/11/15 23:51:24ID:???
>>751
よくわからんが、もし言いたいことが

while($hairetsu[$index] ne $hikaku){ $index++; }



$index = $hash{$hikaku}

を比べたいのなら、後者の方が圧倒的に速い
075575104/11/15 23:54:50ID:???
>>754
バッチリそんな感じです。ハッシュの方から作ってみる事にします。
0756nobodyさん04/11/16 00:01:02ID:???
>>754
えーと。。whileつーのは。。やっぱりいいや。
意味せんとしていることは伝わってるみたいだし。
075775104/11/16 00:18:23ID:???
>>756
ああ読み違えました!のかな?
今必要としているのは、キーと値の両方で、キーはただの行数とかじゃなくって
ユニークなデータなので、while($hairetsu[$index] ne $hikaku){ $index++;}
の方だと無理なのかもしれません。ごめんなさいよく分かりません。
0758nobodyさん04/11/16 00:23:16ID:???
普通は、1000個もハッシュ作ってからindex検索するるより、
1000行ベタ検索した方が速い。30000行でもそうだったかな。
0759nobodyさん04/11/16 00:35:13ID:???
ごめん、30000行のはSQL+pnamazuとベタとの比較で、
そりゃDBのが速いが、pnamazuが介在してるからか、
たいして変わらなかった。QDBMあたりでやったらどう
かな。こんどやってみるか。
0760nobodyさん04/11/16 03:12:24ID:???
1回しか検索しないなら要素がいくつだろうがリニアサーチの方が速いけど、
何回も検索するならソートしてから二分探索するかハッシュ作った方が全然速い。
要素が1000個でも。
0761nobodyさん04/11/16 06:55:09ID:???
>>760
1回の検索ではリニアサーチの方が速いんなら、何回やっても
リニアサーチの方が速いだろうが(プッ
1*n < 1.2*n、ほれ回数が多くなるほど差は広がる。
0762nobodyさん04/11/16 07:06:06ID:???
>>744
ソートというより、一番近い値を探すという感じだね。

>>745
絶対無理。
0763nobodyさん04/11/16 08:47:34ID:???
>>761
mod_perlなんかならハッシュだな。つまり、何回も検索する際、
perlを起動しなおさない。作ったハッシュをメモリに保存しとく。
あと、namazuとかsufaryとかindexファイルを別に作っておくとか
すれば、>>760でOK.
0764nobodyさん04/11/16 11:13:02ID:???
最初にハッシュを作るステップを抜きにすれば、
リニアサーチよりハッシュの方が速いということ?
0765nobodyさん04/11/16 12:44:55ID:???
>>762
差分の絶対値でソートすればええやん

>>764
まあそういうことや
0766nobodyさん04/11/16 16:53:03ID:???
みんな
require 'ファイル';
って最初の方に読んじゃってますか?

そのファイルが必要な処理がある直前(複数箇所)で
requireしてるんだけど問題ありますかね?
複数箇所と行っても一回の起動では一箇所しか呼び出しません。
0767nobodyさん04/11/16 17:34:24ID:???
>>744
遅レス御免。
これで処理しても示されてる結果にはならないが、
条件が複数のソートはこんな感じでいいと思う。

$sort_routine = sub {
 my @La = split /,/, $a; my @Lb = split /,/, $b;
 abs(4 - $La[2]) <=> abs(4 - $Lb[2]) || $La[0] cmp $Lb[0] || $La[4] <=> $Lb[4];
};

@ahoo = sort $sort_routine @data;
076876204/11/17 06:08:04ID:???
ごめんなさい。質問を勘違いしてました。

質問内容は
・3の要素でソート
・1の要素で安定なソート
・5の要素で安定なソート
で、その順番を逆転させれば一回でできる訳ですね。
5の要素でソート、同じ値なら1の要素でソート、同じ値なら3の要素でソート。

use sort "stable";
my @new = map{ $_->[3] }
sort{ $a->[0] <=> $b->[0] or $a->[1] cmp $b->[1] or $a->[2] <=> $b->[2] }
# sort {$a->[1] cmp $b->[1] or $a->[2] <=> $b->[2] } # 3と1の要素だけでソート(例示と同じ結果を得る)
map{ my @v = split(/,/); [$v[4], $v[0], abs($v[2]-4), $_]; } @data;

>>745
つっこんでごめん。
076976704/11/17 07:36:26ID:???
なんだ、>>767の方法ってPerlメモってところで既出だったのか・・・。
せっかくその場で考えたのに、空しいぜ。
よく読んで頭冷やしてくるか。

>>766
条件などで読むファイルを変えたいときは、
途中に書いたことはあったけどね・・・。

何でもないときは、先頭に書くのが基本でしょ。
そのプログラムが、どのファイルに依存しているかを明示しておけば、
後々運用管理するのに楽になるし。
0770nobodyさん04/11/17 17:56:42ID:???
Perlメモお世話になってます。
0771nobodyさん04/11/17 18:32:44ID:tQLRR4kH
同じファイルハンドル(この場合$fh)から別ファイルに続けて書き出そうとすると
何も出力できません。

open (OUT,"> test/$test");

while(<$fh>){ #$fhはファイルハンドルが入っている
prin OUT $_;
}

close(OUT);

という処理を繰り返し実行すると2つ目のファイルは
なにも表示されません。

1回実行したあとファイルハンドル($fh)を表示してみましたが、
確かに指し示しているファイルは1回目と変わりません。
ファイルハンドルを書き出した後ファイルハンドルって
どうなってしまうのでしょうか?
0772nobodyさん04/11/17 19:09:57ID:???
>>771
prin じゃなくて printだよね?
while は$_を操作しません。
077377104/11/17 19:13:30ID:tQLRR4kH
すいません。printです。
forでも同じでした。
077477104/11/17 19:20:12ID:tQLRR4kH
なんどもすいません。
できました。書き出す前にtellでファイルハンドルの場所を
取って来て、書いた後seekで戻す事によって解決しました。
お騒がせしました。
0775はなわlo04/11/17 19:25:22ID:???
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
0776nobodyさん04/11/17 19:38:43ID:GNPvE3vb
htmlの部分とCGIの部分を分けてコーディングしたいです。
何かよいモジュールなどありませんでしょうか。
0777nobodyさん04/11/17 19:39:43ID:???
HTML::Template
0778nobodyさん04/11/17 20:00:07ID:???
>>775の[ここ壊れています]って初めて見た。
0779質問です04/11/18 01:55:30ID:U6GG0aJq
$file = "file.xxx";

$size = -s "$file";

print "Content-Disposition: attachment; filename=\"$file\"\n";
print "Content-Length: $size\n";
print "Content-Type: application/octet-stream\n\n";

open(DAT, "$file");
while(<DAT>){
print;
}
close(DAT);

のようなコードで file.xxx をダウンロードしたいのですが、
ダウンロード画面はちゃんとでてダウンロードできるのですが、
ファイルが壊れて保存されます。これはなんででしょうか。
OSはwindowsでapacheで動かしてます。。
0780nobodyさん04/11/18 02:59:31ID:???
>OSはwindowsでapacheで動かしてます。。
DATもSTDOUTもbinmode()せにゃあかんのでは?
0781779です。04/11/18 04:26:15ID:???
すいません。そのとおりでした。
ありがとうございます。
感謝感謝。
0782nobodyさん04/11/18 11:15:20ID:???
TO:[123] こんにちわ。

↑のような文字列から数値部分(123)だけを取り出す場合、どう書くのがスマートでしょうか?
TO:[数値] という書式は固定です。
0783nobodyさん04/11/18 11:17:02ID:???
$string =~/^TO:\[(\d+)\]/;
$no = $1;
0784nobodyさん04/11/18 11:23:07ID:???
>>783
できました!ありがとうございました!
0785nobodyさん04/11/18 13:06:46ID:If69CbzI
s/"/"/g;
1 while s/<font([\s\w\=\#\"\'\+\-]+)>/<font$1>/i;
1 while s/<\/font>/<\/font>/i;

これは"が"に変換されてるデータ($_)から"を"に戻し、
fontタグを有効にする処理ですが、これでは$_内の全ての"が"に戻ってしまいます。
しかし、"に戻す必要があるのはfontタグの"のみです。
最初にいきなりs/"/"/g;などとやらず、fontタグの"だけを"に戻す方法すにはどの様にすれば良いでしょうか?
0786nobodyさん04/11/18 13:10:17ID:???
すいません、書き直します・・・。;は全角です。

s/";/"/g;
1 while s/<font([\s\w\=\#\"\'\+\-]+)>/<font$1>/i;
1 while s/<\/font>/<\/font>/i;

これは"が";に変換されてるデータ($_)から";を"に戻し、
fontタグを有効にする処理ですが、これでは$_内の全ての";が"に戻ってしまいます。
しかし、"に戻す必要があるのはfontタグの";のみです。
最初にいきなりs/";/"/g;などとやらず、fontタグの";だけを"に戻す方法すにはどの様にすれば良いでしょうか?
0787nobodyさん04/11/18 13:13:42ID:???
馬鹿ですいません・・・。&quot;は全角で書きましたが本来は半角です。

s/&quot;/"/g;
1 while s/<font([\s\w\=\#\"\'\+\-]+)>/<font$1>/i;
1 while s/<\/font>/<\/font>/i;

これは"が&quot;に変換されてるデータ($_)から&quot;を"に戻し、
fontタグを有効にする処理ですが、これでは$_内の全ての&quot;が"に戻ってしまいます。
しかし、"に戻す必要があるのはfontタグの&quot;のみです。
最初にいきなりs/&quot;/"/g;などとやらず、fontタグの&quot;だけを"に戻す方法すにはどの様にすれば良いでしょうか?
0788nobodyさん04/11/18 13:14:13ID:???
stylesheetが使われる可能性も考えろよ
0789nobodyさん04/11/18 13:32:05ID:???
そもそもなんでFONTタグ内の " が &quot; に変換されとるの?
0790nobodyさん04/11/18 13:38:18ID:???
>>789
説明不足ですいません。
BBSのログで、保存する時点ではタグに関わる記号&;<>は全てデコードしてあります。
で、読み出して表示する際に許可したタグのみ有効にする仕組みになってて、fontタグのみ有効にしてます。
0791nobodyさん04/11/18 13:45:00ID:???
>>790
× &;<>
○ &"<>
でした・・・。
079278904/11/18 13:54:44ID:???
だったら、<> の2種類だけをエンティティーコードに変換すりゃええやん。
0793nobodyさん04/11/18 14:08:47ID:???
s!(?<=<font)([^>]+)!my $s = $1 ; $s =~ s/&quot;/\"/g ; $s!ieg ;

こうかなあ。
0794nobodyさん04/11/18 15:02:37ID:???
>>793
うまいこといかないっす・・
0795nobodyさん04/11/18 16:41:16ID:???
すいません。色々悩んだ挙句、ログに記録する時点でダブルクォートは&quot;に変換しない
って事にしました。
0796nobodyさん04/11/18 17:13:54ID:???
(´д`)
0797nobodyさん04/11/18 17:54:10ID:???
&hearts; → そのまま。

&hiroyuki; → &amp;hiroyuki;

みたいに実態参照が定義されていない場合のみ & をエスケープしようと思ったら、
定義されているやつを全部リストとかで持ってないとダメなんだろうか。

使えるモジュールとかありますか?
0798nobodyさん04/11/18 18:15:24ID:???
>>797
HTML::Entities

decode_entitiesに食わせて変化するか(定義されていれば変化する)

または、

%entity2charハッシュのキーにあれば定義されている

といったあたりでいけると思う。
0799nobodyさん04/11/18 18:48:22ID:???
>>794
なんで>>793のでうまくいかないんだ?
俺っちも考えたが、793と同じような形になったし。
もしかしてネタ?
0800nobodyさん04/11/18 19:09:44ID:???
>>798
ありがとう。うまくいってるようです。
でも借りてるサーバーには HTML:: が無いんだけど、まあコピーして置いとけば動くだろう。
0801nobodyさん04/11/18 19:59:02ID:???
>>799
すいません。<>も&lt;&gtに変換された状態なのを説明してませんでした。
<>のままの状態だと>>793さんので出来ました。
0802nobodyさん04/11/18 21:45:59ID:???
>>801
s!&lt;(/?font\b.*?)&gt;! (my $s=$1) =~ s/&quot;/\x22/g; "<$s>" !egis;
ではどう?
<font **>と</font>の両方を < > も含めて戻せると思うんだけど。
0803nobodyさん04/11/18 21:57:39ID:???
>>802
ばっちり復元出来ました!すげー!
FONTタグで囲まれたデータ部分の&lt;&gt;&quot;はそのままで、
タグの記述部分だけちゃんと変換されてます。
ありがとうございました!
0804nobodyさん04/11/19 08:46:55ID:???
超初心者な質問です。

telnetモジュールを使用して、リモートコンピュータに接続してから、
・screen起動
・外部プログラム起動
・CTRL-A d で[detached]
という操作をperlで実行したいのです。

色々サイトを回って調べて、telnet接続まではできたのですが、
上記手順の「CTRL-A d で[detached]」で行き詰っております。
CTRL-Aという操作をperlのtelnetモジュールで行うには、
どういう記述をすればよいのでしょうか?
080580404/11/19 10:44:06ID:???
説明が悪かった気がします。

何でscreenを使用したいかというと、
webブラウザ上で、サーバのプログラムを起動させ、常駐させたいからです。
通常のデーモン(inetdなど)であれば、わざわざscreenなど使わなくても
telnetモジュールで接続させ、コマンドを実行させればよいのですが
今回起動させたいプログラムは、バックグラウンドで動作してくれないため、
常にコンソールを開いておく必要があるのです。
なので、仮想的に常駐させるためにscreenを選んだというわけです。
当方、UNIX系OSに触れて1週間足らずなので、
「screenなんて使わなくても この方法でいいだろバカ」
という意見なども助かります。
0806nobodyさん04/11/19 10:59:05ID:n9OG7mgX
swfからcgiをたたいて、画像の縦横サイズを変更し、
swfに表示するということをやっております。
画像は正しくロードできるのですが、ファイルサイズが取得できず、
ローディング表示ができなくて困っています。

詳しく説明します。
まずswf内で
_root.[object].loadMovie("hoge.cgi", "POST");
を使い、ロードの要求をします。
するとhoge.cgiでimageMagickというモジュールを使い、
縦横サイズを変更します。ここでPOST送信されている
stageWとstageHとranはswfから送られてくる変数です。
080780604/11/19 10:59:50ID:n9OG7mgX
つづきです。
---
use Image::Magick;
if($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}else {
$query = $ENV{'QUERY_STRING'};
}
foreach $pair (split(/&/, $query)){
my ($key, $value)=split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$key}=$value;
}

$i = Image::Magick->new;
$img="img/cover$form{'ran'}.jpg";
$i->Read($img);
($width, $height)= $i->Get('width', 'height');
if($width/$height>=$form{'stageW'} / $form{'stageH'}){
$newwidth =$width*$form{'stageH'}/$height;
$i = $i->Transform(geometry=>$newwidth);
}else{
$newwidth= $form{'stageW'};
$i = $i->Transform(geometry=>$newwidth);
}
print "Content-type: image/jpeg\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
undef $i;
exit;
---
080880604/11/19 11:00:52ID:n9OG7mgX
つづき2です。
--
そして戻ってくる画像データをswf内にて
getBytesLoaded()やgetBytesTotal()で調べています。
するとロードされたバイト数はしっかり取得できているのに
対し、総ファイルサイズはロード中はずっと0になっていて、
ロードが完了すると総ファイルサイズが表示されます。

OS FreeBSD
perl 5.8.x
Flash ver.6.0

どうか、よろしくお願いいたします。
0809nobodyさん04/11/19 12:30:01ID:???
ヘッダじゃない? Content-Length
0810nobodyさん04/11/19 13:49:59ID:???
$alldataが空じゃなく、$ENV{'CONTENT_LENGTH'}が空の状態で

read STDIN,$alldata,$ENV{'CONTENT_LENGTH'};

を実行したら$alldataの中身は変わってませんでした。
原因はどこですか?
081181004/11/19 14:33:50ID:???
すいません、ちゃんと空でした。
0812nobodyさん04/11/19 15:43:47ID:???
これを設置してみたんですが、発言がややアイコンの右下に表示されるのが嫌です。
真横に表示させることはできないのでしょうか?
ttp://spiral.lib.net/cgi/mc/
0813nobodyさん04/11/19 15:47:41ID:???
右下じゃなくて右上でした
0814nobodyさん04/11/19 16:12:25ID:???
>>805 >/dev/null 2>&1
他にもnohupとか。

>>812
作った人に言え
0815nobodyさん04/11/19 16:17:03ID:???
>>814
無理なんです今は・・
0816nobodyさん04/11/19 19:45:10ID:???
perlで変数を()でくくって宣言しているのをしばしば見かけるのですが、
($tmp) = "hoge";
とか。
これは何の意味があるんでしょう?
0817nobodyさん04/11/19 20:16:23ID:???
>>816
その例ではまったく無意味かと
($foo, $bar) = @_;
とかやると
$foo = $_[0];
$bar = $_[1];
の効果が得られる。
多分書いた人の癖じゃないか?
0818nobodyさん04/11/19 20:26:47ID:???
>>817
レスありがとうございます。
某レスQのCGIにしばしば出現てて悩みました。()の中はスカラ変数が一つだけなんです。
実際は右辺はサブルーチンだったりするんですが、配列は戻ってこない。
($ret) = &getMessage("$filename$EXT");#戻り値は0か1
とか。
悩むのやめときます。
0819nobodyさん04/11/19 22:09:11ID:???
ていうかレスキューなんか参考にするのやめれ
082080404/11/19 22:47:11ID:???
>>814

レスありがとうございます。
/dev/nullについて調べて、実際に動かしてみました。
要するに出力をポイっとやるわけですよね?

末尾の2>&1は何でしょうか?色んなサイト調べてみましたが、
nullの動作に触れてるところばかりHITしたらしく。。orz

nohupもためさせてもらいました。
動作的にはscreenと似ているので、助かります。
しかし、nohupすると、私のUNKサバではかなり重くなってしまいます。。

出力を書き込んでいるからでしょうか?

あと、nohupや &での開始だと、telnetモジュールを切断させた後
ジョブをフォアグラウンドに復帰させる方法が見当つきません。。

我侭ばかりですいません。よろしくお願いします。



082180404/11/19 22:50:33ID:???
論点がPerlからズレてきているようなので、質問を訂正します。

割り込みキー入力(今回の場合はCTRL+A)を
perlからコンピュータに送信する方法はあるのでしょうか?

板汚し申し訳ないorz
0822nobodyさん04/11/19 23:02:34ID:???
>>818
そうやっておくと、もし2つ以上の返り値があった場合に
最初の値だけ取って、残りを捨てるということができる。
安全策ってわけだな。
あまり誉められたものではないと思うけど。

0823nobodyさん04/11/19 23:08:43ID:???
>>821
試してないけど\x01送るんじゃ駄目?
0824nobodyさん04/11/19 23:09:06ID:???
だからさ、2つ以上の返り値があるのかどうかわかんなくなっちゃうでしょ
082582304/11/19 23:20:43ID:???
>>821
おっと2>&1についてもついでに答えるんだった・・・
「標準エラー出力を標準出力に纏める」という意味。

nohupが重くなる理由はmanに書いてあったぞ
> スケジューリング優先度は 5 増やされるので、
> 実行の割り当て時間はやや小さくなる。
そんなに大きく変わるかは知らないが
082680404/11/20 00:21:15ID:???
>>823,825

レスありがとうございます。
大変貴重な情報をいただきました。
若干板違いな質問にも丁寧に答えてくださって、感謝です。
0827nobodyさん04/11/20 04:13:04ID:???
質問です.
ある, 改行コードがCR+LFのテキストファイルがアップロードされた際, 改行コードをLFに
変換し, そのファイルを保存するcgiを書きたいのですが, 以下のように書いてみましたがうまくいきません.
LFに変換されずCR+LFのまま保存されてしまいます.
#!/usr/bin/perl
use CGI;
$query = new CGI;
Content-type: text/html\n\n

$fn = $query->param('filename');
$type = $query->uploadInfo($fn)->{'Content-Type'};

if($type =~ /^text\//){
  open(FILE,">test.txt");
  while (<$fn>) {
    $temp = $_;
    $temp =~ s/\r\n/\n/;
    chomp($temp);
    print FILE "$temp\n";
  }
}
どのようにしたらいいでしょうか?宜しくお願いします.
0828nobodyさん04/11/20 06:01:26ID:???
>>827
そもそもそれ文法エラーだろ
0829nobodyさん04/11/20 08:04:12ID:???
>>806
>>809のContent-Lengthは、レスポンスの方だと思う。

print "Content-type: image/jpeg\n";
print "Content-length: $filesize\n\n";
で、$filesizeにjpegデータのサイズを入れておく。
(一旦テンポラリファイルを作らないとだめかも知れないけど)
0830nobodyさん04/11/20 08:31:32ID:???
windowsなら\nをさらに\r\nに直してくれる自動サービス付き
バイナリモード binmode を参考に
0831nobodyさん04/11/20 11:15:04ID:???
>>822
contextによって返す値がかわる関数もあるし意味もなくカッコつける癖は
まねしない方がいいと思われ
0832nobodyさん04/11/21 07:32:38ID:???
>>821
screen使った事ないけど、man読んでみた限りでは、
-d -Dでいけるんじゃ?

それから、うに板の方が適切な質問じゃないかと。
0833nobodyさん04/11/21 12:49:54ID:???
for(@list) {
...
}

の中で現在の行番号を取得する良い方法はありませんか?
$_ == $list[$hoge] になるような $hoge が知りたいのですが……。
カウンタ変数を新たに作るしかないんでしょうか。
083480604/11/21 13:04:12ID:Ewup0dSn
>829さん
お力添え、ありがとうございます。
早速やってみます!!
0835nobodyさん04/11/21 13:14:54ID:???
>>833
for(0..$#list){
処理
}
0836nobodyさん04/11/21 13:23:09ID:???
>>835
希望の処理ができました。
ありがとうございます。
0837nobodyさん04/11/21 18:47:52ID:8gMC3V6h
perl+mysqlでカートを作りました。
一応入力チェック(サニタイジング)として、like演算子のワイルドカードである
「%」と「_」があったら削除してます。

よく考えたら「_」はメールアドレスとして普通に使われてる可能性があるんですよね。
そこで質問ですが、_これってlike演算子以外では安全ですよね?

DBIのprepare時にプレースホルダを使用してるのですが、みなさんは_対策とかしてますか?

0838nobodyさん04/11/21 18:54:50ID:???
>>837
データを新規レコードとして挿入するだけなら問題ない。
まあlikeなんて挿入で使わないんだから気にするなよ。
0839nobodyさん04/11/21 19:01:17ID:ubTrO76H
@user_agent = split(/\//,$ENV{'HTTP_USER_AGENT'});
if ($user_agent[0] eq 'DoCoMo') { $URL=$iURL; }
elsif ($user_agent[0] eq 'J-PHONE') { $URL=$vURL; }
elsif($user_agent[0] eq 'UP.Browser' || $user_agent[0] =~ /^KDDI/) { $URL=$eURL; }
else { $URL=$pURL; }
print "Location:$URL\n\n";
print "Content-type: text/html\n\n";
print "<HTML><HEAD><META HTTP-EQUIV=\"REFRESH\" CONTENT=\"10;URL=$URL\"><TITLE>auto jump</TITLE></HEAD><BODY><A HREF=\"$URL\">自動でジャンプしない場合はこちらから</A></BODY></HTML>";
exit;

というのでHPを携帯なら携帯で察知して携帯用HPに
飛ばすようにしているのですが
話題の京ぽんを携帯用に飛ばしたいのですが出来ません。
ご教授ください。
0840nobodyさん04/11/21 19:33:12ID:???
>>837
プレースホルダつかってるなら勝手にエスケープしてくれるんじゃないの?
0841nobodyさん04/11/21 19:48:30ID:w/cY/u9z
urlだけを抜き出したいんですがうまくいきません。

@hoge=$url=~m/http:\/\/[-_.!~*'\[\]\(\)a-zA-Z0-9;\/?:\@&=+\$,%#]+/gi;


<a href="http://gaerge">fgagear</a>
とかを取得すると、
http://gaerge">fgagear</a>
となってしまいます。
どこをどう直せばいいんでしょうか。
0842nobodyさん04/11/21 19:54:09ID:???
>>841
urlのマッチングなんて探せばすぐ見つかるだろが
0843nobodyさん04/11/21 20:07:53ID:w/cY/u9z
どこが間違ってますか?
正規表現メモを参考にしたんですが。
0844nobodyさん04/11/21 20:55:58ID:???
>>839
AirWiki: AirH"PHONE/AH-K3001V/FAQ
http://d.memn0ck.com/index.cgi?AirH%22PHONE%2FAH-K3001V%2FFAQ#i15

>>841
my $url = qq{<a href="http://gaerge">fgagear</a>};
my @hoge = $url =~ m/http:\/\/[-_.!~*'\[\]\(\)a-zA-Z0-9;\/?:\@&=+\$,%#]+/gi;
print "@hoge";

問題なさそうだけど。
0845nobodyさん04/11/21 20:57:55ID:???
>>841
コピペして @hoge を print してみたけど
http://gaergeになったよ
084684104/11/21 21:33:14ID:???
確認してくれた方ありがとうございます。
正規表現事態は間違ってないみたいですね。
しかしなんでだろう・・
0847nobodyさん04/11/21 22:26:23ID:hibhMAES
今使ってるレンタルサーバーはcgiを別サーバーに置くようになっています。
cgiサーバーからhtmlサーバー内のログファイルを読み込むには、別サーバなので、
ソケットを使わなければいけないということで、とりあえずトップページを表示させようと、
次のソケットスクリプトを実行してみました。

  $host = "www.xxxxxxxxxxx.com";
$page = "/";
$line = "";
$addr = (gethostbyname($host))[4];
$name1 = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name1);
binmode(S);
select(S);
$| = 1;
select(stdout);
print S "GET $page HTTP/1.0\r\n\r\n";
while (<S>) { $line .= $_; }
close(S);
print $line;

ページの指定を$page = "/index.html";にするとNot Found
$page = "/";にするとForbiddenという反応が返ってきてうまくいきません。

これはただ、パスの指定が悪いだけなのか、やはりサーバーの設定で
ソケットが使えないようになっていて、cgiサーバーからhtmlサーバーの
ファイルを読み込むのはあきらめなければならないということでしょうか?
0848nobodyさん04/11/21 22:46:59ID:???
>>847
ソケットが使えないようになってるならそもそも
返事すらもらえないはずなので、パスじゃねーの?
0849nobodyさん04/11/21 22:50:12ID:???
最初にすべきことは使えるかどうかの確認じゃないかと
0850nobodyさん04/11/21 22:51:11ID:???
>>847
パスが合ってる筈なのにって場合は、リクエストにHOSTも入れた方がいいかも知れんね。
085183904/11/21 22:51:26ID:ubTrO76H
京ぽんのuser agentをいろいろ設定しましたが
どれもだめです。
そもそもの書き方を間違えているのでしょうか?
0852nobodyさん04/11/21 22:52:41ID:???
>>847
print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n";
■ このスレッドは過去ログ倉庫に格納されています