Perlコーディング初心者質問スレ Part 38
1 :
nobodyさん :
04/10/07 23:23:08 ID:kiEzDCJF Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
補足 コーディング 【coding】 プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。 (e-Wordsより) 自分の質問がPerlに関することなのか、 それともPerlではなくCGIやHTMLについてなのかを切り分けした上で、 質問して下さい。
前スレの
>>1 は文章自体は別に構わないと思うけど、前スレ
>>987 の意見を考慮して
以前の
>>1 に戻しました。
12 :
nobodyさん :04/10/08 00:40:34 ID:LN3yr29s
人によってコードの書き方は色々だと思うのですが、 一般的に美しいとされるコードの書き方はどのような書き方ですか? 参考になるようなソースがあればお教えください。
14 :
12 :04/10/08 02:14:31 ID:LN3yr29s
どうもありがとうございます。 しかしながら、見た目の美しさではなく、 コードを後から読む人にとって、 直感的に、わかりやすいコードという意味で、美しいといいました。 誤解を招く言い方でスイマセンでした。
16 :
12 :04/10/08 03:46:07 ID:LN3yr29s
スレに投下作戦で行こうと思います。 参考になりました。どうもありがとう。
>>1 スレ建て乙
>>14 >コードを後から読む人にとって
それだったら、コーディング標準に従ったコード
>>13 のURL参照
独自ルールだとどうしても*自分にとって*美しいコードになってしまうことがあるので
質問の意図からすると、
設計の簡潔さ、適切なサンプルコード/ドキュメント(POD)を重視した方がいいんじゃないかな
場合によってはコードを読まずにすませられることもあるよ。
18 :
nobodyさん :04/10/08 09:25:10 ID:D4NtGdWq
文字列の中に関数を直接展開するにはどうすればいいのでしょうか? シェルスクリプトでいうところの↓みたいなことがしたいんですが echo "current dir is `pwd`" 以前このスレで教えてもらったのですがやり方を忘れてしまいました ログもググってみたんですが見つかりませんでした
print "current dir is " .`pwd`; これが高速だし読みやすいのでお勧めだが… (printに関して言えば、ピリオドよりコンマの方が良いが) print "current dir is ${\`pwd`}"; print "current dir is ${\do{ `pwd` }"; print "current dir is @{[ `pwd` ]}"; ま、こんな感じで。
モジュールを使うことがオブジェクト指向ということになるんでしょうか?
>>20 全然違います。
モジュールとオブジェクト指向に直接関連はありません。
22 :
nobodyさん :04/10/08 16:02:04 ID:SvnbdnXk
プログラム実行中にperlでエラーメッセージを 別ウィンドウを使って表示することは可能でしょうか。 javascriptを使えばできるようなのですが、 perlのみでは無理なのでしょうか? スレ違いなら申し訳ないです。
23 :
12 :04/10/08 16:09:32 ID:HUGW4EIR
>17 どうもありがとうございます。 >>コードを後から読む人にとって >設計の簡潔さ、適切なサンプルコード/ドキュメント(POD)を重視した方がいいんじゃないかな >場合によってはコードを読まずにすませられることもあるよ。 ところで、PODとは、コメントのことでしょうか? コメントだとしても、コードを読まずに済ませられるとは考えにくいので 違う気もします。宜しけれご教授ください。
25 :
nobodyさん :04/10/08 16:39:18 ID:3yz40YUb
sendmailでメール送るときにccとかってどう書けばいいですか?
open MAIL ,"| /usr/sbin/sendmail -t";
print MAIL "From: ".'"ほげほげ" <
[email protected] >'."\n";
print MAIL "To: ".''."\n";
print MAIL "Cc: ".'<
[email protected] > <
[email protected] >'."\n";
print MAIL "Bcc: ".''."\n";
print MAIL "Subject: ".""."\n";
print MAIL "\n";
print MAIL "test";
close MAIL;
みたいにしても動作しませんでした。
もちろん普通にtoだけいれたら動作します。
どなたかお願いします。
スパムに使われそうだから、回答しないわ
>>23 > ところで、PODとは、コメントのことでしょうか?
> コメントだとしても、コードを読まずに済ませられるとは考えにくいので
PODは、コメントと言うよりは、ドキュメントと言った方が適切かもしれない。
Perlの標準モジュールの多くは慣習的に、
モジュールの説明、そのモジュールの使い方(実際に動く最小限のコード)
関数/メソッドのリファレンス、... などを含んでいるので
たとえば、◯◯をしたいといったとき、
PODにそのサンプルが載っていれば内部実装のコードを読む必要はない。
(デバッグで必要になる時までは...)
28 :
12 :04/10/08 18:01:20 ID:HUGW4EIR
>24 >27 どうもありがとう。色々コード&POD読んでみます。 精進します。ありがとう。
29 :
25 :04/10/08 18:25:06 ID:3yz40YUb
>>26 spamに使うならID出しませんよ。
どなたか
>>25 の回答をお願いしますm(__)m
>>26 ソンナコトイッタラナンデモソウジャナイカw
ウイルス作成に使われそうだから、このスレ閉じるか?
>>25 open MAIL ,"| /usr/sbin/sendmail -t";
print MAIL "From: ほげほげ <
[email protected] >\n";
print MAIL "To: \n";
print MAIL "Cc: <
[email protected] >,<
[email protected] >\n";
print MAIL "Bcc: \n";
print MAIL "Subject: スレ違い\n";
print MAIL "\n";
print MAIL "Ccでアドレス列記はperlには関係することではない";
close MAIL;
IDなんて飾りですよ
節穴とどっちが個人特定性が高いだろうか
>>33 その節穴ってどうなってんの?
個人特定性は節穴の方が高いでしょ。ID衝突は時々見かける。
35 :
nobodyさん :04/10/09 19:46:27 ID:r3ZvWrWV
ログが100行を越した場合最後の1行を残してあとのログが消えるようにしているのですが ログが10行を越したときに1行だけ残してあとのログが消えるようにするのとどっちが負荷が低いのでしょう_? つまり、頻繁にログを1行にするのと、100行ものログを読みこむのと、どちらが負荷がかかるんでしょう。
>>35 自 分 で 試 し ま し ょ う 。
use べんちまーく;
37 :
初心者です。 :04/10/09 20:26:36 ID:fCvsZBf9
フリーの掲示板の設置が上手く出来たのですが、スクリプトの改造で
以下の戻り先URLの設定でターゲットの設定は出来ないのでしょうか?
_topに戻りたいのですが、戻れません。
# 戻り先URL
$home = '
http://xxxxx.com/index.html ';
誰か教えて下さいませ。大変困ってます。<(_ _)>
39 :
nobodyさん :04/10/09 21:00:25 ID:LGUhwPv/
IISでActive Perl入れてやってますが
SMTPを使ってのメール送信で送れてはいますが
OEでの受信で宛先の部分が
undisclosed-recipients になってしまいます。
送信元は正常に表示されているのですが。
どこを修正すればよいでしょうか?
お願いします。
use Net::SMTP;
$smtp = Net::SMTP->new('***.***.ne.jp'); #SMTPサーバ
$smtp->mail(
[email protected] ); #送信元
$smtp->to(to@
[email protected] ); #宛先
$smtp->data();
$smtp->datasend("Subject:メール\n"); #件名
$smtp->datasend("メール本文");
$smtp->dataend();
$smtp->quit;
40 :
39 :04/10/09 21:03:05 ID:LGUhwPv/
41 :
39 :04/10/09 21:04:23 ID:LGUhwPv/
ご存知の方、お願いします。
>>39 $smtp->datasend("To: ・・・\n); はどうした?
宛先がないだろうが
>>39 > $smtp->mail(
[email protected] ); #送信元
$smtp->mail('
[email protected] '); # MAIL FROM
> $smtp->to(to@
[email protected] ); #宛先
$smtp->to('
[email protected] '); # RCPT TO
> $smtp->datasend("Subject:メール\n"); #件名
> $smtp->datasend("メール本文");
$smtp->datasend("To: 39 <to\@example.jp>\n"); # To: ヘッダ
$smtp->datasend("Subject: メール\n");
$smtp->datasend("\n");
$smtp->datasend("メール本文");
>>39 君はRFC2822を勉強したまえ。このままでは腐ったメッセージ垂れ流しそうな悪寒。
45 :
nobodyさん :04/10/09 21:46:43 ID:LGUhwPv/
46 :
nobodyさん :04/10/09 21:48:33 ID:LGUhwPv/
47 :
nobodyさん :04/10/10 00:20:52 ID:mkQG3wAc
ある関数内からスコープ外にある無名ハッシュの値を 操作したいのですがうまくいきません my $p = { data => 1 }; &abc($p); print "$p->{data}\n"; sub abc { my $p = shift; $p->{data} = 2; } ↑のようにやってみたのですがなぜかダメでした 再帰処理がしたいので関数内から直接変数の値をいじることはできません
>>47 そのコードは問題なく動くので別の所がおかしいのだろう。
use strict; や -w オプション、デバッガで地道に調べてくれ。
blessしたあとにインスタンス変数に代入してもいいんですか?
オブジェクト指向な考えだと掲示板でいう 書き込みとか削除とかをifで分けていく部分はどういう風にしたらいいんですか?
わけわかめ
if ($mode eq 'write') { &write; } elsif ($mode eq 'delete') { &delete; } こんな感じのt所です。
>>53 デザインパターンなんて言葉を知らなかった
さんくすべるーまっち
55 :
nobodyさん :04/10/10 03:18:58 ID:vb66WTKp
$AoA[$i] = [@array] という配列のリファレンスを配列に入れる処理が @{$AoA[$i]} = @array で代用できるという事がよく分かりません。 @{$AoA[$i]} = @array と言うのはどういうことですか? @($AoA[$i]) = @array との違いを教えてください。
>>55 普通の配列変数を書く時の @array って書き方。コレ、本当は @{array} の
{ } を省略したものなんだよ。@{ と } で挟まれたホニャララを配列として扱い
ますよ、って意味で、ホニャララが 裸のワード だったら普通の配列変数と
して扱われるんだ。
@{array} = (0,2,4,8); # array という名前の配列変数
ホニャララはリファレンスでも構わなくて、配列に対してできる操作は
同じようにできちゃう。配列の要素を見る時は ${ ホニャララ }[ 添え字 ]
って構文になるよ。
$a_ref = [1,3,5,7]; # 名無しのリストリファレンス
print @{array}; push @{array}, 10; ${array}[0] = 12;
print @{$a_ref}; push @{$a_ref}, 9; ${$a_ref}[0] = 11;
そして当然、代入も。
@{array} = (0,2,4,8);
@{$a_ref} = (1,3,5,7);
文法的に間違えようのない場所なら、この { } は省略できるんだ。
print @array;
print @$a_ref;
続き。 Perl の変数は予め宣言しなくても使えるよね。この振る舞いと同じように、 未定義な「場所」をムリヤリ配列として使おうとすると、本当にそういう事に しちゃうんだ。その「場所」がスカラー値しか収められない「場所」なら、 それ自体はスカラー値であるリストリファレンスが収まるってわけさ。 @{AoA} = (); # 空っぽの配列 # スカラー値を収められる入れ物に、リストリファレンスを作って入れる ${AoA}[0] = [0,2,4,8]; # ${AoA}[1] は配列だと勝手に決めて、代入しちゃう! @{${AoA}[1]} = (1,3,5,7); 気をつけなきゃいけないのは、未定義でもリファレンスでもない「場所」を ムリヤリ配列として使おうとした時。perl はこういう時、下の例なら $foo の 値、つまり hoge って名前の配列変数を勝手に使っちゃうんだ。 $foo = 'hoge'; # ただの文字列 @hoge = (2,4,6,8); @{$foo} = (0,1,2,3); print @hoge; # 0123 この危険な機能の名前はシンボリックリファレンス。 use strict 'refs'; と 唱えておく事で禁止できるよ。
58 :
nobodyさん :04/10/10 14:32:49 ID:bziwCOA4
メールアドレスの@から右のドメインを取得するには
どのような関数がありますでしょうか?
例えば、
[email protected] の aaa.ne.jpだけを取得したいんです。
ご存知の方お願いします。
60 :
nobodyさん :04/10/10 15:21:22 ID:bziwCOA4
>>59 indexは検索文字が対象文字列に存在するかのだと思いましたが
どのようにすればよいんでしょうか?
62 :
55 :04/10/10 19:15:24 ID:vb66WTKp
>56 >57 ありがとうございました。 つまり $a_ref = [0,2,4,6]; などと記述があった後に @{$a_ref} = (1,3,5,7); と書かれていたら $a_ref = [1,3,5,7]; と読替えて良いと言うことでしょうか?
63 :
39 :04/10/10 20:18:00 ID:bziwCOA4
64 :
大文字小文字混在をアルファベット順にソートしたい :04/10/10 21:23:27 ID:0NABqG2B
ID(大文字小文字混在の半角英数)と得点を格納したハッシュ%dataがあります。 これを得点の高い順に並べ、さらに同じ得点同士ではアルファベット順に並べて IDを取り出したいと思います。そこで以下のようにしました。 %data= ('aaa' => 90, 'bbb' => 80, 'CCC' => 80, 'DDD' => 70,); @id_array = sort { $data{$b} <=> $data{$a} or $a cmp $b} keys %data; しかし、これでは同じ得点の人が 大文字のアルファベット順→小文字のアルファベット順になってしまいました。 (上の例ではaaa, CCC, bbb, DDD,の順になる) アルファベットの順(aaa, bbb, CCC, DDDの順)に並べ替える方法はありますか?
>>64 自分で sort の中に何が書けるかわかってないんじゃない?
まぁいいや。
sort { $data{$b} <=> $data{$a} or lc($a) cmp lc($b) }
とか、大文字と小文字を無くすようなことをしてやれば、全て正解でしょうに。
66 :
64 :04/10/10 22:02:50 ID:0NABqG2B
>>65 できました。
文字コード自体が大文字アルファベット→小文字アルファベットの順に
なってるので、仕様だと思ってあきらめていました。
ありがとうございます。・゚・(ノД`)・゚・。
>>62 いや、だいぶ違う。
@$a_ref = (...)は新しいリファレンスを作らないし、tieやblessなどの影響はそのまま。
$a_ref = []は新しいリファレンスを作る。
特に後者にする必要がなければ、前者の方法を使った方がいい。
68 :
62 :04/10/11 01:38:46 ID:21NinhME
>>67 わかりました。あの後、ラクダ読んでなんとなく
感覚が掴めました。ありがとうございました。
みんなクッキーに日本語入れる時、16進数に直してますか? 漏れは直さないでそのまま使えてるんだけどなんで一般的に直す必要があるのでしょうか?
71 :
nobodyさん :04/10/12 00:56:44 ID:J8ZBB7PX
perlに限らず一般的なプログラミングの話になっちゃうかもしれないけど・・・ 掲示板のCGIを作ってる最中なんだけど、 (1)全ての書き込みを一つのログファイルにする (2)書き込み毎にログファイルをつくる ログが1000件あると仮定して10件を表示する場合、どちらの方がリソース食うだろう? (1)の場合、処理手順は少ないが余計なデータを大量に読み込む。 (2)の場合、opendir、readdirでファイル名を読み込み、かつ各々のファイルを読み込むので、 処理は繁雑になるが余計なデータをメモリ上に展開しない。 はやりシステムとのやり取りが多くなる(2)の方がコスト高いのだろうか?
ルーチンにもよるが・・・ 儂のケースでは、データーが300件ぐらいで使ってたフリー鯖でゴルァされたのでsql導入した。
>>71 俺は(1)を選ぶ。システムコールが少ない方が好きなので。
しかしログがでかくなると厄介なのも確か。
あと、データーが固定長なら1ファイルにして seekで位置決めしてread,writeってのもあり。
>>73-75 レスありがとうございます。とりあえず、一般的(と思われる)(1)の方法でやってみます。
データは可変長ですが、固定長にしてoffsetで狙い撃ちもアリですね。ちょっと工夫してみます。
>>73 すいません。そのスレ知りませんでした。
低額でsql使えるところを探すのが、後々のこと考えても楽になると思うな。
質問です、 open IN,$dat.dat @var[50..60]=<IN> これは$dat.datを全部読んでいるんですか?それとも60行目で処理が終了しますか?
キミは@varの中身を覗いた上でその発言をしているのかね?
>>78 読むことは読むけど、速いことは速いんじゃない?
今のCPUで読み込みファイルの大きさで遅いってことは、普通の取り扱う範囲の
テキストファイル(1M以下程度)だとあり得ない希ガス。
Perlが一番遅いのって、「値のコピー」周辺だと思うんだけどネェ。
(特にリスト系)
まぁ、ファイルの大小と、スライス有・無でベンチとってみれヴぁ?
>Perlが一番遅いのって、「値のコピー」周辺だと思うんだけどネェ。 前スレにファイルの扱いの方が遅いと書いてあった希ガス よほどたいそうなモン作らない限りは誤差の範囲だろ
CGIでやるんなら、パラメータで作るのが手っ取り早いっしょ
use benchmarkで計測した結果があるのですが、 出力結果の見方がわかりません。 テンプレにはベンチマーク関連の資料が見当たらないのですが、 見方などが載っているサイトをご存知の方いませんか?
86 :
nobodyさん :04/10/13 12:37:35 ID:SrofvYG0
Q:0〜6の数字をそれぞれ$p1 〜 $p7に代入したい ただし、$p1 〜 $p7はそれぞれ違う数字になるように代入したい と思い、こんなコードを考えたのですが
87 :
86 :04/10/13 12:38:00 ID:SrofvYG0
$p1 = int(rand 7); $p2 = int(rand 7); while($p1 == $p2){ $p2 = int(rand 7); } $p3 = int(rand 7); while($p1 == $p3 or $p2 == $p3){ $p3 = int(rand 7); } $p4 = int(rand 7); while($p1 == $p4 or $p2 == $p4 or $p3 == $p4){ $p4 = int(rand 7); } $p5 = int(rand 7); while($p1 == $p5 or $p2 == $p5 or $p3 == $p5 or $p4 == $p5){ $p5 = int(rand 7); } $p6 = int(rand 7); while($p1 == $p6 or $p2 == $p6 or $p3 == $p6 or $p4 == $p6 or $p5 == $p6){ $p6 = int(rand 7); } $p7 = int(rand 7); while($p1 == $p7 or $p2 == $p7 or $p3 == $p7 or $p4 == $p7 or $p5 == $p7 or $p6 == $p7){ $p7 = int(rand 7); }
88 :
86 :04/10/13 12:38:40 ID:SrofvYG0
見れば見るほど頭悪そうな感じがします。。。7くらいならいいけど p1〜p100までに1〜100までの数字をそれぞれ違う数字が入るようにするなんてするとひどいコードになる事に・・・ うまくループ構文使えばもっと簡単なコードになる気がするのですが 私では作れませんでした・・・どなたかご存知でしたら教えていただけますでしょうか。 (ちなみになぜこんな事をやりだしたかというと、特定個数の全てのアイコンを毎回順序をランダムで表示したいと考えたからです) 連続カキコすいません。(改行エラーでたので)
質問です。BBSのログを読み出す際に、URLがある場合にはリンクを貼ろうと思っています。
例えば、普通にリンクを貼るだけならできるのですが、
自サイトへはinner、他サイトへはouterというスタイルを適用したいと思っています。
ログの例:(MyIDを含むのが自サイトとします)
http://localhost/MyID/<BR >
http://www.2ch.net/ 出したい出力結果(HTML上):
<A href="
http://localhost/MyID/ "class="inner">
http://localhost/MyID/</A ><BR><A href="
http://www.2ch.net/ " class="outer">
http://www.2ch.net/</A >
sub link { # 引数に渡すのはログ全体
$_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+MyID[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="inner">$2<\/A>/g;
$_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="outer">$2<\/A>/g;
}
こう記述すると、前者も後者も全てouterになってしまいます。
if ($_[0] =~ /MyID/) {
$_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+MyID[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="inner">$2<\/A>/g;
} else {
$_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="outer">$2<\/A>/g;
}
こうすると、今度は自サイトへのリンクは貼られるのですが、他サイトへのリンクは貼られなくなってしまいます。
上記の出したい出力結果を出すには、どのように記述したらよいのでしょうか。
>>86 数値を配列に入れてから
その配列をランダマイズすれば?
91 :
86 :04/10/13 13:33:52 ID:SrofvYG0
>>90 配列ってランダマイズできるんですか・・・。
知りませんでした汗
ありがとうございました。探してやってみます。
>>86 @array=();
for ($count = 0; $count < 7; $count++) {
push(@array,$count);
}
&shuffle( \@array );
sub shuffle {
my $array = shift;
my $i;
for ($i = @$array; --$i; ) {
my $j = int rand ($i+1);
next if $i == $j;
@$array[$i,$j] = @$array[$j,$i];
}
}
&shuffleを呼び出す前と、呼び出した後で@arrayの中身を見てみよう。
>>86 @outにランダムな数値を出力。
@in = (1 ..100);
@out = ();
srand;
foreach (@in) {
my $r = int rand (@in + 1);
push(@out, $in[$r]);
$out[$r] = $_;
}
>>94 それ、値が入らない場合もあるし、
同じ値が入りまくってるじゃん。
>>86 の要件を満たしてないぞ。
>>86 srand(time());
%hash = map {$_ => rand()} 0 .. 6;
@array = map $_, sort {$hash{$a} <=> $hash{$b}} keys(%hash);
print "@array\n";
いろいろ書いてみるのも楽しいのだが、オレは堕落したので List::Utilのshuffle使うな
俺は5.6だから使えないYO!! モジュールに頼りっきりになるのもアレだが、でも使えるものは使っていきたいよね。
(12 15 17 20 50)のような配列があったとして ↑の配列の中から18に一番近い数字を取り出すみたいなのはどうしたらいいでしょうか?
>>99 $seed =18;
$tmp = $seed;
@data = (12,15,20,50);
for(@data){
my $diff = abs($_ - $seed);
$min = $_ if($diff <= $tmp);
}
print $min;
こんなんでどない?
101 :
99 :04/10/13 16:24:16 ID:???
ミスった。 $seed =18; $tmp = $seed; @data = (12,15,20,50); for(@data){ my $diff = abs($_ - $seed); if($diff <= $tmp){ $min = $_; $tmp = $diff; } } print $min;
もし、数値の配列がクソ長いのであれば、 abs($_ - $seed);が0の時はlastで抜けちまった方が良さげ
thx!!!
オレはList::Utilラブなので、 reduce {abs($a-$seed)<abs($b-$seed)?$a:$b} @data
105 :
86 :04/10/13 18:17:10 ID:???
いろんなコードを書いていただいてありがとうございました。 書いていただいた全てのコードが勉強になりました。 一つ一つ検証して試してみたいと思います。
106 :
nobodyさん :04/10/14 00:02:36 ID:pD0/ztzC
連想配列の配列数を得るにはどうすればいいのでしょうか? forなどで一個一個数えていくしかないのでしょうか?
>>106 $a = scalar keys %HASH;
108 :
89 :04/10/14 00:15:43 ID:???
どなたかわかる人いらっしゃらないでしょうか; それともこういうのは理論上無理なんですかね・・・
@data = ('A,2,黄緑', 'C,3,青紫', 'B,4,赤', 'C,6,青', 'A,7,緑', 'A,9,紫', 'B,10,黄'); こんな感じである配列の先頭にあるa,b,cの数を数えて 連想配列に %count = (A,3, B,1, C,2); こんな感じに持って行くにはどうしたら良いんでしょう?
(りんご、みかん、りんご、ぶどう、みかん、すいか、りんご) という配列のなかから一番多いものだけを取り出すってのはどうしたらいいですか? この中だとりんごに当たりますね。
ここは丸投げスレか
>>108 まずurlにマッチングさせてからinnerかouterか判定させれば?
urlの正規表現についてはググればすぐに出てくるので。
あと、エスケープする必要があるものとそうでないもの調べてくれ。
>>110 ここはアルゴリズムを質問するスレではない。
「こういうアルゴリズムを考えたので Perl で実装したいんですが
どうコーディングしたら良いですか?」
という質問形式にして出直してきたまえ。
例えば、いったん各々の個数を全部数え上げるというアルゴリズムで行くなら、
ハッシュをインクリメントしていって、数え終った後でソートする、というのが素直だろうな。
前に114と同じことを書いたら叩かれたのを思い出した
116 :
nobodyさん :04/10/14 06:51:34 ID:ETIFZxwk
【目的】 Net::SSH::Perlを使ってサーバに入り、任意のメールアドレスに対してメール を送信するスクリプトを作る。 【スクリプト】 #!/usr/bin/perl -w use Net::SSH::Perl; $host = "www.test.net"; $user = "hogehoge"; $pass = "2ch_test"; $cmd = "mail hoge\@hoge.ne.jp"; $body = "www.test.net is ok\n"; $ssh = Net::SSH::Perl->new($host); $ssh->login($user, $pass); $ssh->cmd($cmd); $ssh->cmd($body); 【説明】 スクリプトを実行したとき、指定したサーバにログインすることはできるので すが、それ以上処理が進まず、メール送信もされません。ただ、スクリプトを 実行させてキーボードから文字を入力してCtrl-Cで処理を中断するとメールは 配信されます。 [mona@localhosst mona]% ./test.pl<Enter> これはテストです。<Enter> Ctrl-C 【教えて欲しいこと】 $bodyの内容を自動的に標準入力に代入し、メールを送信する。 加えて、サーバからの切断も自動的に行ってくれる。 以上の二点を解決したいです。 よろしくお願いします。
@a = "ァー"; for(@a){ @b = split / | /; #全角or半角スペースで切る } for(@b){ print; } というコードを実行すると何故か ゼ と表示されます。これはどういうことでしょうか? $aの「ァー」の部分を色々変えてみましたが、 こうなるのは「ァー」と「ぁー」です。 どなたか分る方いたら教えてください。
118 :
nobodyさん :04/10/14 08:36:03 ID:eMIY0T+H
>>117 たぶんソースをeucで書いてるだろうから、
use encoding 'euc-jp';
を頭に追加すれば直ると思うが。
unicode機能を有効にしないperlでは日本語の2バイトコードは
1つの文字としては扱えず、1バイトずつバラバラのバイト列と
なってしまう。
"ァー" = "\xa5\xa1\xa1\xbc"
/ | / = /\xa1\xa1| /
なので、ァーの部分は真中の\xa1\xa1の部分を区切りとして
splitされてしまい、\xa5\xbcが出力される。これは「ゼ」。
同様に「ぁー」のときは「ぜ」になってるはず。
122 :
118 :04/10/14 10:39:49 ID:eMIY0T+H
>>119 レスありがとうございます。
でもそれではうまく行きませんでした。
SN以降が削除されずにそのまま出力されているようです。
123 :
118 :04/10/14 10:43:11 ID:eMIY0T+H
失礼、うまくいきました! 感謝感謝です。ありがとう。
124 :
117 :04/10/14 12:36:50 ID:???
>>120 ありがとうございます!
完璧な説明大変感謝してます。
125 :
117 :04/10/14 12:42:18 ID:???
感謝した先から申し訳ないのですが、 コードはEUCで書いてるのですが 扱ってるデータがS-JISだったりします。 use encoding 'euc-jp'; したら、データが化けてしまいます。 そういう場合 :コードの文字コードと 扱ってるデータの文字コードが違う場合: どう対処したらよいのでしょうか?
127 :
117 :04/10/14 13:13:06 ID:???
>>126 コーディング、の定義を教えて下さい(・_・)(._.)
129 :
117 :04/10/14 13:59:16 ID:???
>>127 は僕じゃないです。
変な質問して、荒らしてしまって申し訳ないです。
131 :
117 :04/10/14 14:05:05 ID:???
132 :
nobodyさん :04/10/14 17:55:56 ID:8JHhLpH4
my($takesi,@takesi); は my *takesi; と同じと考えてよろしいでしょうか?
久しぶりだなこのスレ
コーディング 【coding】
プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
(e-Wordsより)
>>126 は何故に
>>125 に対してこれを読めって言ったの?
文字コード問題は設計とは関係ないってか?そんなアホな事はないよな。
そもそもよほどのことでない限りコーディングと無関係にはなれないんだがな。
例えば俺の話とかなwww完全にすれ違いってやつだ。
まあお前ら少しは言葉の勉強もしろよ。
>>134 そうだったのですか。
あやうく欲張るところでした。
ありがとうございました。
136 :
nobodyさん :04/10/14 23:56:21 ID:mdncFzXx
$abc = shift; この shift ってどういう意味なんでしょうか? 関数ですか?
$b = "こん" $c = "にちわ" 変数$aに$bと$cを結合したもの、つまり "こんにちわ"を代入するには $a = $b.$c で大丈夫でしょうか?
便乗質問。
>>137 と似てるんですが、
$b = "co"
$c = "jp"
の場合に $a に co.jp を代入するにはどうすればいいですか?
$a = $b\..$c
で合ってます??
>>136 関数。shift unshift pop push 他。
>>138 $a = $b.'.'.$c
このままperlの言語仕様を全部質問されそうな勢いだな。 何スレぐらいかかるだろうか。
143 :
nobodyさん :04/10/15 08:35:47 ID:0zK8noVI
掲示板があったとして log.txtを編集するために bbs1.cgiでflockした場合 bbs2.cgiで編集しようとした時にも ロックされてるんですか?
>>139 さん、shiftって配列の先頭の要素を削除する関数ではないんですか?
shift (@data);
とかならわかるんですけど、
スカラー = shiftという意味がわからないのです。
print "Location:
http://www.2ch.net/ ";
という文のみのファイルを作って、プラウザからアクセスすると指定URLに飛びますが、
上記の文より前に
print "Content-type: text/html\n\n";
などと書かれていると、ブラウザ上に「Location:
http://www.2ch.net/ 」という文字列が表示されてしまいます。
やりたい事は、フォームから検索をかけて、検索処理中の間は特定のページを表示して、
検索が終了したらその結果を表示する画面に遷移する、ということです。
「検索処理のリクエストを受ける → 特定のページを出す「お待ちください」など → 検索終了 → 結果表示」
要するに、1回のPerlの処理で、ブラウザ上で複数のページ間を遷移させる事は可能でしょうか。
>>145 君のやろうとしていることは perl とは関係無い。
javascript を勉強する方が役に立つだろう。
HTMLでmetaで指定する部分は全てヘッダで返せるのでしょうか? 例えば <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/Javascript"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="pragma" content="no-cache"> を、 print "Content-type: text/html; charset=Shift_JIS\n"; print "Content-Style-Type: text/css\n"; print "Content-Script-Type: text/Javascript\n"; print "cache-control: no-cache\n"; print "pragma: no-cache\n\n"; にした場合、きちんと返ってるのでしょうか?
聞く前にやってみてはどうかね。
返ってるか分からないんです…
最近はやればわかるのにやりもしないで質問してくる連中が多いな
>>148 一点目のアドバイス。
「きちんと返っているかどうか確認する方法を教えてください」と質問すれば
いじめられることもなかっただろうに。
二点目のアドバイス。
どっちにしても Perl と全く関係ない質問なので、
WebProg初心者スレなどで聞く方が正解。
>>143 bbs2.cgiがflock使うなら勿論ロックになる。
flockはセマフォでの唯一のロック獲得争いにすぎない。
そのロックしないプログラムには通用しない。
>>154 bbs.cgiでlog.txtに書き込みするためロックしました
そのままdelete.cgiでlog.txtの書き込みの一部を削除しようとした場合には
ロックはされてないということでいいんですか?
flockによるロックは、トイレにカギをかけるようなものではなく、 カギのかからないトイレのドアに使用中と札を下げるようなもの。 その札を見てくれる奴には効果はあるが、ハナから見ちゃいねー 奴には無効。delete.cgiがどっちの奴かはオレにはわからない。
>>155 delete.cgiが、flockでlog.txtに対するロックを獲得しようとすれば、ちゃんと排他制御がなされる。
(bbs.cgiがロックを返すまで待つか、即座に獲得失敗するかはモード次第)。
しかし、delete.cgiがflockを行っていないのなら、bbs.cgiによる排他制御は無意味。
bbs.cgiがロックを得ている・得ていないに関わらず操作可能。
flockは、お手軽なロック機構にすぎない。
(ロック用ディレクトリとか、スリープするか即座に失敗させるかを自力でやらなくて良いって程度のもの)。
>>153 だが、
>flockはセマフォでの唯一のロック獲得争いにすぎない。
これは勘違いだったようだ。perlのflockがセマフォ使ってるわけじゃないか。
もう氏ぬ。
160 :
nobodyさん :04/10/15 20:46:48 ID:M3+xPf5C
クーロンでperlで作成したブログラムを起動したいのですが、 どうしたらいいのでしょうか? 普通はブラウザのボタンから起動されると 思うのですが、ある時間が来ると自動で動かしたいのです。よろしくお願いします。
>>160 好きなようにセットしろよ
使い方分からないならググれば一発だろ
ついでにスレ違いな
>>159 下の下の方(flock(2)やfcntl(2)の下のほう)ではセマフォつかってるよ。多分。
それでも↓は意味不明だけど。
> >flockはセマフォでの唯一のロック獲得争いにすぎない。
1000ステップのperlスクリプトと、200ステップのperlスクリプト、 どちらも実行ステップは100だとしても、やはり後者の方がサーバに対する 負荷は少ないのだろうか。
それはもちろん自分で負荷を計測してから聞いt(
>>163 1ステップだ。↓を実行してみな
while(1) { fork;}
前のカキコした香具師とは関係ないが便乗して 計測の方法が分かりません。。。 ググったらWin鯖は無理と書いてあったんですが、Win鯖で出来るソフトありませんか?
perlのスクリプトでflockしたファイルに対して、PHPのスクリプトでflockしたら(もしくはその逆も)、 ちゃんと排他は行われるでしょうか?
CGIカウンターを設置したいので、perlを勉強しています。参考書を見て↓のを作成したのですが。 # カウントファイルの読み込み open(FILE, "+<./count.dat") or die("エラー:カウントファイルが開けません"); eval{ flock(FILE, 2);}; $count = <FILE>; # カウントファイルの書き込み seek(FILE, 0, 0); print FILE ++$count; close(FILE); # サーバ出力 print <<END; Content-type: text/html 中略) END Apachでエラーログをみると Premature end of script headers と出てしまいます。 どの部分を訂正すればよいのでしょうか?ご存知の方、ご指導お願いします。
print <<END; Content-type: text/html 中略)
open(FILE, "+<./count.dat") or die("エラー:カウントファイルが開けません"); このdieの部分はどこに出力されるのですか?ログとか?
標準エラー出力 (STDERR)
173 :
nobodyさん :04/10/17 01:38:29 ID:sz1VkLQM
配列のリファレンスをforeachで処理するにはどうしたらいいですか? $dbh->{NAME} が配列へのリファレンスだとして、 $dbh->{NAME}->[0]ではアクセスできる状態です。 foreach($dbh->{NAME}) { print; } foreach($$dbh->{NAME}) { print; } 等とやってもうまくいきませんでした。
@{$dbh->{NAME}}
>>174 うまくいきました。ありがとうございました。
>170 中略)の部分は <html> <head><title>perlアクセスカウンター</title></head> <body> <P>あなたは$count番目の訪問者です。</p> </body> </html> END Premature end of script headers エラー:カウントファイルが開けません のエラーログが出ます。 open or die の文がおかしいのかと思ったのですが、良くわかりませんでした。よろしくお願いします。
初心者なんで間違ってるかもしれんが、 Content-type:text/htmlの後に改行が2つ(\n\n)必要だった希ガス
openに失敗してるんだろ
>>168 双方が協調して動作するためには、同じ方式のロックメカニズムを使用する必要があるが、
perlのflockはOSが提供しているflockとは限らない、PHPは知らない。
プラットフォームインディペンデントに作るなら、昔ながらのロックファイル方式か、
OSの提供する排他制御のプリミティブを直接呼び出すのがいいだろう。
二次配列等は使えますか?
>>180 ここに書く前にperlのdocument群を読んで欲しいかも。。。
183 :
180 :04/10/18 01:23:59 ID:???
これは失礼いたしました…
myについて質問させて下さい。 sub a { my $daskin; $daskin="かきくけこ"; &b; &c; } sub b { my $daskin; $daskin="あいうえお"; } sub c { print "$daskin"; } こういったスクリプトを書いた時、&a、&b、の中で$daskinは局所化されているので &c内のprintの表示が空になることを期待していたのですが、「あいうえお」と表示されてしまいます。 変な質問ですが、みなさんにとっては納得のいく結果でしょうか? 私の局所化処理が間違っている場合、教えて下さいm(__)m
申し訳ありません。 自己解決いたしました。 上記のスクリプト、ここへの転載も含め、私の記述が間違っていたようです。
print <<"EOF"; メッセージ: $message ここまで EOF こういう記述があるとして、$messageにはランダムにメッセージが入るのですが、 ここに何も文字列が入らなかった場合、HTMLで見ると メッセージ: ここまで このように、間が空行になってしまいます。 ここを上手く詰められるような記述方法は無いでしょうか。
print <<"EOF"; メッセージ: $messageここまで EOF
>>179 ありがとうございます。
ロックファイルでやる事にします。
0410181738 という形の時間(year,mon,day...)をcookieの期限のために sprintf("%s, %02d-%s-%4d %02d:%02d:%02d GMT", $day,$mday,$mon,$year+1900,$hour,$min,$sec); というような形にしたいのですが、曜日だけが変換のネックと なっています。どのようにこの日の曜日を計算させればよいの でしょうか?
>>192 何スレも前で既出のもんとかを既出の一言で片付けられたってわかるわけねーだろアフォ
どうせ本当に既出かどうかの確認もしてねぇんだろ?(pp
ん?何スレ目で話題が出たか言えるか?無理だろうなぁ日本語読めてないっぽいもんなぁ(・∀・)ニヨニヨ
>>193 前スレで何回もでてるよ。確認もしてないのはお前だ。
196 :
nobodyさん :04/10/19 14:27:41 ID:IcRPasE8
LWPで何百何千もの html をネットから落としてきて解析するプログラム書いてるんですけど request() とrequest()の間ってやっぱsleepとか入れて間を開けた方がいいのでしょうか? 具体的には ヤフーの株価データなんですけど
198 :
nobodyさん :04/10/19 17:42:02 ID:6g0jZqZR
日本一Perlが凄い人ってKENTさんですか?
もちろんそうですよ。
CGIレスQって、・・・・なコーディングがしばしば。
201 :
nobodyさん :04/10/19 20:44:07 ID:AGmXypRw
自宅サーバ板か迷いましたがprogエキスパートの方のほうが確実。
現在、ADSLですが、DDNSは使っていないので、固定Webアドレスが保証できない状態です。
ADSLモデムのルーター機能を通していますので、当然ルーターにグローバルIPが振られてます。
では、プライベートIP上のCGI実行Progでこのルーターのグローバル
IPを得ることはできます?
あるperlのCGI実行スクリプトがWebサーバー上のフォルダへのフルパス(
http:// 〜)
を要求しているので、グローバルIPが固定でない場合ですから、その都度prog的にIPを取得すれば使えるのでお願いします。
win me
AN HTTPD
ActivePerl5.8.4
です。
ベタだが、そのルータの設定画面からひろっちゃえば? ページの取得にはLWP使用。
同じ環境に設定したサーバーにperlで書いたCGIをいれて動かしているのですが 片方ではcommon.plというところでとまってしまいます 片方ではすんなり動きます おそらく何か重要な部分を設定ミスしてると思うのですが わかる範囲でチェックをしたつもりなのですが 1から重要な場所をチェックできるようなサイトをどなたかしりませんか? もしくは直感的にどこが悪いか指摘していただいても結構ですので よろしくお願いいたします。
頭
205 :
201 :04/10/19 22:15:51 ID:???
>> 202 ありがとうございます。 ルーター設定ページを読み込んで、読み取る方法も確かにそれもありですね ベタですね。確かに^^ おそらくActivePerlなので、Win用ActiveXコンポーネント(dllなど)が利用できるので できますよね。WIN32APIも呼べるはずですが、…そのサンプルを今探しております。 P…面倒だからやはりDDNSか固定IP… いやがんばります。できたら報告致します・
REMOTE_ADDR表示するCGIをインターネット上のどっかにおけばいいじゃん。
>>205 DDNSの方が断然楽そうですなぁ。。。
208 :
nobodyさん :04/10/20 04:50:52 ID:aP/RN7ic
rename関数を使ったファイルロックを考えてます。 for($i=2;$i>0;$i--){ if (rename("file.unlock","file.lock")) {last;} } if($i<0){ die "Failed file lock"; } 処理 rename("file.lock","file.unlock"); これに「異常終了しファイルロックが1分以上かかっていたら修正する」という処理を入れたいんですが、どんな方法がありますか。
for文間違ってました 条件が $i>=0 です。
>>208 さん
現在mein.cgiというのを動かしているのですが
# CGI 初期設定のインポート
require"../config/default.cfg";
# 変換ライブラリのインポート
require"../common/jcode.pl";
# CGI共通ライブラリのインポート
require"../common/common.pl";
という順番でrequireしていっています
片方では問題なくcommon.plはとおるのですが、片方では
さばのログを読む限りではcommon.plを読み込んでいる最中に
500エラーとなってとまってしまっています。
ちなみにエラーで止まる部分は
この部分→use Date::Calc qw(Delta_DHMS);
my($days, $hours, $min, $sec) = Delta_DHMS($young_year, $young_mon, $young_day, $young_hour, $young_min, $young_sec,
$old_year, $old_mon, $old_day, $old_hour, $old_min, $old_sec);
です。
お前の勝手な解釈による抜粋よりエラーメッセージそのまま 貼った方がいいと思うけどな...
>>213 さん
BEGIN failde--compilation aborted at common.pl line108
です
それだけじゃないだろ
まず、mainのスペルミスを直してくれないか。
>211 ありがとうございました
オリゴ糖ございました
すみません事故解決しました Date::Calc のモジュールが入っていませんでした どうもお騒がせしました
>>214 事故解決したようだが、注意しとく。
まずひとつめ。「BEGIN failde」なんてなってるところからして
コピペじゃなくて手打ちしただろ? 手打ちは間違えて混乱のもと
になるのでこういうときはできる限りコピペするのが基本。どう
してもできないときはしょうがないが、鯖のログなら普通コピペ
できるはずだ。
またuseしてるモジュールがないときは、エラーメッセージは
Can't locate ナントカ.pm in @INC (@INC contains: (中略)) at ほげほげ line XX.
BEGIN failed--compilation aborted at ほげほげ line XX.
って2行でる。勝手に1行目削られるとナントカ.pmがないっていう
いちばん肝心な情報がわからなくなるわけだ。だからちゃんとした
アドバイスを受けたければエラーメッセージをそのまま貼れって
いわれるのよ。
次になんか質問するときは気をつけよう。
質問です。
ファイル名にマルチバイト文字が使われているファイルがサーバーにあるとして、
そのファイルに直接アクセスしようとしても404になり、
マルチバイト文字の部分だけをURLエンコードすると正常にアクセスできます。
検索CGIを作っていまして、ファイル名にマルチバイト文字がある場合、
URLエンコードを行なってから検索結果画面を出そうと思っています。
例えば、このCGIからマルチバイト文字をファイル名に使ったファイルへのパスが
../data/俺俺.txt
だとします。
この場合、../の部分を絶対パスに置き換えてから検索結果に出力しているのですが、
http://www.domain.com/data/俺俺.txt の「俺俺」の部分だけをURLエンコードする方法をご存知の方はいないでしょうか。
Perlメモにて全角文字の有無を検出する方法はわかったのですが、
全角文字の部分だけを変換して変数に保存したいのです。
>>221 $path =~ s/(全角文字列にマッチする正規表現)/URLエンコードする関数($1)/ge;
とかでいいんじゃないの?
use Encode が使えると楽だが、perl5.005 あたりだと文字コードによってはいろいろ厄介かも
224 :
221 :04/10/20 15:18:11 ID:???
レスありがとうございます。また、使用Perlは5.6.1です。 出力されるページ及びスクリプト自体はSJISなので、 EUC変換を行なってから下記のコードを追加しました。 # Perlメモの正規表現より「ASCII以外」の文字列がある場合 if ($path =~ /[\x8E\xA1-\xFE]/) { # 「ASCII以外」の文字列をエンコードする $path =~ s/([\x8E\xA1-\xFE])/'%'.unpack("H2", $1)/eg; } とりあえずはこの方法で解決できそうです。 即レス感謝です。
>>224 ファイルシステム上のファイル名がSJIS(cp932)だとその方法は使えんが、大丈夫だろうな?
226 :
221 :04/10/20 16:05:39 ID:???
ローカルでのテストでは動くようですが、鯖に上げても動かなかったです。
ちなみにローカルでのテスト環境は、「Win2000Pro ActivePerl5.6.1 AN HTTP Daemon 1.42k」です。
HTMLの読み物として「リンクの方法.txt」というファイルが実際にありまして、
とりあえずそれを検索する事でテストしています。
「リンクの方法」はSJISですと「%83%8A%83%93%83%4E%82%CC%95%FB%96%40」、
EUCですと「%A5%EA%A5%F3%A5%AF%A4%CE%CA%FD%CB%A1」となるようです。
一部省略してますが、該当部分のソースを下に書かせていただきます。
$temp_euc = $temp; # $tempはsjisで、ファイル名だけが入ってます
&jcode::convert (\$temp_euc, "euc"); # $tempをEUCにした$temp_eucを用意
if ($temp_euc =~ /[\x8E\xA1-\xFE]/) { # Perlメモの正規表現より「ASCII以外」の文字列がある場合
$temp_euc =~ s/([\x8E\xA1-\xFE])/'%'.unpack("H2", $1)/eg;
}
print <<"HTML";
<A href="$absolute_dir\/$temp_euc">$temp</A> # 絶対パスとファイル名を結合したパスへとリンク
HTML
この方法ですと、
>>224 氏が言ったように、
<A href="
http://www.domail.com/%A5%EA%A5%F3%A5%AF%A4%CE%CA%FD%CB%A1.txt ">リンクの方法.txt</A>
となり、<A>タグ内のリンク先のファイル名がEUCとなって、ファイルシステム上のファイル名の関係で使えませんでした。
もう少しやり方を模索してみます。
227 :
221 :04/10/20 16:10:55 ID:???
アンカーをミスりますた。
>>225 氏が言ったように、でお願いします。
要するに、マルチバイト文字だけをURLエンコードしたいが、
マルチバイト文字を正確に検出するにはEUC形式である必要がある。
しかし、そのままEUCをURLエンコードしてもファイルシステムの都合上使えないため、
マルチバイト文字に該当する部分だけをSJISでURLエンコードができれば、ということです。
>>221 EUCで取り出したのをSJISに変換してからエンコードすりゃいいだけじゃない?
229 :
460 :04/10/20 17:03:41 ID:???
perlでAが真且つBが真の時ってのを組みたいんだけど、その時は if ( A ){ if ( B ){ 〜 }}か if ( A , B ){ 〜 } で良いかな?
if (A && B) { 〜 } じゃ不満なのか?
&&
233 :
231 :04/10/20 17:09:17 ID:???
かぶった
236 :
221 :04/10/20 17:24:04 ID:???
>>228 氏
申し訳ないですが、もう少し方法を具体的に教えていただけないでしょうか。
「EUCで取り出した」とはどの部分を指すのでしょうか。
$temp_euc =~ s/([\x8E\xA1-\xFE])/'%'.unpack("H2", $1)/eg;
のように、一括で変換を行なうわけではないということですか?
>>236 その例でいくと
unpack("H2",$1)
のところを
unpack("H2",eucをsjisに変換する関数($1))
にすればいいってことでしょ。
>>236 いちいちEUCにしないで全部SJISでやればいいのに
エンコード対象が[^\w.-]ではダメなの?
>>238 sjisだとメタ文字がコード含まれれるから\wじゃ駄目でそ。
eucも最上位ビットに1立つから\w駄目でない?
>>238 SJISは正確なマッチングが出来ないんじゃなかったっけ?
>>240 , -,:' / ̄) i{'r‐-、 `ヽ、
. _...,,o‐y ,:'- '⌒ ⌒ヽ. `ヽ' ,
(o( ,' / / 、 `ヾ. ヾ,
,:'´//7,' ,' .,' ,:' ! } i !', ':, ':, ゙:,
,' / ,' {l. ! {/ ,イ / }| !|', !. ', ', ゙,
ハ〃 ! !| | | ∠/ ,:'-ノ} /リ l ,ム. ! } |!
ハヽ、ゝ!| l | ,:',;='ィ'、'´ ,'.ノ ノ.,;lノ=、l .,' ,' ,' ノ
{ l l ', |'ヲi(_ノ.} ´ i(ノ.}゙!ノ,:',:''´
', h. ', ',゙、 ':゙゙_.ノ. ':゙_ノ〃ン
':, { ',', ':,':, 丶 ,' l .}
ヾ ':,':, ':ヾ、._ 「´/ ,' | .,' / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
`ヾ-、`ヽ_ `´ _,.ィリ.ノ ,' < なんとなかるよ、絶対大丈夫だよ!
リ';',ヾ| ` ‐┬ ´ _ノノ,'/ \______________
ヾ,、-- 、 _ | ´ノ'
f ヾ、..___ ヽ、 ー‐''
/_......_ \
キモAA貼るヤシ死ねよ
243 :
nobodyさん :04/10/20 22:35:28 ID:xGLMj0YB
my ($abc, $def) = @_; このコードの意味がさっぱり分からんのでオシエテクリソ-
@_ さんが袋に詰め込んでいる物を $abc, $def の2人が「俺の物だ」って奪うんだよ。 でも不思議なことに奪われた袋の中身はなくなっていなーい。
ワロタw
246 :
nobodyさん :04/10/20 23:14:24 ID:xGLMj0YB
>>244 @_は変数ではないですよね?
もう少しヒントクリソー
いや変数だよ。特殊変数。
SJISならこれでいいんでは? $str =~ s/([\x81-\x9f\xe0-\xfc])([\x40-\x7e\x80-\xfc])/sprintf("%%%02X%%%02X",ord($1),ord($2))/eg; っと、半角カナ用にもう一押し必要か。残念! \xa0-\xdf斬り。
ASCII文字以外がある場合って書いてあるけど、 ASCII文字って厳密にはどこまでを指してんだ? 半角英数字記号をASCIIってとらえるんなら、
perl 特殊変数でググれば幾らでも出てくるよ。
251 :
201 :04/10/21 05:43:48 ID:???
報告その1 LAN側からのみルーターにプライベートアドレスでtelnetでアクセス で情報を得る。
>>243 my ($abc, $def) = @_;
print ($abc, $def);
print \n;
print @_;
する
253 :
221 :04/10/21 11:33:49 ID:???
>>237 氏
$temp_euc = $temp; # $tempはsjisで、ファイル名だけが入ってます
&jcode::convert (\$temp_euc, "euc"); # $tempをEUCにした$temp_eucを用意
if ($temp_euc =~ /[\x8E\xA1-\xFE]/) { # Perlメモの正規表現より「ASCII以外」の文字列がある場合
$temp_euc =~ s/([\x8E\xA1-\xFE])/'%'.unpack("H2", &euc2sjis ($1))/eg; # ここを変更
}
print <<"HTML";
<A href="$absolute_dir\/$temp_euc">$temp</A> # 絶対パスとファイル名を結合したパスへとリンク
HTML
sub euc2sjis { # 追加したサブルーチン
my $str = $_[0];
&jcode::convert (\$str, "sjis", "euc");
return $str;
}
>unpack("H2",eucをsjisに変換する関数($1))
と言って下さったように変えてみたのですが、HTML部に表示されるエンコードされたURLは変わらずEUCのままでした。
追加したサブルーチンが動いていないのかとも思って確認しましたが、
単体で動かして確認したところ、sub euc2sjisは正常に動いているようです。
他の方が提示してくださった方法も見てみます。
EUC->SJIS変換には最低2バイト必要なわけで。1バイトなら無変換なのもしょうがないかと。 なんか、そこはかと遠回りしている気がするよ。\Wをエンコードするだけじゃ動作しなかったっけ?別に正確なURLエンコードを目指さなくても動作すればそれでいいのでは?
257 :
nobodyさん :04/10/21 12:30:19 ID:a34sr5QL
フォームから申し込みがあるたびに a0001 a0002 a0003 という風に増加する変数を作りたいのですがどうすればいいでしょうか? 参考になるサイトなんかあったら教えてください。 宜しくお願いします
>>257 $hensu = a0001;
$hensu++;
print $hensu;
Perl マジカルインクリメントでぐぐれ
>>258 レスありがとうございます。素朴な疑問ですが、
アルファベット文字含んでても、++で問題なく a002 になるんでしょうか?
>>259 調べてみます。ありがとうgざいます。
261 :
258 :04/10/21 13:00:50 ID:???
262 :
259 :04/10/21 13:05:48 ID:???
ぐぐりますた、わかりますた、サンクスコ
264 :
221 :04/10/21 14:44:50 ID:???
>>248 氏の方法で実行してみたところ、
半角カナ以外では正常に実行できました。
とりあえずはこの方法で実装しようと思います。
あとは半角カナの対応ですか・・・
>>264 \x5Cを含む表や申が入っている漢字でも上手く行く?
気になったからやってみたけど
Win2k+Apache1.3.31+ActivePerl v5.6.1の環境で正常動作しないんだよな
266 :
221 :04/10/21 15:25:17 ID:???
>>265 氏
「Win2000Pro ActivePerl5.6.1 AN HTTP Daemon 1.42k」という環境で実行してます。
実際に導入するのは、悪名高い@ni○tyのCGI鯖ですが。
「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄.txt」
という、わざとらしく\x5Cを使った文字で構成されたファイル名を用意して、
このテキストファイル内の文字を検索して結果画面を出してみたところ、
<A href="%81%5C%83%5C%84%5C%87%5C%89%5C%8A%5C # 略 # .txt">―ソЫ\噂浬欺圭構 # 略 # .txt</A>
というHTMLが出力され、実際にそのリンクからファイルへアクセスできることは確認できました。
また、そのテキストファイル内に「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄」という内容を書き、
同じく「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄」で検索して正常に結果が表示されることから、
今のところは
>>248 氏の処理で半角カナを扱えない点以外での問題は無さそうです。
268 :
265 :04/10/21 16:25:51 ID:???
>>266 エンコードは問題ないのにアクセスできないという不思議な現象に陥ってました
結局ANHTTPDに変更したらあっさり解決したのでApacheが悪かったようです
しかし何故Apacheじゃ見えなかったんだろう?
うーん気になるな・・・
すいません、色々見てて気になったんだけど、 for (@配列) { 〜 } って、これって foreach (@配列) { 〜 } と繰り返す回数って違うの?
何 で や っ て か ら 聞 か な い ?
272 :
221 :04/10/21 17:56:10 ID:???
>>267 氏、これで正常に動きました。感謝します。
が、肝心の s{ 以下の処理の部分が何をしているかが不明なので、ちょっとまだ導入できないです・・・
? と : が if else って事くらいしかわからない上に、色々と省略された書き方をされているようなので、
理解には時間がかかりそうです。
一文字ずつ分解して、[\x00-\x7F]以外のものはordで数値変換してsprintfで16進数に書き出しているということですよね。
splitを消すと\x5Cがおかしくなるようですが、何の処理をしているかもまだ理解の範疇にはないようです。
省略した書き方とかしたこと無いんで、冗長なコーディングしか出来ない自分が悲しい・・・
あと、省略できるものも極力省略しないという書き方をしているので(自分が理解できなくなると困るので)、
このソースをもとに何とか書き換えて実装してみようと思います。
273 :
nobodyさん :04/10/21 20:11:32 ID:a34sr5QL
作業に若干時間がかかるスクリプトを単体で起動させると問題ないのですが、 サブルーチンとして起動させると、作業を終える前に次のコードに移ってしまいます。 これはどうやって防げばいいでしょうか?
何も考えないで書くけど、 そのサブルーチンの最後に何かフラグを立てて、 それが立ってなければ待つってのは?
話がよく見えないのだが、 サブルーチンという言葉の使い方が間違っているように思えてならない。 ひょっとして「子プロセス」とかそういうモノを指しているのか?
276 :
273 :04/10/21 21:40:12 ID:a34sr5QL
すいません、正しくはモジュールかもしれません。 いわゆる.plファイルです。 aというモジュールがあります。 b(.pl)というモジュールからaをuseしてます。 .cgi からbモジュールをrequireすると、aモジュールの作業を完了しないまま、 bモジュールの次のコードに移ってしまいます。 .cgiにから直接aモジュールをuseしたら、問題は 発生しませんでした。
ますます混迷の度合いが深まってきた気がする...
>>276 ああわかった。それはあれだ。
use したファイルはコンパイル時に読み込まれて実行されるが、
require したファイルはコード実行時に読み込まれて実行される。
b が require された時点ではコンパイルがとっくに終っているので
b の中で use した a が実行される機会は永遠に巡ってこない。
279 :
273 :04/10/21 22:21:30 ID:a34sr5QL
280 :
278 :04/10/21 22:31:20 ID:???
b から a を use でなく require(+import) すれば良いんでないかと思うが試してない
281 :
273 :04/10/21 22:51:54 ID:???
require してみますたが、変わらずでした。 require、use云々ではないかもしれません。 wait;ってのが気になってるのですが、 これはどうやって使えばいいのでしょうか? ググッテも情報量がひっじょーに少ないとです。 ヒロシです
use や require は同一プロセス内での呼び出しだが、 wait は子プロセスの終了を待つ関数なので、使えない
Cだと入力がCtrl+D(windowsはCtrl+Z)だとプログラム終了ってのを if (nyuryoku == '\0') {exit(0);} て書けるけど、perlだとどう書きますか。以下の何入れても quer!が出ちゃうんです。 $var=<STDIN>; chomp($var); if ($var eq "\0") { exit(0); } else { print "quer!\n"; }
284 :
nobodyさん :04/10/22 10:50:06 ID:cSoqDRBP
上げておきますね^^
>>283 行入力演算子(<>)はEOFでは未定義値を返すので、
if (!defined $var) {
286 :
283 :04/10/22 11:23:46 ID:???
287 :
nobodyさん :04/10/22 11:42:34 ID:Y4MW0wLE
DBI.pm には Mysql.pm にあった fetchcol() メソッドがないみたいですが 自分で実装するしかないのでしょうか?
288 :
nobodyさん :04/10/22 11:55:42 ID:+fQGbTx6
例えば "掲示板" という文字、UTF-8でエンコードすると "E6%8E%B2%E7%A4%BA%E6%9D%BF" となると思います。 そして本来UTF-8のコードである "E6%8E%B2%E7%A4%BA%E6%9D%BF" を誤って $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/ge; でデコードすると "牙ず? " となってしまいます。 この "牙ず? " を元のUTF-8のコード "E6%8E%B2%E7%A4%BA%E6%9D%BF" に戻すには どのように処理したらいいのでしょうか? どなたか教えて下さい。
>>288 バイト列としてはちゃんとデコードできているが、utf8として解釈すべき
バイト列をEUCだと思って見てるから変に見えるだけじゃない?
EUCで表示したければ適当にutf8→eucに変換すればいい。
use Jcode;
$str = "%E6%8E%B2%E7%A4%BA%E6%9D%BF";
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/ge;
print Jcode->new($str)->euc,"\n";
290 :
nobodyさん :04/10/22 12:45:55 ID:pO/k5T0Y
すみません、教えて下さい。 手持ちのマニュアルで16進定数の記述方法が $a='/abcd'; となっていたので携帯用絵文字を定義しようとしたのですが、 print $a; をやると、/abcdと出てしまいます。 ' を " に変えたり色々してみたのですが上手くできません。 正しい16進定数の代入の仕方を教えて下さい。m(__)m
バックスラッシュの間違えじゃないのか
$a= 0xabcd;
教則本だと\がバックスラッシュとかになるから気をつけれ
294 :
nobodyさん :04/10/22 14:27:39 ID:pO/k5T0Y
295 :
nobodyさん :04/10/22 15:33:52 ID:pO/k5T0Y
できましたー。 ありがとうございました!!!!!
296 :
nobodyさん :04/10/22 17:38:09 ID:gkwMnLH6
web上のファイル(複数)をperlを使って圧縮・サーバー上に保存、することはできますか? よろしくお願いします。 環境:FreeBSD 4.7 UNIX O/S perl5.6.1
297 :
296 :04/10/22 17:45:28 ID:gkwMnLH6
web上、サーバー上と表記しましたが、両方とも同じ自分がレンタルしているwebサーバーのことです。 下手くそな文章で申し訳ありませんが、よろしくお願いします。
301 :
300 :04/10/22 18:07:22 ID:???
302 :
296 :04/10/22 18:39:07 ID:???
print qq|<TITLE>テスト</TITLE>|; としたら、 apacheのエラーログにUnrecognized characterというエラーが表示されました。 どうも、テストという日本語に問題があるようですが、 この場合、どうすれば日本語を利用できるようになるでしょうか? phpを以前ちょっといじっていて、htmlの組み込み安さに感動したんですが、 perlは結構面倒なんですかね?
304 :
nobodyさん :04/10/22 19:31:59 ID:kB/Ig1ML
age
305 :
nobodyさん :04/10/22 19:32:44 ID:PwMLf+Ap
use CGI; $data=new CGI; $name=$data->param('name'); $mail=$mail->param('mail'); $message=$message->param('message'); こうやって取り出したデータの中の文字は、 URLエンコードされたままではなく元に戻されているのでしょうか?
307 :
305 :04/10/22 19:50:08 ID:PwMLf+Ap
>>306 プリントしてみたら元に戻っていたので、あれ?と思ったんです。
今までずっと$name=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
やってたんですけど。
実は要らなかったのかなと思いまして。
実際どうなんでしょう?
ついでに、文字コードなんかはどうなっているのでしょうか?
(´-`).。oO(なんで自分で確かめられないんだろう)
>>303 エスケープ文字について勉強しなおすことをすすめる
>>309 qqについて勉強しなおすことをすすめる
何にでも「自分でやってみて確かめろ」と返す人は多いが 漏れは敢えて「やってみなきゃわからんのは頭悪過ぎ。まず man を読め」と言うことにする
最近のチラシは両面印刷です
315 :
303 :04/10/22 21:00:19 ID:???
調べましたが、やぱーりわかりません。 だれかヘルプみー
>>315 全角スペースでも入ってるんじゃないのか?
318 :
nobodyさん :04/10/23 15:43:12 ID:EsL8XLQN
すいません、質問です。 perlには、Cにおけるfprintfのような関数はないのでしょうか? print FILE hogehoge; というのが何行も続いてしまい、違和感を感じるのですが。
>>318 Perlは元々レポート作成用言語ディスよ?
fprintfに限らず、テキストの、文字入出力、ファイル入出力においての利便性は
Cとは比較にならんて。
ヒアドキュメントでも、format でも sprintf でも好きなもので対処すれば?
if(hoge||hogehoge){ の「||」の意味が分かりません。 だれか教えてくださいませ
>>320 or と ほぼ同じ。 or よりも優先順位が高いので or と書いておいたほうが
意図どおり動くことが多いはずだよ。
>>319 318は printf FILE ほげほげ と書けることを知らないに一票。
>>319 sprintfで解決しました。
printする文字列を関数呼び出しで作成するというのは考えが及びませんでした。
どうもありがとうございました。
mkdir使うみたいに sudo mkdir を perlで利用することは不可能でしょうか? 権限ないディレクトリにはディレクトリ作成できなかったので、 sudoで特定のユーザにmkdirの権限与えたのはいいものの、 perlで使おうとしても使えないんですね。 telnet経由しかむりぽなのでしょうか?
コーディング 【coding】 プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。 (e-Wordsより) 自分の質問がPerlに関することなのか、 それともPerlではなくCGIやHTMLについてなのかを切り分けした上で、 質問して下さい。
>>326 いや、普通にできると思うけど。具体的にどうやってるか示されてない
のでこれ以上はなんともいえんがな。
でもmkdirのような引数しだいでどこにでもディレクトリ作れるコマンドを
sudoで許可するのはあまり感心しないな。
329 :
326 :04/10/23 20:20:45 ID:???
perl で my $makedir = `sudo mkdir $user_dir/new`; としています。 aユーザからbユーザのディレクトリに newというディレクトリ を作成するようにしていますが、 上記ではうまくいきません。 bユーザディレクトリの権限をaユーザのものにし、 my $makedir = `mkdir $user_dir/new`; とした場合は問題なく作成されます。 宜しくお願いします
池沼には、それがコーディングの問題じゃないということがわからないのだろうか?
もういいよこの類に触るのはやめやめ 次の質問よろ
hogeほげって何ですか? 何か意味があるんですか?
>>332 perlコーディングには関係ないと思うんですが...
サザエさんの、来週もまた見てくださいねぇ〜、hogehugu が起源です。
サザエさんはfugafuguだろ。うそ教えるなよhage
336 :
nobodyさん :04/10/24 19:38:54 ID:5pufjC0P
消せばいいんじゃない?
338 :
nobodyさん :04/10/24 20:14:53 ID:5pufjC0P
すいません、消すと言うか、もとから作成されなくするって事は出来ないでしょうか?
>>338 ごみファイルってCGITemp?????とか言うやつ?
340 :
nobodyさん :04/10/24 20:38:56 ID:5pufjC0P
>>340 print(OUT $file);
close(OUT);
この間に一工夫いる。
CGITempでぐぐるといいよ。
342 :
nobodyさん :04/10/24 20:47:25 ID:5pufjC0P
print(OUT $file); close($filename); close(OUT); としたら、作成されないようになりました!(これで、大丈夫ですよね) 大変ありがとうございました。
343 :
336 :04/10/24 21:57:58 ID:B/djfAD8
アップロードに関して、もう一件質問させてください。 アップロードしたファイルの名前を変更したいのですが、 print(OUT $file); rename("$filename", "123456.xls"); close($filename); close(OUT); と、したのですが、これでは駄目なのでしょうか? 試してみたところ、上手くいきませんでした。
ファイルの名前変えるのはファイル閉じてから。
>>343 ハンドル持ってると操作が限定されるよ。
試しにopenしてから何秒かsleepさせて、その間に削除しようとしてみ。
346 :
336 :04/10/24 23:10:44 ID:B/djfAD8
>>344 renameの位置を変えて、色々といじったら、うまくいきました。
>>345 アドバイス、ありがとうございます!
度々申し訳ありません、もうひとつ質問させてください。
このコードでは、HTML部分でWinとMacを最初に入力するようにしていますが、
Winを使用しているのにMacを選択してしまった・・・と言う場合に、
何か不都合が発生するのでしょうか?
自分で試したところ、どちらでも特に問題なくアップできましたので・・・
できれば、この入力部分は省きたいと思っておりますので、
必要無い、との事でしたら削除しようと思っております。
3度続くと流石に答えてもらえなくなる。
>>345 それwindowsの話かな? unix系だとopen直後にunlinkしてプロセス終了時に
一緒になくなる一時ファイル作るってわりとありがちな手なんだけどね。
UTF-8 の判別、EUC へ変換などをしたので Jcode を利用したいのですが、 Jcode.pm をスクリプトに同梱して配布したとしても サーバ側でインストールがされていないと使えないものなんでしょうか? この辺の仕組みがよくわかりません……。
色々漁ってたらなんとなくわかってきました。 とりあえずインストールしてなくても動かすことはできるみたいですね。 スレ汚しすみません。
すみません、質問させてくださいませ。 とあるドメインから、別のドメインのディレクトリ一覧、及びファイルの読み込みを行いたいのですが、 下記のようにするとオープンエラーになります。 (改行が多いと言われたので、次に書きます) 別ドメインのディレクトリ内容やファイルの取得は出来ないのでしょうか? もし可能でしたら方法を知りたいのですが、お教えいただけませんでしょうか?
-------------------------------------------- # ディレクトリの一覧を取得 if( !opendir(DIR,"CGIを設置しているところとは別のドメインのディレクトリ") ){ print"OpenErr"; }else{ foreach $file( readdir(DIR) ){ print "$file<BR>\n"; } closedir(DIR) ; } -------------------------------------------- # ファイルの中身を取得 if (!open(IN,"CGIを設置しているところとは別のドメインのファイル") ){ print"OpenErr"; }else{ @data = <IN> ; foreach $file(@data){ print "$file<BR>\n"; } close(IN) ; } --------------------------------------------
>>351 openで失敗してるんだろ、$!参照(print"OpenErr:$! at ",__LINE__; )
たぶん、権限ナシと予想するが
つーか、別のドメインってリモートじゃないよな
>353さん えーと、見当違いなレスだったらすみません。 使用したいドメイン名は書けませんが、要は ○○○.com にあるファイルを ×××.net で読み取る…と言う事をしたいのです。 リモートではないです。 権限の方、確認してみます。
355 :
351 :04/10/27 12:32:51 ID:???
連続ですみませんです。 >353さん もちろんオープンで失敗していますので、エラーのメッセージとなります。 なので、オープン成功するにはどうしたら良いのかなーと。 そもそも無理なのでしたら仕方ないのですが、BLOG等では他の日記データとかを取り込んで 表示する仕組みとか有るみたいなので、どうにか方法はあると思うのですが… もしPerl側の工夫で出来るなら、どうすればよいかヒントを頂けると助かります。 権限(ファイル置いているサーバ側の設定?)とかの変更が必要でしたら、 管理者に作業してもらおうと思います。
>>351 =354-355
バーチャルホストか?
どうもそうじゃないように見えるんだけどな・・・
VHでやってるなら権限次第だな
そうじゃないなら質問内容をもうちょっと的確に書けるくらい勉強しよう
あと最低限
>>1 は必ず目を通そうな
357 :
351 :04/10/27 13:37:48 ID:???
>>353 さん
>>356 さん
お手間おかけしましてすみませんでした…
もう少し勉強してきて、それでいて判らなければまたよろしくお願いします。
どうも有難う御座いました。
ちなみにバーチャルホストではなく完全に別ドメインのサーバで、
例えて言うと、”google.co.jp内の特定のファイル”を読むCGIを、
yahoo.co.jp内に設置したいのでした。
(読み込みたいファイルの名称やURLは固定のものです)
>>357 LWP::Simple(モジュール)とかプロトコルについて勉強すると幸せになれるかも
質問文をちゃんと読めよ
(´-`).。oO(LWP を open に override してくれる神の光臨待ち。。。)
>>361 そういうライブラリはあればあったで便利かもしれんな。
package LWP::Open;
use base 'EXPORTER';
use LWP::Simple;
our @EXPORT = ('open');
sub open{
}
ここまで書いた後は頼んだ
>>364
use LWP::Simple;
use subs qw(open);
*open= sub { get($_[0]); };
$url="
http://www.hogehoge/ ";
$data= open($url);
365 :
nobodyさん :04/10/28 01:47:21 ID:GkfPSbvy
たびたび申し訳ないが、ちょっと教えて下さい ハッシュのリストを作ってはみたものの どうやってサブルーチンから出せばいいのかわからなくなりました。 sub XXX{ … push @{ HoA{key_name} }, "value1", "value2"; … return (??????); } このような場合ってどうやってリターンすれば宜しいでしょうか??
366 :
nobodyさん :04/10/28 02:07:20 ID:GkfPSbvy
というか、リストのハッシュと言ったほうがよさそうだ。
>>365 先にサブルーチンへリファレンスを渡してからゴリゴリするのが常套かと。
push @{$HoA{key_name} }, "value1", "value2"; こう? return \%Hoa; で、 $refHoA->{key_name}->[0]
別にグローバルならrefをreturnしてもいいけど、こうじゃないの? my %HoA; &XXX(\%HoA); print @{$HoA{'key_name'}}; exit; sub XXX { my $refHoA = $_[0]; push @{$$refHoA{'key_name'}}, "value1", "value2"; return(0); }
>>369 そんなことしない
サブルーチンで局所化した変数でもリファレンスを返すと、スコープ外でも変数の内容は維持される。
なんか変な気もするが、そういうものらしい
なんでかはしらない(局所化してもスコープ外で実際に破棄されるわけではない?)
つーか、perlモジュールのコンストラクタは普通に局所化したハッシュをblessしてるし
はじめから無名ハッシュにしとけばいいような。 sub XXX { my $HoA; push @{$HoA->{key_name}}, "value1", "value2"; return $HoA; }
>>370 my宣言した変数は内部に被参照カウンタを持っていて、
それが0にならない限りデータ領域は解放されないです。
サブからリファを返した場合、そのリファを保持する限り
領域も保持され、破棄すると領域も解放されるです。
373 :
365 :04/10/28 14:35:37 ID:???
ありがとうございました。みなさま。 どれも有効でしたが、368氏の方法が一番マッチしました。 ありがとうございました。
374 :
nobodyさん :04/10/29 18:08:56 ID:jolcQ+aO
変数名にハイフンは使っていいですか? 今ローカル環境がないのであまり無茶なテストをサーバでしたくないために質問しました。すみません。 アンダースコアは大丈夫なことは知っています。 ハイフンもハッシュのキーになら使えるということも知っています。(クォート必要ですが) 変数名にも使えるのでしょうか? 例) $a-a = 1; $aa- = 1; $-aa = 1; 確か一番下はダメなはず。 宜しくお願いします。
ぐぐった
出てきた
>>374 は腹を切って死ぬべきである
376 :
374 :04/10/29 18:25:42 ID:jolcQ+aO
>>375 >ぐぐった
>出てきた
だから?ぐぐるのもここで質問するのも同じだろ。
まぁ、ぐぐったら出てくるという回答だとしたら・・・
ありがとうございました。ハイフンは使えないようで。それでは失礼します。
377 :
nobodyさん :04/10/29 18:28:19 ID:oV9k/ZOo
>>376 うわすげームカツクこいつ
マジで死ね 首吊って今すぐ死ねや 糞が
378 :
374 :04/10/29 18:39:04 ID:jolcQ+aO
>>377 たかが2ちゃんでの出来事にいちいち本気になるなよ
380 :
nobodyさん :04/10/29 18:46:02 ID:oV9k/ZOo
>>378 ハァ?それが関係あんのか?
更に胸糞悪ぃなてめぇは
381 :
374 :04/10/29 18:47:36 ID:jolcQ+aO
385 :
374 :04/10/29 18:54:15 ID:jolcQ+aO
>>382 お前が死んだらいいんじゃないか?
自分のために人が何かしてくれるとでも思ってるの?
いい加減自立しろよ、な。
嫌いなやつは「氏ね」なんて理屈は小学生レベルだぞ。
もうすこし大人になったほうがいいんじゃないか、な。
この程度のもんぐらいならテストで作って動かしゃわかるってこった。
$abc=1234 の最後の文字列を消すようにはどのようにすればいいでしょうか? この場合は、$abc=123にしたいです。
chop
$abc = int($abc/10);
すいません、初心者なんですが教えてください。 登録や削除のできるCGIを作っています。 一つのフォームから、いくつかのsubmitを使って、それぞれ処理を変えたいのですが、 どのようにすればよいでしょうか? なんとなく、nameを使ったり、受ける側でif文を書けばいいのかな?という感じなのですが、 どうやって、if文でsubmitのnameを受けたり、分岐したりすれば良いのか分からない状態 です。 どうぞ、よろしくお願いします。
>>391 同じ name にして value を見る
>>392 すいません、その書き方が分からないので・・・
if文になるんでしょうか?
突然言い渡された仕事で、何が何だかさっぱりな状況なのでお願いします・・・。
連投になってしまい、すいません
------html------- <INPUT name=text1> <INPUT name=text2> <INPUT name=text3> <INPUT name=text4> <INPUT type=submit value="ここ押せ" name=hoge> ----------------- -------cgi-------- #!/usr/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*in); $txt1 = "$in{'text1'}"; $txt2 = "$in{'text2'}"; $txt3 = "$in{'text3'}"; $txt4 = "$in{'text4'}"; &jcode'convert(*txt1,'sjis'); &jcode'convert(*txt2,'sjis'); &jcode'convert(*txt4,'sjis'); 処理 --------- こんなもんだろ。
>>394 まずはHTMLから勉強して濃いよアフォ
>>395 アフォに何を言っても無駄だからやめとけ
すいません、perlでテキストファイルを白紙に戻す方法ってあるんでしょうか? なんかどこをみても載ってない気がする。
truncate
399 :
nobodyさん :04/10/29 22:58:21 ID:buGH5/R1
perlからhtmlファイルを「open」で呼び出した場合、呼び出し元はwebサーバですか?それともクライアント側ですか?
>>374 まあ裸では使えないが${'...'}のかたちにすりゃほとんど
なんでもアリ。
そうまでして使いたいものかどうかはギモンだがな。
${'a-a'} = 1;
${'aa-'} = 1;
${'-aa'} = 1;
print if(m/test/) while(<DATA>); こんなことはできますか?
やってみれば?
403さんの言われた通りにやってみましたができませんでした。 どこがいけないのでしょうか。
>>405 ありがとうございます。
読んだ上で色々やってみましたが、このような書き方は仕様上不可能のようですね。
お手数おかけしました。
push(array, value) って value 省略したときに $_ 使ってくれないみたいなんですけど、 これって常識ですか? 省略したときに $_ を使うようになる条件て何かあるんですか?
409 :
407 :04/10/30 05:22:56 ID:???
短いスクリプトではない場合あんまり暗黙の$_を使わない方がいいと思うよ
411 :
nobodyさん :04/10/30 10:59:58 ID:eCRfKScU
教えてください。 文字列ソートを @data = sort{(split(/\,/,$b))[2] cmp (split(/\,/,$a))[2]} @data; としてたものを、文字の数でソートしたいと思い、 @data = sort{(split(/\,/,length$b))[2] <=> (split(/\,/,length$a))[2]} @data; とやってみましたが、ソートしてくれません。 lengthの位置を色々変えてみましたが、ソートしないかエラーかでした。 どうすれば(この場合)[2]番目の文字数でソートできるのでしょうか。
412 :
nobodyさん :04/10/30 11:13:52 ID:zVFP7DHQ
ファイルアップロードについて教えてください。 環境 -> Linux + Perl5 + cgi-lib.pl kentさんのjoyfulとか、ほかモジュールを使わないでアップロード機能を 装備しているスクリプトを参考に下記のようにやってみたのですが、 まったくダメダメクンのようです。 ユーザーのファイルを受け取るには、これ以外何をやればよいでしょうか? どうか教えてください。 $upfile = $in{'img'}; if ($upfile) { $upfile =~ s/\\/\//g; $img_file = basename $upfile; open OUT,">$img_file"; binmode OUT; binmode STDOUT; print OUT $in{'img'}; close OUT; chmod (0666,$img_file);
>>411 @data = sort{length((split(/\,/,$b))[2]) <=> length((split(/\,/,$a))[2])} @data;
>>412 デリミタの処理が一切見当たらない。
enctype="multipart/form-data"でPOSTしたらどんなデータが送られてくるのか?を確認するよろし。
415 :
412 :04/10/30 11:39:40 ID:zVFP7DHQ
>>413 参考にしてみます。
>>414 >enctype="multipart/form-data"でPOSTしたらどんなデータが送られてくるのか
File::Basenameで取得したファイル名の中に、ローカルパスが格納されています。
001.jpg -------------------------------------------------------------
C:\Documents and Settings\admin\My Documents\My Pictures\任天堂\001.jpg
---------------------------------------------------------------------
てことは、$in{'img'}をopen DATA,"$in{'img'}";する必要があるってことです?
416 :
411 :04/10/30 12:03:05 ID:???
417 :
412 :04/10/30 14:08:03 ID:zVFP7DHQ
やはり、よくわからなかったので、おとなしくCGI.pmを使用することにしました。 みなさまありがとうございました。
ここにはファイルのアップを1から書ける人はいないから、 諦めた方がいいね
10文字以上20文字以内で、 英数字が使えて、最初の文字列にのみ数字を禁止するような 正規表現はどのようにすればいいでしょうか? 正規表現難しすぎる・・・。本読んでも頭がこんがら・・・ 分かりやすいサイトあったら教えてください
422 :
nobodyさん :04/10/30 20:00:53 ID:M6l56cQx
WinXP + Apache + Perl5 cgiです。 cgiの再起呼び出しは可能なのでしょうか。 cgi上のフォーム で、cgiの一部を書き変えたいのですが。
>>422 そういうのは再帰呼び出しとは言わないような。。。
できるからやってみ。つーかやってみてから書きなはれ。
>>422 そのレベルで自己改変コードは危険すぎる。
つーか、99.999%書換え不要。
フォームからsubmitボタンが1回クリックされるごとに 1 -> 2 -> 3 と変更していく変数$aを作りたいのですが、 どうすればいいでしょうか? 大まかな方法は何となく分かるんですが、 ロック制御などについてよく分かりません。
426 :
nobodyさん :04/10/30 23:39:44 ID:JL00AQ8N
あg
カウンタじゃいけないのか?
428 :
nobodyさん :04/10/31 06:04:57 ID:PbybcUUP
s/(?:abc|bbc)/c/; と s/abc/c/; s/bbc/c/; とではどっちが速いですか?
429 :
nobodyさん :04/10/31 06:43:53 ID:/9xW7Y/D
<input type="file" name="file"> として、 $query->param('File') で受け取った値を、同じ(type="file")として別のCGIなどに 渡す事はできないのでしょうか? 調べてみたところ、(type="file")はセキュリティのため、 初期値を設定したりスクリプトで値を操作することが出来ないとされており、 同じ内容を受け渡す事ができず、困っております。 よろしければ、おしえてください。
>>428 自分で試してみようとは思わないのですか?
動作が異なるものを比べても意味無いじゃん。
処理A,B,C,Dがあって、それぞれに対応する変数$a,$b,$c,$d(動作そのものではなく)があります。 これらの対応する変数の大きい順番に処理A,B,C,Dを行いたいのですがどうすれば良いでしょうか?
>>429 出来ないように作られているので出来ない。
出来るようにすると、お前以外の世界中の人が困るようになるので、出来るようには出来ない。
KENT-WEBにあるWeb ProtectというCGIを設置したんですが、 パスワード認証画面が携帯電話(au W11H)で表示することができないです <tr> <td class="ent2"> <table border=0 cellpadding=0 cellspacing=5 width="100%"> <tr> <td colspan=2>$title</td> </tr> <tr> <td>ユーザー名 :</td> <td><input type=text name=id size=15 value="$cid"></td> </tr> <tr> <td>パスワード :</td> <td><input type=password name=pw size=15 value="$cpw"></td> </tr> <tr> <td></td> <td><input type=checkbox name=cook value="1" $checked> パスワードを記憶する</td> </tr> <tr> <td colspan=2 align=right height=50 valign=bottom> <input type=submit value=" OK "> <input type=reset value="キャンセル"></td> </tr> </table> 行数足りなくて最後の方ちょっと省略しましたが これを携帯で表示させるにはどうすればいいのでしょうか?
>436 丸投げ改造スレへドゾー。
Aサーバに設置したスクリプトから、 lsコマンド使って、Bサーバのあるディレクトリの一覧を取得するようなことは 可能でしょうか?
>>437 いくつかのやり方に応じて適切な条件が揃わないとできんよ。
つーか、逆に言うとそれをやられないように作られてるんだから。
試行錯誤してやっと完成したスクリプト。 しかし初心者だけにセキュリティ的な部分が非常に気になります・・・。 何かセキュリティ的に大丈夫かどうかチェックする方法ないですかね? 2chでさらす以外で。 他の初心者さんたちはどうしてるんだろ?
上級者に聞くしかないでしょう。 じゃなきゃ自分が上級者になる。
>>439 どういうセキュリティを懸念してるんだ。
とりあえずはクロスサイトスクリプティングあたりか?
作ったものによるだろ。 XSSは当然として、セッションハイジャックやSQLインジェクションなど その他色々。
4様が微笑みながら444ゲット ズサーーーー!!
445 :
nobodyさん :04/11/01 01:09:12 ID:CTnWn+hA
446 :
nobodyさん :04/11/01 04:25:18 ID:rUgrlUVh
net::ftpのdirをつかって、ファイルの更新日時を取得したのですが、 月がOctのように英語表記になってしまいます。 これはどのように数字に変更すればいいのでしょうか?
>>446 %Month = (Jan=>1, Feb=>2...)みたいなハッシュを用意しといてひけば
とりあえず数字にはなる。
s/Oct \d{2} \d{2}:\d{2}/10月$1日$2時$3分/g; みたいに12行書く。
カッコ付け忘れ。適当に補ふ。
450 :
nobodyさん :04/11/01 19:42:22 ID:IPrYAMkf
キリ番を調べたいのですが、 100単位でのキリ番は、 $a = substr("カウント値",-2,2); if($a eq '00'){ print "キリ番"; } で処理しています。 連番に関してはなかなかいいアイディアが思い浮かびません。 参考となるカウンターやアイディアをご教授ください。
キリ番とかダサイからやめたほうがいいよ
>>451-452 アイディアのカケラも思い浮かばないような発想力不足のクズはこのスレにいないでいいよ
454 :
nobodyさん :04/11/01 21:05:16 ID:IPrYAMkf
>>450 です。
確かにダサイのですが要望があったので色々と試してました。
0の連続するきっちりのキリ番やゾロ目なら数十桁くらいを配列にいれて
比較してたのですが、連番となると数が多すぎて…
漏れもダサイとは思うが、どうしてもやらにゃならんと言うなら キリ番やゾロ目なら正規表現使う方が賢明だろう 連番はアイデアがないが 「自分が数字を見たとき連番かどうかをどうやって判断しているのだろう?」と 自分の頭の中の認知回路を自己分析してみると 実装可能なアルゴリズムを思いつけるかもしれん
ゾロ目: sub zorome { my($x)=@_; $x % ('1' x length($x)) == 0; } 連番: sub renban { my($x)=@_; zorome($x - substr('123456789', 0, length($x)-1));} あたりでどう?
457 :
nobodyさん :04/11/01 21:25:11 ID:hZSImnu8
連番は、何個同じ数字がどこに並んでりゃいいの?3個どこでもよければ while(($var =~ /(\d)/) and ($var =~ s/$1{3}//)){print "連番やん\n";}
458 :
450 :04/11/01 21:49:58 ID:IPrYAMkf
>>450 です。
>>456 、
>>457 様、ありがとうございます。
教えて頂いたものは負荷も少なく凄いです。
正規表現に疎いためまだ理解できていないのですが…
連番は何個からとかは特に決めていません。
12でも連番のキリ番として扱う予定です。
>>457 様
$varに数値をいれるとして、$1の部分が理解できません。
これだと例えば1114も連番となってしまいますか?
$1を知りたければ、多少でもいいから正規表現を学ぶんだ
正規表現だとゾロ目は $x =~ /^(\d)\1*$/ なのでこっちの方がシンプルかも? (最初が数字でその後0個以上の 同じ数字が文字列の最後まで続く) 最低n桁にしたければ*のところを{n-1,}にすればいい。たとえば 最低4桁なら $x =~ /^(\d)\1{3,}$/
連番は index("123456789", $x) >= 0 という手もある
セッションハイジャックやSQLインジェクションってどうやって防ぐの? 入力チェックが効果的ってどっかで見た気がするが。
463 :
450 :04/11/01 23:27:32 ID:IPrYAMkf
>>450 です。
>>460 、
>>461 様ありがとうございます。
正規表現でのゾロ目チェックは参考になりました。
連番でindexを使うのは気付きませんでした。
>>462 Perlコーディング初心者質問スレ Part 38
467 :
nobodyさん :04/11/02 08:25:16 ID:s3D5jAc8
Image::Magickで1M以上のJPG画像を縮小しようとしたら サイズはあっているのですが画像の上の10%くらいで変換がおわってあとは真っ黒になります なにが原因なのでしょうか use Image::Magick; $i = Image::Magick->new; $i->Read('test.jpg'); $i->[x]->Scale("200"); $i->Write("temp.jpg");
途中で殺されたんじゃねーの
469 :
462 :04/11/02 10:19:20 ID:???
あれ、俺マルチなんかしてねーぞ?
>>467 よくわからんが、Scale メソッドってそういう呼び出し方するんだったっけ
471 :
467 :04/11/02 10:55:21 ID:MX3i4yL1
use Image::Magick; $i = Image::Magick->new; $i->Read('test.jpg'); $i->Resize(width=>200, height=>150, blur=>0.7); $i->Write("temp.jpg"); これも駄目でした
正規表現の修飾子を変数に入れたまま 使う事は出来ないんでしょうか? foreach(@list){ if(/$pattern/$a){ print "true"; }else{ print "false"; } } 正規表現を勉強しようと、 CGIで正規表現と複数の文字列をPOSTし、 文字列がマッチするか検証するスクリプトを書いています。
>>474 出来ました。ありがとうございます。
if(eval "/$pattern/$a"){}
みんなならどっちにする? $a=4 if $b; $b=5 if $b; と if($b){ $a=4; $b=5; } なんか{}(ブロック)をなくす方が処理が早いみたいなこと聞いて こんなつまらないことで悩んでる状況。
ご教授ください。 その月が何日が最終日なのかを調べるほうほうは どのようにつくればいいのでしょうか?
ツェラーの公式で検索してみ
>>476 それがものすごい回数繰り返されるループの中とかなら、
ベンチとって選べ。
そうでなければどうせ誤差ぐらいしか違わないから自分が
見やすいと思うほうにしとけ。
一般論としては、動くの作って動作速度に不満が出てから
プロファイラでどこが時間食ってるか調べて集中的に直せ、
と言われているようだ。
軽くベンチした感じでは、$bがfalseならif(){}の方が
3倍ぐらい早いが、$bがtrueなら25%ぐらい遅い。
sub last_day { my($y,$m) = (shift,shift); my @days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); return 0 unless (1 <= $m and $m <= 12 ); $m-- == 2 ? $days[$m] + ($y % 4 == 0) - ($y % 100 == 0) + ($y % 400 == 0) : $days[$m]; }
481 :
476 :04/11/02 19:28:42 ID:???
>>479 さん
神様のような方ですね。
ありがとうございました。
10回程度なので見やすいほうにさせていただきます。
($a,$b)=(4,5) if $b; も、べんちまぁくしてねぇ(はぁと)
>>476 それだと条件分岐の評価が2回行なわれるので、
条件式次第では遅くなる可能性があるよ。
$a=4, $b=5 if $b;
$b and $a=4, $b=5;
($a,$b)=(4,5) if $b;
$b &&= 5 and $a = 4;
労力の割にはたいした効果が期待できないので、
最適化のためにblockを消したりとかは、した事ないけど。
日本時間、2004年11月2日午後10時を示す数字 04110222 をGMTで同じように8桁で表したいのですが、どの様にするのが よいのでしょうか? 一旦、unix timeにして、-9時間して、戻すのが順当でしょうか? できれば、use Time::Localはしたくありません。 (それが使えない環境などがありそうなため) perl JST GMT でググってもTZとかしかでてきませんでした。 よろしくお願いします。
unixtime
ありがとうございました。
変数から特定の文字列がある場合、それを抜き取るという 動作をしたいんですが、これはどうすればいいでしょうか? index と substr を使う方法を思いついたのですが、 もっとスマートな関数とかありますでしょうか?
age
>>488 if(/特定の文字列/){
$unko = $1;
}
>>490 抜き取られていない。
push @result,$1 while s/(特定の文字列)//;
とかいろいろ。
PerlでPHPのgetImageSizeみたいなのないですか? 特にSWFのサイズ取得とかあるサブルーチンあったら教えてくださいませ
>>484 あとは自分で何とかしる。
$_ = '04110222';
my @a = /(..)/g;
my @m = qw/31 28 31 30 31 30 31 31 30 31 30/;
$m[1]++ unless $a[0] % 4;
my $t = 946652400 + 3600 * ($a[3] + 24 * int $a[2] - 1 + 365 * $a[0] + (3 + $a[0]) / 4);
$t += 86400 * $m[$_] for 0..$a[1] - 2;
print scalar localtime $t;
>>484 Time::Localってperl本体に付属してたと思ってたんだけど、
分離されたんだっけ?
あとGMTにするのはgmtime使うかtimezoneいじるべきで
unix timeを9時間戻すのはよろしくないと思うよ。
ユリウス時間でも出してきたらどない?
>>495 > GMTにするのはgmtime使うかtimezoneいじるべきで
漏れもそう思うが、
> unix timeを9時間戻すのはよろしくないと思うよ。
これには何か理由があるのか?
498 :
484 :04/11/03 15:46:43 ID:???
色々返答ありがとうございました。
質問の仕方が悪かったかもです。
どうやらgoogle君に聞いてみると、Time::Localは標準ライブラリらしいです。
なのでどの環境いっても使えそうです。
重くなりそうという根拠のない理由から、できれば避けたいと書きました。
#標準ライブラリということを確定的できる情報元ってないんでしょうか…
何をしたいかというと、
0411031500という時間をcookieのexpire時間にしたいのですが、cookieではGMT
でJSTを指定できないらしいので変換をしなくてはならないのです。
>>493 さんのコードちょっとむずかしすぎてまだ理解できてないです…
以下のURLのサブルーチンでunix timeにはできそうです。
http://www.ybi.co.jp/koike/qa3000/qa3165.htm
>>497 うるう秒が間に入るとずれるから。ちゃんとサポートされたシステム
での話しだけど。
クッキーのexpire時間ぐらいならそう厳密じゃなくていいから
構わんと思うけどね。
502 :
497 :04/11/03 16:41:31 ID:???
標準ライブラリだからといって必ず使えるという保障はないわけで。 あんまりこだわる必要はないと思うけど? それよりも、なぜにcookieのexpireで人間的日付を元にするのかが気になる。 単純に timeから30日間有効 とかにしてしまえば楽なのに。
>>494 情報ありがとう!
やはり1つの関数で勝手にファイル判別してくれるとかはないんですかね?
まぁ手動で見分けて条件分岐すればいいんでしょうけども・・・。
2chで出てるようなIDを生成したいんですが、2chがどうやって生成してるのか教えて頂けないでしょうか? 前に、そういうサブルーチンを見かけた気がするんですが検索しても見つかりませんでした。 よろしくお願いします。
>>506 いやそれは分かるんですがcryptの元の文字列をどうしてるのか知りたいのです。
>>500 なるほど、4年に一度狂う位なら問題なさそうなので、unix timeにして-9時間に
しようかと思います。
標準ライブラリは、導入されていなかったり、過去のバージョンであるかわからない
とのことなのでやっぱり使わないほうが無難な気がするので使わない方向でいきます。
>>503 なぜ、人間的日付かというと、その時間になったら掲示板に投稿できなくなるという
改造を自分でして、読みやすいから0411031700みたいな形で設定ファイルに保存
するという形をとったからです。
ここから間違いかもしれませんが…unix timeで保存した方が良かったのかもしれませんね。
#やっぱり見やすいからそうしました。
>>508 それだけだと、総当りでIPアドレス算出できるから、日ごとに更新される乱数が使われてる。
512 :
505 :04/11/03 21:07:28 ID:???
>>511 やりたいことができました。
本当にありがとうございました。
トリップの作り方はわかったのですが、 ↓ここのIDはどうやって作るんでしょうか? 356 :Now_loading...774KB :04/11/03 21:01:50 ID:j7+5/dK/ 誰かよろしくお願いします。
配列の数を吐き出す奴ない?length(@xx)とかやってもだめだった。
>>515 スカラーコンテクストなら@xxは配列の要素数になる。
わからなければscalar(@xx)としとけば確実。
>>517 $#xxは$[変えるとそれにつれて変わるので(要素数-1)として
使うのは危険だと習った。
$[ = 1;
@xx = (1,2);
print $#xx+1;
$[をいじったスクリプトなんて書いたことないけどね。
scalarでいいじゃん
520 :
515 :04/11/04 01:27:14 ID:???
みんなありがd
521 :
515 :04/11/04 03:06:36 ID:???
sub内だけで使用する変数ってlocal($hensuu)って宣言するんだっけ?
my
524 :
nobodyさん :04/11/04 11:55:35 ID:3xCNLIZD
特定のページからの来訪の場合のみ、 処理させたいんですが、この場合環境変数とif文使えばいいんでしょうか?
525 :
524 :04/11/04 11:56:51 ID:???
あ、これだとノートンとか入れてる人には無効になってしまいますね。
あるプログラムからpostでID/PASSを送るプログラム作ってるんだけど、 ブラウザに丸見えになりますよね? で、一応暗号化はしたんですけど、例えばネットカフェに データが残ってて、解析されたら終わりってことですよね・・・ う〜んどうすればいいものか。 他のスクリプトはどうやっているんでしょ?
<form action="$url"> <input type="text" name="url" value=""> </form> 上記のようにアクション先にその場で入力された URLを指定することってできるでしょうか?
>>527 Javascript使ってしか無理だと思うけど。
530 :
527 :04/11/04 13:40:32 ID:???
javascriptを使用しない場合は不可能でしょうか?
531 :
527 :04/11/04 13:41:16 ID:???
perlを使った方法はないでしょうか?
532 :
526 :04/11/04 13:52:12 ID:???
POSTとGET以外に変数を別のスクリプトに渡す方法ってあるでしょうか?
できないこともないけど、スマートじゃないな
>>532 「変数を」別のスクリプトに渡す
ということは、foo.cgi->Browser->bar.cgiの過程で
foo.cgiが出力した値をbar.cgiに渡したいということか?
537 :
526 :04/11/04 15:46:07 ID:???
>>537 そういうセッション管理で一般的に使われるのはCookieだな。
Passは最初の認証だけ使って、後はセッションIDをCookieへ入れといて、
ワンタイムパスワードをPOSTさせて認証処理・・・って感じになるのかな。
本なんかをちょっと見ただけで実際に作ったこと無いから、落とし穴があるかも。
Cookieは気をつけないとPOST以上に危険だから注意
あと、
>ブラウザに丸見えになりますよね?
の一言が気になるんですが、まさかtype="hidden"を知らないなんてことは・・・
unko
>>537 ActivePerl入れて、インターネットゾーンでも使えるようにレジストリ緩めれば、language=perlで好きなことできるよ。
そんな糞ページ誰も見ないがな。
544 :
nobodyさん :04/11/05 04:30:09 ID:127p6d3j
スクリプトに引数を付けることで処理を色々に分岐させようとしています。 例:-a、-l、-h、-v、-r、<引数なし>を引数とする。 現在、引数を見て処理させる場合、 if ($#ARGV == "0") { if ($ARGV[0] eq "-a") { 処理1; } elsif ($ARGV[0] eq "-l") { 処理2; } elsif ($ARGV[0] eq "-h") { 処理3; } elsif ($ARGV[0] eq "-v") { 処理4; } elsif ($ARGV[0] eq "-r") { 処理5; } else { &error; } } elsif ($#ARGV == "1") { if ($ARGV[0] eq "-a" && $ARGV eq "-l") { 処理5; } elsif ($ARGV[0] eq "-l" && $ARGV eq "-h") { 処理6; } elsif ($ARGV[0] eq "-h" && $ARGV eq "-v") { 処理7; } elsif ($ARGV[0] eq "-v" && $ARGV eq "-r") { 処理8; } elsif ($ARGV[0] eq "-r" && $ARGV eq "-a") { 処理9; } else { &error; } } などとしていますが、引数が増えるとそれだけ組み合わせも増えるわけで 現在引数による分岐だけで混乱しています。しかもこのスクリプトを実際に 使用する場合、引数の順序も固定されてしまうので、表現力が乏しくなります。 それぞれの引数に数字を割り当てて、それをfor (@ARGV)で見ていって それらを加算した結果で処理させる方法などを考えましたが、 数字を割り振るコツも分かりません。 引数や、それらの組み合わせが増えたとき、どういう風に対処すれば 分かりやすく、作りやすいスクリプトが書けるのでしょうか。 よろしくお願いします。
545 :
544 :04/11/05 04:39:45 ID:127p6d3j
上の例文は間違いです。 正しくは以下の通り。 if ($#ARGV == "0") { if ($ARGV[0] eq "-a") { 処理1; } elsif ($ARGV[0] eq "-l") { 処理2; } elsif ($ARGV[0] eq "-h") { 処理3; } elsif ($ARGV[0] eq "-v") { 処理4; } elsif ($ARGV[0] eq "-r") { 処理5; } else { &error; } } elsif ($#ARGV == "1") { if ($ARGV[0] eq "-a" && $ARGV[1] eq "-l") { 処理5; } elsif ($ARGV[0] eq "-l" && $ARGV[1] eq "-h") { 処理6; } elsif ($ARGV[0] eq "-h" && $ARGV[1] eq "-v") { 処理7; } elsif ($ARGV[0] eq "-v" && $ARGV[1] eq "-r") { 処理8; } elsif ($ARGV[0] eq "-r" && $ARGV[1] eq "-a") { 処理9; } else { &error; } }
>>544 引数をハッシュに代入してexistsで条件分離したら?
for(@ARGV){
$param{$_} = '1'; #値自体はなんでもいい。
}
分岐は
if(exists $param{'-a'}){ 処理1;}
とか
if($param{'-a'} == 1){ 処理1;}
みたいの。
>>544 my %table = (
'a' => sub{ print "処理1" },
'l' => sub{ print "処理2" },
...
'r' => \&r_part,
'al' => \&r_part,
'hl' => sub{ print "処理6" },
...
);
sub r_part{ print "処理5" }
my $key = join('', sort @ARGV);
if (exists $table{$key}){
$table{$key}->();
} else {
print "ERROR";
}
548 :
547 :04/11/05 07:02:16 ID:???
おっと、ハイフン取り除く処理を忘れてたーよ。
550 :
544 :04/11/05 10:39:14 ID:T3r+ugEG
ああ、寝てしまった間にこんなにレスが付いてる!
ありがとう御座います!
ぱっと見た感じでは
>>546 さんと
>>547 さんは同じ処理ですか?
連想配列にこういう使い方があったと知って、眼から鱗の初心者です>私
両方を試してみます。ありがとうございます。
>>549 煩雑な徒手作業のところをできる限り自動化/半自動化していく積もりで
ゆくゆくはこうしたモジュールを有り難く使った方が効率が良いとは考え
ているのでこういう助言は本当に助かります。
ありがとうございます。
早速実験してみます。
ありがとう御座いました。
551 :
nobodyさん :04/11/05 11:05:29 ID:vXdBVIeu
スクリプトいじってたら 正規表現で s/ //g; とやっても空白がマッチしなくなりました s/\s//g; ならマッチします 原因と元に戻す対処法を教えてください
552 :
551 :04/11/05 11:19:18 ID:vXdBVIeu
自己解決しました
553 :
nobodyさん :04/11/05 11:36:35 ID:vAMAiFLG
間違えてPHP質問スレに書き込んでしまったのでこちらで質問しなおします。
ttp://tohoho.wakusei.ne.jp/wwwperl2.htm こちらのsocket関数の項目に書かれているスクリプトを自分の
スクリプトに組み込んでますが
自分の使っているサーバーでperl -wcでスクリプトチェックを行ったら
Unquoted string "stdout" may clash with future reserved word at aaa.cgi line 543.
このような警告文が表示されました。
select(stdout);
のstdoutをAAAとか別のものに置き換えたらこの警告文が回避できましたが
別のものに置き換えても正常に動くのでしょうか?
perlのバージョンはThis is perl, v5.8.2 built for i386-freebsdです。
select(STDOUT);
555 :
553 :04/11/05 12:26:44 ID:vAMAiFLG
>>554 どうも有り難うございます。
stdoutをそのまま大文字にしても動くんですね
556 :
nobodyさん :04/11/05 13:45:35 ID:uR92YhZO
現在CGIでのアクセス制限サイトを作っているのですが、 アドレス欄にIDとパスワードが表示され、 そのIDとパスワードを含んだアドレスを入力すると、 ログが記録されないのです。 (cgiの認証画面から入力するときちんと記録されます) ログ記録はこんな感じなのですが。。。 どこか間違っているのでしょうか sub record { local($date,$time,$agent,@data); # 時間&ホスト取得 $date = &get_time; $time = time; &get_host; # ロック開始 &lock if ($lockkey); # ログファイルの読み込み open(IN,"$prvdir/$logfile") || &error("Open Error: $logfile"); @data = <IN>; close(IN); # ブラウザ情報 $agent = $ENV{'HTTP_USER_AGENT'}; $agent =~ s/&/&/g; $agent =~ s/</</g; $agent =~ s/>/>/g; $agent =~ s/"/"/g;
557 :
556続き :04/11/05 13:45:59 ID:uR92YhZO
# ログ更新 while ($max <= @data) { pop(@data); } unshift(@data,"$in{'id'}<>$date<>$host<>$agent<>$time<>\n"); open(OUT,">$prvdir/$logfile") || &error("Write Error: $logfile"); print OUT @data; close(OUT); # ロック解除 &unlock if ($lockkey); }
558 :
556続き :04/11/05 13:54:30 ID:uR92YhZO
すいません、この認証処理の中で何か足りないのかもしれません。 どなたか解る方お願い致します。 sub pwCheck { local($f,$id,$pw,$check,$time); if ($mode eq 'enter') { $time = time; if ($in{'cook'} eq "") { $in{'cook'} = 0; } &set_cookie($in{'cook'}, $time); } $f=0; open(IN,"$prvdir/$pwdfile") || &error("Open Error: $pwdfile"); while (<IN>) { ($id,$pw) = split(/:/); if ($in{'id'} eq $id) { $f++; last; } } close(IN); if (!$f) { &error("認証できません"); } $pw =~ s/\n//; $check = &decrypt($in{'pw'}, $pw); if ($check != 1) { &error("認証できません"); } &fileOpen; if ($mode eq 'enter') { &record; } exit; }
わかるなぁ〜その気持ち。。。
と、レスしてから改めて
>>556 の説明を読んでたら混乱してきた。
何をしたくて、どこがどのように思った通りに動いてくれないのか
わからない…。
URLにクエリーが表示されちゃって困ったよー。って話じゃない…?
エスパー回答者向けだな
563 :
伊藤 :04/11/05 17:14:02 ID:???
呼んだか?
564 :
nobodyさん :04/11/05 21:03:45 ID:w/zBhN/X
print " <a href=\"$script?action=icondisp&type=$FORM{'type'}\">$lbl_iconlist</a>\n"; これを新しいウィンドウで開きたい場合はどのように書き直せばいいのでしょうか? 以下のようにするとエラーなんです。 よろしくお願いします。 print " <a href=\"$script?action=icondisp&type=$FORM{'type'}\" target="_blank">$lbl_iconlist</a>\n";
>>564 バーカ
print ' <a href="' . $script . '?action=icondisp&type=' . $FORM{'type'} . '" target="_blank">' . $lbl_iconlist . '</a>' . "\n";
566 :
nobodyさん :04/11/05 21:38:56 ID:w/zBhN/X
>>565 全角にスペースにしわすれました
すいません
printf にした方が読みやすいとは思うけれどもども。。。 printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|; $script, # スクリプトのお名前 $FORM{'type'}, # typeの値 $lbl_iconlist; # アイコソリスト(文字列)
>>567 あらやだ。
> printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|;
printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|,
569 :
365 :04/11/05 23:36:15 ID:???
print qq[<a href="$script?action=$icondisp&type=$FORM{'type'}" target="_blank">$lbl_iconlist</a>]."\n"; でいいんじゃないの?
ダブルクォーテーションとかの扱いは人それぞれだからどうでもいいじゃん自分で気に入ったの使えば
>>507 俺も同感
だからこそperlは何通りも書けるんだしね
そこがPerlの良さ
そこがPerlの悪さ
そこがPerlのぬるぽ ところで、NullPointerExceptionをPerl語にすると何?
ガッ
釣れますか?
ダウンロードカウンタのCGIを作ろうとしています。 ブラウザにファイルの内容を送ろうと思うのですが,どうすれば良いでしょうか? 以下だとファイルが壊れてしまいます. open(FILE,"$FileName"); binmode(FILE); print <FILE>; ←while(<FILE>){print $_ }でもだめ. close(FILE); 送りたいファイルは40KB程度ですが,数MB程度のファイルも対応できるとうれしいです. お知恵をお貸しくださいm(_ _)m
578 :
577 :04/11/06 17:41:38 ID:???
書き忘れましたが,ファイルはバイナリファイル(LZH,ZIP等)です. よろしくお願いします.
>>577 環境によっては binmode(STDOUT); がいるんじゃないかな。
あと、バイナリファイルなら行読み込みにせず、readでバイト数指定して読み込み
while (read(FILE, $buffer, 1024*10)) ... バッファサイズは適当に
printで出力する場合はバッファoffするのも忘れずに $|=1 (念の為
>>577 binmode(STDOUT) してないだけじゃないの?
つーか、壊れるという曖昧な表現じゃなくて
バイナリエディタで比較してみたら こういう違いがでてきた、ってな感じで話してくれないと。
まぁ、それ見りゃ自分でもおかしいとこに気づくんだろうけどね
581 :
580 :04/11/06 17:59:28 ID:???
んぁ。言葉選んでる間に答えられちゃってるよオレ カコワリィ
582 :
577 :04/11/06 18:12:10 ID:???
>>579-580 レスありがとうございました。
原因は二つで,binmode(STDOUT)されてないこと,行読みした結果,改行コードが欠落したことでした.
>>579 「$|」というのはPerlの環境変数のようなものなのでしょうか?
print $|;だと値を返すようですが・・・
手元の資料&Google先生を調べても分からなかったのですorz
>>580 ご指摘,ありがとうございます.
「どういう風に壊れたのか」を説明する必要がありました.
失礼しました.
>>580 Don't mind, 既知問題っぽかったから推測で書いちゃったけど
実は全然違う原因だったって事はよくあるからね.
>>582 $|は検索しにくいのが難点だな。Perl バッファリングで調べると詳細でてくるよ。
584 :
577 :04/11/06 19:17:26 ID:???
>>583 とほほさんのBBSに質問がのってますね.
勉強したいと思いますm(_ _)m
585 :
nobodyさん :04/11/06 20:47:26 ID:55uCUnw3
○ , ○>
/ ̄'☆ )
>>1 / > /
☆をダブルクリックするとかめはめ波が出るぞ
注)設定とか環境のせいで正常にかめはめ波しないときがあります
587 :
nobodyさん :04/11/06 20:56:12 ID:ZyicEXrd
Win2K + Active Perl 5.8 を使用しています。以下のスクリプト を実行すると、「p.tif」 のファイル名が文字化けしてしまいます。 「use encoding "shift_jis";」の行を外すと、正常に「あ.tif」に変換 されるのですが、この行を残したままrename するにはどうすれば よろしいでしょうか? use encoding "shift_jis"; chdir 'c:\\test'; rename "p.tif", "あ.tif";
588 :
nobodyさん :04/11/06 21:13:32 ID:jPPLQ8mN
○ , ○>
/ ̄'☆ )
>>587 / > /
☆をダブルクリックするとかめはめ波が出るぞ!
注)設定とか環境のせいで正常にかめはめ波しないときがあります
perl 5の正規表現で、content-typeヘッダに日本語があるかないかを判別するのに iso-2022-jp|shift-jis|euc-jp|multipart\/mixed という記述をします。これを応用して、『英語か日本語にマッチ』するかどうかを記述するには どうすればよいでしょうか?
590 :
587 :04/11/06 22:56:11 ID:???
>>587 は自己解決できましたが、もっとスマートな方法があれば
よろしくお願いします。
use encoding "shift_jis";
use Encode;
chdir 'c:\\test';
$str = encode("shiftjis","あ.tif");
rename "p.tif", $str;
HTMLの<!---->みたいに複数行をまとめてコメントアウト する方法をど忘れしてしまったので教えてください。 「#」じゃなく。
593 :
592 :04/11/07 19:14:26 ID:???
自己完結。 =comment # ここからコメント =cut # ここまでコメント
回答方法もど忘れしてしまいました。
595 :
nobodyさん :04/11/07 20:51:25 ID:OKDqn1bD
お恥ずかしい話ですがsplitガどうしても上手くいきません。 @dat = split(/*/, <DAT>); これで合ってると思うのですが、どうしてもエラーになってしまいます。 *DATは存在します。ちゃんと*で区切られています。
* → \*
597 :
nobodyさん :04/11/07 20:54:42 ID:V/bBugXz
全角半角混合の文字列からある順番の文字を取得したいのですがうまくいきません。 誰かお願いします。 文字列 $xx=あいうえおaiueo から2番目の'い'を取り出だすとき substr($xx,1,1);ではだめで 全角は2バイト分なので substr($xx,3,2);でないとだめなようです。
599 :
597 :04/11/07 21:00:05 ID:V/bBugXz
たとえば ランダムに生成された全角半角混合の文字列 $xx=げあじgraふぇeあefaじえeaあい; から9番目のeを取り出す方法を教えて
>>599 use Encode を使え
ただし 5.8 以上の perl でないとだめだが
文字列を1文字ごとに分割して配列に入れりゃいいんじゃないか?
んじゃ文字を配列にバラすコードを。文字コードは勝手にSJISと判断。 my @moji; foreach ($xx =~ /[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf]/g) {push (@moji,$_)} print $moji[8];
どこまでしたいか謎だったからなぁ。やりたいのはこうかもしんないし。 my @moji = ($xx =~ /[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf]/g); print @moji[2..8]; なんにせよ環境も要件もよくわからんと返しようがないのぉ。
605 :
597 :04/11/08 02:03:34 ID:???
パールは5.8 以上みたいです。 トリップ生成用途だったのですが、これでうまくいきそうです。 みなさんどうもありがとうございます。
606 :
595 :04/11/08 09:25:10 ID:???
607 :
595 :04/11/08 11:09:36 ID:IV2+5aK4
@data = split(/\n/, <DAT>); で代入したら、$data[0]にしか代入されていません。 どなたかよろしくお願いします。
>>607 その場合の <DAT> は一行しか読み込まないので、当然そうなるだろう。
というか何がしたいのだいったい。
ひょっとして君のやりたいことは @data = <DAT> だったりしないか。
つーか、<DAT>って何よw?
610 :
595 :04/11/08 15:22:15 ID:hLOeveWj
>>608-609 あっ、すみません。<DAT>はファイルハンドルです。
>>608 なぜこの場合だと一行しか読み込まないのですか?
では、どうすればすべての行を読み込んでくれますか?
説明不足ですみません。返答お願いします。
612 :
595 :04/11/08 16:59:14 ID:x02iMqC5
>>611 すみません。やっていることがおかしかったですね。
ありがとうございました。
@var=<IN>; とすると改行\nが消えないですが、それを消して配列に代入する方法はありませんか。
たまにこういう釣りみたいな質問が来るな
>>615 { local $/ = undef; @var = split(/\n/, <IN>); }
あたりかな。ただしファイルの末尾の空行が消えるのが嫌なら、
splitの第3引数に負の値を与えるとともに、splitしたあとで
@varの最後の要素を捨てる必要があるだろう。
普通に読んだ後でchomp @varした方が書くのは楽だね。
chomp(@var=<IN>);
配列をヒアドキュメントでprintするとスペースも一緒にprintされてしまうわけですが、 これを回避するにはいちいちヒアドキュメントを閉じるしかないですか?
no
>>619 $"を空文字列にしておく
あるいは、
@{[join('',@a)]}として埋め込む
622 :
619 :04/11/09 02:18:31 ID:???
>616 このスレで質問するとよく言われます。。 >617>618 ありがとうございます。
>623 言われないように努力したりしないの? 釣りだと思われるような質問しちゃってるんだよ?
Perlから,自分が動いているOSを知ることは出来ますでしょうか。 例えばWindowsで下を実行すると print $^O > MSWin32 とか出ますが,WinXPとかWin98とかくらいまで詳しく知るには,どういう方法がありますか。 (できればUnix系でも詳しく知りたいです)
626 :
nobodyさん :04/11/09 09:36:25 ID:enWymUQX
別のウェブサーバー上にあるファイルの情報をstatとかで更新されているか、
されていないかとかしたいのですが、どうやってやったらいいのでしょう?
$url = "
http://www.example.com/file.jpg ";
@data = stat $url;
とかやっても取れないので(うすうすわかっていましたが)。。。
ウェブ上のデータとstatの内容を取得する方法を教えてください。
>>626 lwpでもなんでもいいけど
httpのヘッダで
Date か Last-Modified みるしかなかんべ。
取れなかったら諦めるしかない。
628 :
nobodyさん :04/11/09 10:07:38 ID:enWymUQX
>>627 ありがとう。
そういうものなんですか。
>>625 $hoge =`uname -m`; とか。
詳しいことはUNIXのコマンドリファレンスでも探せば良し。
>>626 他のサーバーのデータは、
socketでソケット作って、connectで繋いで初めて得られる。
色々複雑だから、素直に解説本読みなはれ。
>>629-630 ありがとうございます。こんな風にしていろいろな環境でOS名を取得できました。
# 自分の目的のためには下の例で事が済んだのですが。
#-------
my $OS;
if ( $OS = `uname -s` ) {
#do nothing
} elsif ( !$OS and eval{require Win32} ) {
$OS = ( Win32::GetOSName() )[0];
} else {
die "MacPerl?";
}
print $OS;
> Linux, FreeBSD, Win2000, Win98...
#-------
my $OS = $^O;
if ( $OS eq 'MSWin32' ) {
require Win32;
$OS = ( Win32::GetOSName() )[0];
}
print $OS;
> linux, freebsd, Win2000, Win98...
632 :
nobodyさん :04/11/09 23:22:24 ID:mn5HDpbS
CGIにhtml組み込んで、 アクセスしてみたら、真っ白のページが表示されます。 んで、ホームページのソース表示してみたら、 確かにそこにはhtmlソースがちゃんとあるんだけど、 表示されていない。 原因はどんなことが考えられますでしょうか?
>>632 どうせまともな HTML 吐いてないとかじゃないの?
タグの閉じ忘れ つうか原因探ってほしいならソースをどっかにあげましょう
635 :
632 :04/11/09 23:34:40 ID:mn5HDpbS
print <<__HTML__; Content-Type: text/html; charset=EUC-JP <html lang="ja"><head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP"> <title>test</title> このコードに問題ありますか?
636 :
632 :04/11/09 23:36:40 ID:???
タグの閉じ忘れっぽいですね、 他ブラウザで試したら表示されました。 企業から配布されてるスクリプトなのにテキトーだなぁ サンクスでした。
637 :
nobodyさん :04/11/10 00:18:59 ID:sQyPPo3N
スレ違いだったら大変申し訳ございません。 cronでcgiを動かすにはどのように設定ファイルを書けば宜しいのでしょうか。 /public_html/a.cgi にありますcgiを例えば1時間毎にa.cgi?a=1&b=2とパラメータを渡してcronで 実行したいのですが。 よろしくお願い致します。
スレ違いだな。スレタイを100回音読してから、また質問しに来ような
639 :
nobodyさん :04/11/10 00:37:27 ID:sQyPPo3N
>>638 大変申し訳ありません。
該当スレを御存知でしたらお願いしたいのですが。
>>637 perl /public_html/a.cgi
パラメータは渡せるが動的にするのはcronじゃ無理じゃないかな〜(知らないだけかも)
ちなみにコマンドラインのときはGETメソッドじゃなく引数になるから受け方違うよ
a=1とb=2が決まってるなら
ファイルの最初に宣言した方が早い
どうしてもCGIとして動かしたいならばWWW経由で/public_html/a.cgiを呼び出すプログラムが必要
それよりコマンドラインでperlを使ったことなさそうだけど
作るときちゃんと文法チェックしてるのかな?
642 :
nobodyさん :04/11/10 08:39:47 ID:QcwLl9v+
誘導済みのスレ違いの質問にレス付ける馬鹿。 晒し上げ。
643 :
nobodyさん :04/11/10 11:45:26 ID:I1NueUmN
@data = (system("df")); とかして、ディスクの使用状況をテキストに書き出したいんだけど、 これじゃあ戻り値を取得できないですよね。 どうやったら取得できますか?
644 :
nobodyさん :04/11/10 11:55:42 ID:I1NueUmN
643です。 自己解決しますた。m(_ _)m
PERLで作成したファイルをPERLからダウンロードさせる場合に どのようにしたらいいのでしょうか? ファイル作成後に「ダウンロード」とボタンを表示してクリックしたら ファイルをダウンロードするみたいな感じです。
646 :
nobodyさん :04/11/10 17:04:37 ID:I1NueUmN
>>645 print "<a href=\"file\">DL</a>\n";
リダイレクト前にcookieを作って、リダイレクトページで生成したcookieの値を取得したいのですが、 結構な頻度で値が取得できません。 ですが、少し時間をおいて取得すると値が取得できるので、 cookie作成のスピードよりもリダイレクト後のページで値を取得してるっぽいです。 従いまして、cookie作成時に少し時間を開けてからリダイレクトしたいのですが、 sleepを入れても意味がありませんでした。 この様な場合の対処方法をご存知の方がいらっしゃいましたら、どうかご教授ください。 よろしくお願いいたします。
648 :
nobodyさん :04/11/10 20:55:28 ID:sQyPPo3N
ファイルから1行読み取り、その読み取った行を削除してファイルを上書きするにはどうしたらよいのでしょうか。 aaa,bbb,ccc,ddd 111,222,33,4444 このようなファイルがありaaa,bbb,ccc,dddを読み込んだ後にaaa,bbb,ccc,dddを削除して ファイルを上書きするような処理です。 よろしくお願いします。
650 :
nobodyさん :04/11/10 21:52:59 ID:QZhMSK0D
>>645 ダウンロードボタンをクリックしてCGIでperlを動かした先で
$length = (-s $file);
print "Content-type: application/octet-stream\n";
print "Content-disposition: attachment; filename=hoge.dat\n";
print "Content-Length: $length\n\n";
open(fp, "<$file");
binmode(fp);
print <fp>;
close(fp);
するとOKだと思う
651 :
nobodyさん :04/11/10 21:55:59 ID:QZhMSK0D
>>648 削除したい行以外を別の一時ファイルに書き込んで、元のファイル名にリネームする
で良いんじゃない?
他にいい方法があれば知りたい
何でわざわざ別ファイルに書かせなきゃならんのかがわからん
>>647 クッキーを食べない時と食べる時がある状況が良く分からないけど…。
<meta http-equiv="refresh" ..>
を使ってクライアント側で飛ばして見るとか。
# 状況は改善されない予感。
654 :
nobodyさん :04/11/10 22:24:11 ID:QZhMSK0D
読み書きモードでオープンすればいいんだっけ?
読み書きモードでその場更新でもいいけど、更新中にプログラムが あぼーんすると変な状態で残ったりする。別ファイルに書き込み、 書き終わったらrenameなら書き換え前か書き換え後のどっちかには なるので、オレはこのほうが好き。
647ではないんだけどプログラム変えてないのに IEでcookieが急に読めなくなった。(前はできてました。) プログラムAでcookie送信してプログラムBに遷移して そのcookieを取ろうとしても取れなかった。 他のcookieは取得することができました。 ネスケでは大丈夫だったんだけどなぁ。 ちなみにCGI.pm使って $hoge=param('hoge'); とやって$hogeが空になっており、 cookieのフォルダを見るとちゃんとそのcookieがありました。
まずはIEのクッキー設定を疑うよろし。
660 :
657 :04/11/11 01:49:17 ID:???
657ミスりました。
paramのとこcookieです。
>>659 クッキーの設定も疑って全て許可にしてもだめだったのです。
でも、今家のPCで同じスクリプト走らせたらできました・・・。
で、サーバの方も試したらできました。
仕事場のPCからやった時はできなかったんですよほほほ。
ご迷惑おかけしました。
文字列$aが数字以外を含んでいたら、 エラー出したいんですが、 どうすればいいんでしたでしょうか? ~[0-9]を使えばいいことはわかるんですが・・・ if($a=^[0-9]){ echo"error";} 何か間違ってますか?(^^;
age
>>661 うむ、それもかなり激しく
if($a=~/[^0-9]/){
>>663 間違えまくってますね笑汗
ありがとうございます、助かりました。
/\D/ 小泉こうだろう?
666 :
nobodyさん :04/11/11 14:33:41 ID:tk5UM/xB
自分のPCで実行して、入力先をWEBページにして、 記載されている内容を処理しファイルに書きたいのですが 可能でしょうか? 基本的なことですみません。 何の言語を覚えたらいいのかわかりませんので。
何言ってるんだかわからん
668 :
nobodyさん :04/11/11 15:18:47 ID:tk5UM/xB
すみません。説明が下手で。
以下のようなことをWindows XP上でしたいのです。
できますか。
実行したら、例えばこの板のスレッド一覧
http://pc5.2ch.net/php/subback.html を読んで
インデックス/スレタイ/その時点での書き込み数
をCSVファイルに書き込むようなものです。
中でリンクから各スレを読んで
>>1 のハンドルも取得できればなおよいです。
LWP
671 :
nobodyさん :04/11/11 15:28:02 ID:riaohoTo
翻訳 perlプログラムをローカルPCで実行 ネット上のウェブページの情報を取得 いろんな処理 ローカルPCに保存 ってこときゃ?
672 :
671 :04/11/11 15:29:21 ID:riaohoTo
チョコ食ってる間に進んでた。 すまそ
673 :
nobodyさん :04/11/11 15:32:15 ID:R3WWGPIl
ウェブから入力された新しいユーザー名を、ユーザ名の入ったファイルを チェックして必要があれば弾いたり空いている場所に追加したり削除する CGIを作りたいのですが・・・・。 ユーザー名の入ったファイルを行入力演算子で配列に読み込んで、 それをいろいろやってから再び配列に戻して、最後に $i=0; while($i<=$count){ print FILE "$username[$i]\n"; $i++; } みたいに、改行して出力すれば次にCGIを呼び出したときに再び 行入力演算子で配列に読みこめるファイルが作成できるのでしょうか? 何度もやったのですが、どうしてもうまくファイルが作成できないのです。
>>671 そんな感じぢゃな。
perlプログラムをローカルPCで実行 → ActivePerl をゲットせよ
ネット上のページの情報を取得 → LWPの使い方を習得せよ
解読処理 → HTMLをパースする方法、正規表現とか HTML::Parser とかを習得せよ
CSVファイルに書き込む → まあ何とでもなるぢゃろう
>>672 その FILE とかいうファイルハンドラは
当然書き込みモードで open されとるんぢゃろうな?
>>668 perlスレなのでperlを覚えてください
676 :
673 :04/11/11 15:35:58 ID:R3WWGPIl
>>674 いえ、入力モードで開いて配列に読み込んで、
一旦閉じてから再び出力モードで開いてます
677 :
nobodyさん :04/11/11 15:46:34 ID:tk5UM/xB
>>671 >>674 ありがとうございます。
>>675 覚えてからできないのがわかったら悲惨ですから
先に確認したいと思いました。
じゃ勉強始めます。
スレタイ見るだけのスクリプトなら、手元にあるから、貼っといてやるよ。
スレの中身見るのは、自分で作りな。
use LWP::Simple;
$url = "
http://pc5.2ch.net/php/subback.html ";
@lines = split(/[\r\n]/, get($url));
foreach my $buf (@lines) {
if ($buf =~ /<base href="([^\"]+)"/){
$base_ref = $1;
last;
}
}
foreach $buf (@lines) {
if ($buf =~ /<a href="(\d+)\/l50">(\d+):(.*)\((\d+)\)/){
$thethread = $1;
$num = $2;
$title = $3;
$rescount = $4;
print "$thethread, $num, $title, $rescount\n";
}
}
レンタルサーバにてたまにcgiがCPU 90%を長時間(600hとか)使うことがあります。
このスクリプトの問題点を調べたいのですが、どのようにすればよい
かアドバイスを頂けたらと思います。
利用しているスクリプトは、余裕派掲示板です。
http://specters.net/cgipon/ バージョンは、2.62と、3.00 beta7を利用しておりどっちが
CPUを食っているかはまだわかりません。
そこまでCPUを使ってるのにkillしないサーバ屋もサーバ屋ですが、
とりあえず、他人の迷惑になるので調査したいのですが、とっかかり
がわかりません。
発生頻度は、1-2日に1回位起きてるのかもという位で、まだ
詳しくはわかりません。
よろしくお願いします。
>Perlのコーディングで困ってる人のスレです。
>>679 Devel::DProf
で調べると良いよ。
>>681 素晴らしいです。
#!/usr/bin/perl -d:DProf
にすれば良さげです。ちょっと仕掛けてみます。
ちょっといいか・・・? >レンタルサーバにてたまにcgiがCPU 90%を長時間(600hとか)使うことがあります。 600時間てあんた、一体何動かしてるんだ? ほぼ一ヶ月だぞ?
>>681 これ良いです
便利なものがあるもんですね
>>683 600minでした すまそ
一行ごとに解析できる Devel::SmallProf というのもあるらしい。
686 :
nobodyさん :04/11/11 21:11:26 ID:Z05OwTsM
@hogeに20行の文字列が入ってて、 それを指定した位置から指定した位置の複数文字([6]から[14]までの文字)を $hogeに入れるにはどうしたらよいですか?
for(i=6;i<=14;i++){ $hoge .= $hoge[$i]; }
688 :
nobodyさん :04/11/11 21:35:44 ID:Z05OwTsM
$hoge = join('', @hoge[6 .. 14]);
ずっと気になっているんですが、.= とは何ですか?行数をどう処理するものなんですか?
連結演算子
<textarea>で作った2行の文字から改行を取り除くにはどうすればよろしいでしょうか? $value =~ s/\n//;としてもだめでした。 perlバージョンは最新です。windows2000です
$value =~ s/\r\n//g;
>>692 Perlメモ
でググってから、もう一度来い
ありがとうございます。うまくできました。
>>690 $hoge .= $foo; と $hoge = $hoge . $foo; は同じ
>>692 漏れはどっちでも対応できるように $value =~ s/\r?\n//g; ってしてる。
>691>697 思い出しました、ありがとうございます
699 :
nobodyさん :04/11/12 09:07:08 ID:bxBJtrFy
$_ = "AAA_BBB ZZZZ-DDD_EEE/FFF."; のような文字列中からアルファベット三文字のリストを抜き出そうとしています。 my(@list) = $_ =~ /(?:^|[^A-Z])([A-Z]{3})[^A-Z]/g; foreach (@list) { print "$_\n"; } にしてみたのですが抜き出されるのは AAA,DDD,FFFの3つでAAA_のマッチのあとのBBBとDDD_のあとのEEEがとれません><
>>699 こいでいいじゃん。
while(s/[A-Z]{3}//) {
print $&, "\n";
}
>>699 これでどうよ?
my $t = "AAA_BBB ZZZZ-DDD_EEE/FFF.AAA";
my(@list) = $t =~ /(?:^|[^A-Z])([A-Z]{3})(?=[^A-Z]|$)/g;
foreach (@list) {print "$_\n";}
最後のAAAにマッチさせたくないのであれば|$の部分をカット
702 :
699 :04/11/12 16:58:54 ID:bxBJtrFy
701さんのでうまくいきました。 ありがとうございました。
パスの区切り文字が環境(OS)によっては / だったり、\ だったりするので 実行環境を判定して場合分けしようと思いましたが、定番の方法があれば教えてください。 一応、こんなことしか思いつかないのですが・・ $^X=~/exe$/i
705 :
703 :04/11/13 13:14:55 ID:???
>>704 なるほどわかりました。これが定番なんですね。
スマートな方法じゃないのでがっかりんこです。
>>703 my $os = $^O;
my $separator = '/';
if ($os =~ /^MSWin/i or $os =~ /^dos/i or $os =~ /^OS2/i){
$separator = '\\';
} elsif ($os =~ /^MacOS/i) {
$separator = ':';
}
でも構わないと思うけど。
# 手抜きするなら、/[:\/\\]/で区切るとか。
>>703 やりたいことをまずは書いたほうが解決は早いよ。
ディレクトリ部分を削除してファイル名のみにしたいとか。そんな感じじゃないの?
708 :
nobodyさん :04/11/13 17:15:37 ID:OROQk2Kk
ファイルハンドルがcloseされているのかされていないのかを明示的に調べる 方法はありますでしょうか?
はい
710 :
nobodyさん :04/11/13 17:49:37 ID:j/c/9VEE
フォームに記入してもらったメールアドレスにsendmailでメールを送信するCGIを組んで運用しているのですが、 infoseekのwebメールサービスで本文の文字化けが起きてしまいます。 例)あああああ → ?????????? ヘッダには以下のものを設定してあります。 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit ググってみたところ同じ問題を抱えているweb管理者さんがたくさんいることはわかったのですが 解決方法を見つけることはできませんでした。 文字化けさせない方法があったら教えてくださいませ。
charset="iso-2022-jp" で試してみそ
712 :
nobodyさん :04/11/13 19:12:30 ID:j/c/9VEE
>>711 レスありがとうございます。
実は以前は""で括っていました。
これが文字化けの原因かも?と思い現在は""を外しているわけですが
やはり文字化けしてしまっているという状況です。
この問題が解決できれば、多くのWeb管理者さんが助かることになると思います。
(もちろん私もですが…)
どうか皆さん、お知恵をお貸しください。
化けるメールと化けないメールのヘッダを比べてみたら?
714 :
nobodyさん :04/11/13 19:33:36 ID:j/c/9VEE
>>713 レスありがとうございます。
何度も見直しているのですが、PCのメーラから送ったものと特に違う箇所は無いのです。
(Received、Message-ID、X-Mailer等は抜かします)
Subjectは両方ともISO-2022-JPのBでエンコーディングして(されて)います。
Charset=iso-2022-jp ではダメか? とにかく化けたメールのヘッダを晒してみんしゃい
ごめん 710にかいてあった 鬱
自作のCGI(PHPのPEAR:Mailを使用)で、710と同じヘッダでInfoseek宛に メール送信してみたが、文字化けはしない。 710の使っているCGIとHTMLのソースを見たら、原因が分かるかも。
719 :
710 :04/11/13 20:07:15 ID:j/c/9VEE
>>717 あまり綺麗なソースではないので恥ずかしいのですが、よろしくお願いします。
xxxの箇所は伏せさせてください。
my $mailer = '/usr/sbin/sendmail';
my $mlfr= 'xxx@xxx';
my $mlto= '
[email protected] ';
my $mlsb= 'xxx';
my $mlmsg = "あああああ";
my $mlhd= "Reply-to: $mlfr" . "\n" . "MIME-Version: 1.0" . "\n" . "Content-Type: text/plain; charset=iso-2022-jp" . "\n" . "Content-Transfer-Encoding: 7bit" . "\n" . "From: $mlfr" . "\n" . "To: $mlto" . "\n" . "Subject: $mlsb" . "\n\n";
my $err = 0;
open( MAIL, "| $mailer -t -f'$mlfr'" ) or $err = 1;
if ( $err == 0 ) {
print MAIL $mlhd;
print MAIL $mlmsg;
print MAIL "\n";
close( MAIL );
}
なお、通常のメーラ、そしてyahooやhotmailなど他の無料メールサービスでは正常に表示されています。
$mlmsgはホントにiso-2022-jpか?
> my $mlmsg = "あああああ"; でエラー出てないから、送ってるコードはiso-2022-jpじゃ無いだろ。 コード変換しろ。
722 :
710 :04/11/13 21:17:27 ID:j/c/9VEE
>>720 鋭いご指摘ありがとうございます。
素晴らしく見事に見過ごしてました…orz
$mlmsgにコード変換かますことで解決しました。
皆さんありがとうございました。
- - - - - ここまで釣り - - - - -
>ググってみたところ同じ問題を抱えているweb管理者さんがたくさんいることはわかったのですが ...
| | │ /V\ J /◎;;;,;,,,,ヽ _ ム::::<,,゚ A゚>::| ジーーッ ヽツ.(ノ:::::::::.:::::::.:..|) ヾソ:::::::::::::::::.:ノ ` ー U'"U'
>この問題が解決できれば、多くのWeb管理者さんが助かることになると思います。 ...
727 :
710 :04/11/13 21:37:32 ID:???
>>727 その文字化けの注意点は
710が思ってる文字化けの問題ではないと思われる
>>710 my ($err);
my $mailer = '/usr/sbin/sendmail';
my $mlfr= 'xxx@xxx';
my $mlto= '
[email protected] ';
my $mlsb= 'xxx';
my $mlmsg = "あああああ";
my $mlhd= "Reply-to: $mlfr" . "\n" . "MIME-Version: 1.0" . "\n" . "Content-Type: text/plain; charset=iso-2022-jp" . "\n" . "Content-Transfer-Encoding: 7bit" . "\n" . "From: $mlfr" . "\n" . "To: $mlto" . "\n" . "Subject: $mlsb" . "\n\n";
if (open( MAIL, "| $mailer -t -f'$mlfr'" ))
{
print MAIL $mlhd;
print MAIL $mlmsg;
print MAIL "\n";
close( MAIL );
} else {
$err = 1;
}
関係ないけど、こんなのどう?
>>729 my $mlhdの行がイモ過ぎる。
書き直してやれよ。
my $mlhd=<<EOF; Reply-to: $mlfr MIME-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit From: $mlfr To: $mlto Subject: $mlsb EOF
メールの改行コードって ¥r¥n じゃなくていいんだっけ?
>>731 そのままprintしてもいいよね
print MAIL <<_EOF;
Reply-to: $mlfr
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
From: $mlfr
To: $mlto
Subject: $mlsb
_EOF
>>732 sendmailがよきにはからってくれるが、明示的に
print MAIL <<_EOF;
Reply-to: $mlfr\r
MIME-Version: 1.0\r
Content-Type: text/plain; charset=iso-2022-jp\r
Content-Transfer-Encoding: 7bit\r
From: $mlfr\r
To: $mlto\r
Subject: $mlsb\r
\r
_EOF
とする方が望ましい。
(;゚Д゚)
(my $mlhd = <<"EOF") =~ s/(?<!\r)\n|\r(?!\n)/\r\n/g; Reply-to: $mlfr ... EOF
737 :
nobodyさん :04/11/15 00:54:44 ID:Pp2G7AAw
ここで質問してよいのか迷ったのですが、もし不都合でしたら御指摘ください。 perlのスクリプト中で、あるURLのhtmlファイルを取得して、そのファイルの データを処理したいのですが、その取得方法がわかりません。 ぜひご教授お願いします。
>>703 遅レスだが、ポータビリティを重視するならFile::Spec
使ったほうがいいんじゃない?
ソートに関して…躓いています。 @data = ( 'あ,1,A', 'い,2,B', 'う,3,C', 'え,4,D', 'お,5,E', 'か,6,F', ); という例があったとして、これを数字でソートし、 さらに4にもっとも近い順からソートしたいのですが、これが上手くいきません。 方法があれば何卒教えて頂きたく思います。どうか宜しくお願いします。
こんなんじゃ? for(@data){ $data{$_}=abs(4 - (split(/,/,$_))[1]); } foreach (sort {$data{$a} <=> $data{$b}} keys %data){ print $_, "\n"; }
my @new = map{ $_->[1] }
sort{ $a->[0] <=> $b->[0] }
map{ [abs((split(/,/))[1]-4), $_] } @data;
--
# 数字は8桁以内
my @new = map{ substr($_, 8) }
sort{ $a cmp $b }
map{ pack('A8A*', abs((split(/,/))[1]-4), $_) } @data;
--
#
>>741 さんと同じハッシュ使用
my %temp = map{ $_ => abs((split(/,/))[1]-4) } @data;
my @new = sort{ $temp{$a} <=> $temp{$b} } keys %temp;
>map{ pack('A8A*', abs((split(/,/))[1]-4), $_) } @data; map{ sprintf('%08d%s', abs((split(/,/))[1]-4), $_) } @data; だね…。
すみません、便乗でいいですか? >740さんの例題をすこし弄って、 @data = ( '赤,あ,1,A,6', '青,い,2,B,5', '赤,う,3,C,4', '青,え,4,D,3', '赤,お,5,E,2', '青,か,6,F,1', ); これを>740さんの質問通り三つ目で四に最も近い数字でソートします。 この後が僕の質問なんですが、 これを更に一番目でソートし、最後に五番目でソート… というのは出来ますでしょうか? 具体的にはこんな感じでしょうか? @data = ( '青,え,4,D,3', '青,い,2,B,5', '青,か,6,F,1', '赤,う,3,C,4', '赤,お,5,E,2', '赤,あ,1,A,6', ); 一応、>741さんや>742さんの解答を参考に頑張ってみたんですが、 やっぱり上手くいきませんでした。 複雑だし無理かもしれませんがどうかお願いします。
sort { } の中身を工夫すればできる できなければ駱駝本を買って sort 関数のところを読め
746 :
nobodyさん :04/11/15 12:09:37 ID:44z8JY7I
jcode.pl v2.13 を使っているのですが、大量のバッチ処理をしていてふと 気付いたら、以下のようなメッセージが極々々まれに出てるのに気付きました。 Character in "C" format wrapped at [フルパス]/jcode.pl line 554. 行554には $s2e{$code} = pack('CC', $c1, $c2); とかかれているのですが、 恥ずかしながらなぜ警告(?)メッセージが出てるか自分でわかりません。 どなたか教えて頂けないでしょうか? (ネットで探してみましたがちょっとよく分からくて)
$c1と$c2の値がすでに文字列なんじゃないの。
>>746 とりあえず診断メッセージがわからないときはperldiag(1)を
見るのがいいと思うのだが。
Character in "C" format wrapped in pack
(W pack) You said
pack("C", $x)
where $x is either less than 0 or more than 255; the "C" format is
only for encoding native operating system characters (ASCII,
EBCDIC, and so on) and not for Unicode characters, so Perl behaved
as if you meant
pack("C", $x & 255)
If you actually want to pack Unicode codepoints, use the "U" format
instead.
749 :
nobodyさん :04/11/15 15:03:24 ID:44z8JY7I
>>748 ありがとうございます。英語力は全く無いのですが、
0〜255の範囲以外のが来てるのでエラーになっているのですね。色々試しています。
750 :
737 :04/11/15 21:26:40 ID:YvLIGcES
>>739 ありがとうございます。LWPを使ってうまくいきそうです
(何をやってるのか自分でまだ理解できてなかったりしますが・・・)
751 :
nobodyさん :04/11/15 22:45:40 ID:v6KPj5Kw
漠然とした質問で申し訳ないんですが、1000行程度の1対1対応のデータを 1回のプロセスで何度も検索する場合、あらかじめハッシュを作った方が速くなるのでしょうか? いまいちハッシュの性能というのが分からないのですが、検索キーをかえるたびに 1行目から値を探していくのと、ハッシュにキーを入れて値を得るのと、 ハッシュのほうが速そうな気がするんですが、やっぱり速いでしょうか?
>>751 case by caseとしか言いようが・・・
行という言葉を簡単に使ってるけども、
実際には行の切り出しという処理が入るわけだし、
それなら固定長でデータを扱う方が早いわけだし、
ハッシュというか位置インデックスを作れば固定長の呪縛が無くなるし、
というか何度も検索する必要があるのか?という根本的な疑問も残るし、
長くなったがオレの言いたいことはこれだね!
なんで試してみない?
>>752 実際二つ作ってみるのが早いですよね。めんどくさがって申し訳ないです。
組み合わせの検索をする感じなんですが、大体2500〜40000くらいの組み合わせから
条件に合うものをピックアップする感じで、やはりとにかく試すことにします。
ありがとうございました。
>>751 よくわからんが、もし言いたいことが
while($hairetsu[$index] ne $hikaku){ $index++; }
と
$index = $hash{$hikaku}
を比べたいのなら、後者の方が圧倒的に速い
755 :
751 :04/11/15 23:54:50 ID:???
>>754 バッチリそんな感じです。ハッシュの方から作ってみる事にします。
>>754 えーと。。whileつーのは。。やっぱりいいや。
意味せんとしていることは伝わってるみたいだし。
757 :
751 :04/11/16 00:18:23 ID:???
>>756 ああ読み違えました!のかな?
今必要としているのは、キーと値の両方で、キーはただの行数とかじゃなくって
ユニークなデータなので、while($hairetsu[$index] ne $hikaku){ $index++;}
の方だと無理なのかもしれません。ごめんなさいよく分かりません。
普通は、1000個もハッシュ作ってからindex検索するるより、 1000行ベタ検索した方が速い。30000行でもそうだったかな。
ごめん、30000行のはSQL+pnamazuとベタとの比較で、 そりゃDBのが速いが、pnamazuが介在してるからか、 たいして変わらなかった。QDBMあたりでやったらどう かな。こんどやってみるか。
1回しか検索しないなら要素がいくつだろうがリニアサーチの方が速いけど、 何回も検索するならソートしてから二分探索するかハッシュ作った方が全然速い。 要素が1000個でも。
>>760 1回の検索ではリニアサーチの方が速いんなら、何回やっても
リニアサーチの方が速いだろうが(プッ
1*n < 1.2*n、ほれ回数が多くなるほど差は広がる。
>>761 mod_perlなんかならハッシュだな。つまり、何回も検索する際、
perlを起動しなおさない。作ったハッシュをメモリに保存しとく。
あと、namazuとかsufaryとかindexファイルを別に作っておくとか
すれば、
>>760 でOK.
最初にハッシュを作るステップを抜きにすれば、 リニアサーチよりハッシュの方が速いということ?
みんな require 'ファイル'; って最初の方に読んじゃってますか? そのファイルが必要な処理がある直前(複数箇所)で requireしてるんだけど問題ありますかね? 複数箇所と行っても一回の起動では一箇所しか呼び出しません。
>>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;
768 :
762 :04/11/17 06:08:04 ID:???
ごめんなさい。質問を勘違いしてました。
質問内容は
・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 つっこんでごめん。
769 :
767 :04/11/17 07:36:26 ID:???
なんだ、
>>767 の方法ってPerlメモってところで既出だったのか・・・。
せっかくその場で考えたのに、空しいぜ。
よく読んで頭冷やしてくるか。
>>766 条件などで読むファイルを変えたいときは、
途中に書いたことはあったけどね・・・。
何でもないときは、先頭に書くのが基本でしょ。
そのプログラムが、どのファイルに依存しているかを明示しておけば、
後々運用管理するのに楽になるし。
Perlメモお世話になってます。
771 :
nobodyさん :04/11/17 18:32:44 ID:tQLRR4kH
同じファイルハンドル(この場合$fh)から別ファイルに続けて書き出そうとすると 何も出力できません。 open (OUT,"> test/$test"); while(<$fh>){ #$fhはファイルハンドルが入っている prin OUT $_; } close(OUT); という処理を繰り返し実行すると2つ目のファイルは なにも表示されません。 1回実行したあとファイルハンドル($fh)を表示してみましたが、 確かに指し示しているファイルは1回目と変わりません。 ファイルハンドルを書き出した後ファイルハンドルって どうなってしまうのでしょうか?
>>771 prin じゃなくて printだよね?
while は$_を操作しません。
773 :
771 :04/11/17 19:13:30 ID:tQLRR4kH
すいません。printです。 forでも同じでした。
774 :
771 :04/11/17 19:20:12 ID:tQLRR4kH
なんどもすいません。 できました。書き出す前にtellでファイルハンドルの場所を 取って来て、書いた後seekで戻す事によって解決しました。 お騒がせしました。
776 :
nobodyさん :04/11/17 19:38:43 ID:GNPvE3vb
htmlの部分とCGIの部分を分けてコーディングしたいです。 何かよいモジュールなどありませんでしょうか。
HTML::Template
779 :
質問です :04/11/18 01:55:30 ID: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で動かしてます。。
>OSはwindowsでapacheで動かしてます。。 DATもSTDOUTもbinmode()せにゃあかんのでは?
すいません。そのとおりでした。 ありがとうございます。 感謝感謝。
TO:[123] こんにちわ。 ↑のような文字列から数値部分(123)だけを取り出す場合、どう書くのがスマートでしょうか? TO:[数値] という書式は固定です。
$string =~/^TO:\[(\d+)\]/; $no = $1;
785 :
nobodyさん :04/11/18 13:06:46 ID:If69CbzI
s/"/"/g; 1 while s/<font([\s\w\=\#\"\'\+\-]+)>/<font$1>/i; 1 while s/<\/font>/<\/font>/i; これは"が"に変換されてるデータ($_)から"を"に戻し、 fontタグを有効にする処理ですが、これでは$_内の全ての"が"に戻ってしまいます。 しかし、"に戻す必要があるのはfontタグの"のみです。 最初にいきなりs/"/"/g;などとやらず、fontタグの"だけを"に戻す方法すにはどの様にすれば良いでしょうか?
すいません、書き直します・・・。;は全角です。 s/";/"/g; 1 while s/<font([\s\w\=\#\"\'\+\-]+)>/<font$1>/i; 1 while s/<\/font>/<\/font>/i; これは"が";に変換されてるデータ($_)から";を"に戻し、 fontタグを有効にする処理ですが、これでは$_内の全ての";が"に戻ってしまいます。 しかし、"に戻す必要があるのはfontタグの";のみです。 最初にいきなりs/";/"/g;などとやらず、fontタグの";だけを"に戻す方法すにはどの様にすれば良いでしょうか?
馬鹿ですいません・・・。&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;だけを"に戻す方法すにはどの様にすれば良いでしょうか?
stylesheetが使われる可能性も考えろよ
そもそもなんでFONTタグ内の " が " に変換されとるの?
>>789 説明不足ですいません。
BBSのログで、保存する時点ではタグに関わる記号&;<>は全てデコードしてあります。
で、読み出して表示する際に許可したタグのみ有効にする仕組みになってて、fontタグのみ有効にしてます。
>>790 × &;<>
○ &"<>
でした・・・。
792 :
789 :04/11/18 13:54:44 ID:???
だったら、<> の2種類だけをエンティティーコードに変換すりゃええやん。
s!(?<=<font)([^>]+)!my $s = $1 ; $s =~ s/"/\"/g ; $s!ieg ; こうかなあ。
すいません。色々悩んだ挙句、ログに記録する時点でダブルクォートは&quot;に変換しない って事にしました。
(´д`)
♥ → そのまま。 &hiroyuki; → &hiroyuki; みたいに実態参照が定義されていない場合のみ & をエスケープしようと思ったら、 定義されているやつを全部リストとかで持ってないとダメなんだろうか。 使えるモジュールとかありますか?
>>797 HTML::Entities
decode_entitiesに食わせて変化するか(定義されていれば変化する)
または、
%entity2charハッシュのキーにあれば定義されている
といったあたりでいけると思う。
>>794 なんで
>>793 のでうまくいかないんだ?
俺っちも考えたが、793と同じような形になったし。
もしかしてネタ?
>>798 ありがとう。うまくいってるようです。
でも借りてるサーバーには HTML:: が無いんだけど、まあコピーして置いとけば動くだろう。
>>799 すいません。<>も&lt;&gtに変換された状態なのを説明してませんでした。
<>のままの状態だと
>>793 さんので出来ました。
>>801 s!<(/?font\b.*?)>! (my $s=$1) =~ s/"/\x22/g; "<$s>" !egis;
ではどう?
<font **>と</font>の両方を < > も含めて戻せると思うんだけど。
>>802 ばっちり復元出来ました!すげー!
FONTタグで囲まれたデータ部分の&lt;&gt;&quot;はそのままで、
タグの記述部分だけちゃんと変換されてます。
ありがとうございました!
超初心者な質問です。 telnetモジュールを使用して、リモートコンピュータに接続してから、 ・screen起動 ・外部プログラム起動 ・CTRL-A d で[detached] という操作をperlで実行したいのです。 色々サイトを回って調べて、telnet接続まではできたのですが、 上記手順の「CTRL-A d で[detached]」で行き詰っております。 CTRL-Aという操作をperlのtelnetモジュールで行うには、 どういう記述をすればよいのでしょうか?
805 :
804 :04/11/19 10:44:06 ID:???
説明が悪かった気がします。 何でscreenを使用したいかというと、 webブラウザ上で、サーバのプログラムを起動させ、常駐させたいからです。 通常のデーモン(inetdなど)であれば、わざわざscreenなど使わなくても telnetモジュールで接続させ、コマンドを実行させればよいのですが 今回起動させたいプログラムは、バックグラウンドで動作してくれないため、 常にコンソールを開いておく必要があるのです。 なので、仮想的に常駐させるためにscreenを選んだというわけです。 当方、UNIX系OSに触れて1週間足らずなので、 「screenなんて使わなくても この方法でいいだろバカ」 という意見なども助かります。
806 :
nobodyさん :04/11/19 10:59:05 ID:n9OG7mgX
swfからcgiをたたいて、画像の縦横サイズを変更し、 swfに表示するということをやっております。 画像は正しくロードできるのですが、ファイルサイズが取得できず、 ローディング表示ができなくて困っています。 詳しく説明します。 まずswf内で _root.[object].loadMovie("hoge.cgi", "POST"); を使い、ロードの要求をします。 するとhoge.cgiでimageMagickというモジュールを使い、 縦横サイズを変更します。ここでPOST送信されている stageWとstageHとranはswfから送られてくる変数です。
807 :
806 :04/11/19 10:59:50 ID: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; ---
808 :
806 :04/11/19 11:00:52 ID:n9OG7mgX
つづき2です。 -- そして戻ってくる画像データをswf内にて getBytesLoaded()やgetBytesTotal()で調べています。 するとロードされたバイト数はしっかり取得できているのに 対し、総ファイルサイズはロード中はずっと0になっていて、 ロードが完了すると総ファイルサイズが表示されます。 OS FreeBSD perl 5.8.x Flash ver.6.0 どうか、よろしくお願いいたします。
ヘッダじゃない? Content-Length
$alldataが空じゃなく、$ENV{'CONTENT_LENGTH'}が空の状態で read STDIN,$alldata,$ENV{'CONTENT_LENGTH'}; を実行したら$alldataの中身は変わってませんでした。 原因はどこですか?
811 :
810 :04/11/19 14:33:50 ID:???
すいません、ちゃんと空でした。
右下じゃなくて右上でした
perlで変数を()でくくって宣言しているのをしばしば見かけるのですが、 ($tmp) = "hoge"; とか。 これは何の意味があるんでしょう?
>>816 その例ではまったく無意味かと
($foo, $bar) = @_;
とかやると
$foo = $_[0];
$bar = $_[1];
の効果が得られる。
多分書いた人の癖じゃないか?
>>817 レスありがとうございます。
某レスQのCGIにしばしば出現てて悩みました。()の中はスカラ変数が一つだけなんです。
実際は右辺はサブルーチンだったりするんですが、配列は戻ってこない。
($ret) = &getMessage("$filename$EXT");#戻り値は0か1
とか。
悩むのやめときます。
ていうかレスキューなんか参考にするのやめれ
820 :
804 :04/11/19 22:47:11 ID:???
>>814 レスありがとうございます。
/dev/nullについて調べて、実際に動かしてみました。
要するに出力をポイっとやるわけですよね?
末尾の2>&1は何でしょうか?色んなサイト調べてみましたが、
nullの動作に触れてるところばかりHITしたらしく。。orz
nohupもためさせてもらいました。
動作的にはscreenと似ているので、助かります。
しかし、nohupすると、私のUNKサバではかなり重くなってしまいます。。
出力を書き込んでいるからでしょうか?
あと、nohupや &での開始だと、telnetモジュールを切断させた後
ジョブをフォアグラウンドに復帰させる方法が見当つきません。。
我侭ばかりですいません。よろしくお願いします。
821 :
804 :04/11/19 22:50:33 ID:???
論点がPerlからズレてきているようなので、質問を訂正します。 割り込みキー入力(今回の場合はCTRL+A)を perlからコンピュータに送信する方法はあるのでしょうか? 板汚し申し訳ないorz
>>818 そうやっておくと、もし2つ以上の返り値があった場合に
最初の値だけ取って、残りを捨てるということができる。
安全策ってわけだな。
あまり誉められたものではないと思うけど。
>>821 試してないけど\x01送るんじゃ駄目?
だからさ、2つ以上の返り値があるのかどうかわかんなくなっちゃうでしょ
825 :
823 :04/11/19 23:20:43 ID:???
>>821 おっと2>&1についてもついでに答えるんだった・・・
「標準エラー出力を標準出力に纏める」という意味。
nohupが重くなる理由はmanに書いてあったぞ
> スケジューリング優先度は 5 増やされるので、
> 実行の割り当て時間はやや小さくなる。
そんなに大きく変わるかは知らないが
826 :
804 :04/11/20 00:21:15 ID:???
>>823 ,825
レスありがとうございます。
大変貴重な情報をいただきました。
若干板違いな質問にも丁寧に答えてくださって、感謝です。
質問です. ある, 改行コードが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"; } } どのようにしたらいいでしょうか?宜しくお願いします.
>>806 >>809 のContent-Lengthは、レスポンスの方だと思う。
print "Content-type: image/jpeg\n";
print "Content-length: $filesize\n\n";
で、$filesizeにjpegデータのサイズを入れておく。
(一旦テンポラリファイルを作らないとだめかも知れないけど)
windowsなら\nをさらに\r\nに直してくれる自動サービス付き バイナリモード binmode を参考に
>>822 contextによって返す値がかわる関数もあるし意味もなくカッコつける癖は
まねしない方がいいと思われ
>>821 screen使った事ないけど、man読んでみた限りでは、
-d -Dでいけるんじゃ?
それから、うに板の方が適切な質問じゃないかと。
for(@list) { ... } の中で現在の行番号を取得する良い方法はありませんか? $_ == $list[$hoge] になるような $hoge が知りたいのですが……。 カウンタ変数を新たに作るしかないんでしょうか。
834 :
806 :04/11/21 13:04:12 ID:Ewup0dSn
>829さん お力添え、ありがとうございます。 早速やってみます!!
>>833 for(0..$#list){
処理
}
>>835 希望の処理ができました。
ありがとうございます。
837 :
nobodyさん :04/11/21 18:47:52 ID:8gMC3V6h
perl+mysqlでカートを作りました。 一応入力チェック(サニタイジング)として、like演算子のワイルドカードである 「%」と「_」があったら削除してます。 よく考えたら「_」はメールアドレスとして普通に使われてる可能性があるんですよね。 そこで質問ですが、_これってlike演算子以外では安全ですよね? DBIのprepare時にプレースホルダを使用してるのですが、みなさんは_対策とかしてますか?
>>837 データを新規レコードとして挿入するだけなら問題ない。
まあlikeなんて挿入で使わないんだから気にするなよ。
839 :
nobodyさん :04/11/21 19:01:17 ID: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に 飛ばすようにしているのですが 話題の京ぽんを携帯用に飛ばしたいのですが出来ません。 ご教授ください。
>>837 プレースホルダつかってるなら勝手にエスケープしてくれるんじゃないの?
841 :
nobodyさん :04/11/21 19:48:30 ID:w/cY/u9z
>>841 urlのマッチングなんて探せばすぐ見つかるだろが
843 :
nobodyさん :04/11/21 20:07:53 ID:w/cY/u9z
どこが間違ってますか? 正規表現メモを参考にしたんですが。
846 :
841 :04/11/21 21:33:14 ID:???
確認してくれた方ありがとうございます。 正規表現事態は間違ってないみたいですね。 しかしなんでだろう・・
847 :
nobodyさん :04/11/21 22:26:23 ID: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サーバーの ファイルを読み込むのはあきらめなければならないということでしょうか?
>>847 ソケットが使えないようになってるならそもそも
返事すらもらえないはずなので、パスじゃねーの?
最初にすべきことは使えるかどうかの確認じゃないかと
>>847 パスが合ってる筈なのにって場合は、リクエストにHOSTも入れた方がいいかも知れんね。
851 :
839 :04/11/21 22:51:26 ID:ubTrO76H
京ぽんのuser agentをいろいろ設定しましたが どれもだめです。 そもそもの書き方を間違えているのでしょうか?
>>847 print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n";
>>851 京ぽんつーのが何なのか知らないが、elseの中でUA名を表示させてみれば
どういうUA名で分岐すればいいのか分かるのでは?
perlの掲示板に検索機能をつけようと思ってるのですが、ログが1投稿毎に別ファイルにしてあります。 いちいち1ファイルごとに読み込んでマッチ処理の繰り返しでは負荷的にも問題あるので、 データディレクトリでgrepかけて、該当したファイルのみ読み込みたいのですが、 perlでやるにはどうすればよいでしょう?
数値Aと数値Bを比較して大きい方を変数に代入したい場合、 最もシンプルな記述はどんな感じになりますか?
$hensu = $a > $b ? $a : $b;
>>854 >>1 【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
>>854 open(IN,"grep '$keyword' file|");#実際にgrepを実行する
って手があるが、鯖によってはgrepはダメかもしれない。
ファイル名の検索ならFile::findで一発なんだが・・・。
860 :
855 :04/11/22 01:31:38 ID:???
>856 ifで書くと長いので。 >857 多謝。
>>860 大きなお世話かもしれんが、最初のうちはif使ってたほうが良いぞ
>>859 ありがとうございます。
grepからの出力を拾う方向で実装してみます。
grep で子プロセス1個作るのも結構な負荷だぞ。 ファイルの数が多ければ grep の方が軽いが、 少ないなら perl の中でループ回す方が鯖にやさしい。 てのはコーディングというより負荷軽減スレにふさわしい話題だが。
864 :
856 :04/11/22 02:58:22 ID:???
>>860 最もシンプルに答えただけなんだが、理解できなかったみたいだな。
理解してるみたいだけど…?
"?"を使えって事だろ レスがシンプルなだけで要望には応えてないが
あのレスだけで理解できたらここで質問なんぞしない希ガス
868 :
nobodyさん :04/11/22 05:42:53 ID:/gdSyseW
>>847 >>852 >print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n";
hostを入れたら違う反応が返ってきて次のメッセージが表示されました。
HTTP/1.1 200 OK Date: Sun, 21 Nov 2004 20:36:26 GMT Server: Apache/1.3.27 (Unix) Last-Modified: Thu, 11 Nov 2004 02:34:45 GMT ETag: "718102-ddd-4192cfc5" Accept-Ranges: bytes Content-Length: 3549 Connection: close Content-Type: text/html
ただ、期待したトップページは相変わらず表示されませんでした。
このメッセージからソケットが使えるって判断できるでしょうか?
869 :
nobodyさん :04/11/22 06:30:29 ID:/gdSyseW
>>868 トップページにはフレームを使っているので、表示されないみたいです。
取得したいログファイルを指定したら、見事に表示されたので、ソケットは使えることは確認できました。
ただ、次の応答メッセージが頭にくっついてくるので、これを取得しないようにすることはできるでしょうか?
HTTP/1.1 200 OK Date: Sun, 21 Nov 2004 20:36:26 GMT Server: Apache/1.3.27 (Unix) Last-Modified: Thu, 11 Nov 2004 02:34:45 GMT ETag: "718102-ddd-4192cfc5" Accept-Ranges: bytes Content-Length: 3549 Connection: close Content-Type: text/html
>>869 ヘッダの最後は
CRLFCRLF(最低限LFLF)
になってるので、取得した後、そこまでカットすれば問題ないっしょ。
872 :
nobodyさん :04/11/22 07:20:47 ID:/gdSyseW
>>871 取得した後で加工してカットするということですか?できれば、取得時にカットしたいのですが、
不可能であれば、最終手段はそうするしかないですね。
>>872 <>で読むなら、空行が出るまで別の変数に入れておくとか、空読みするとか。
あと、socketとconnectのエラー処理をした方がいいよ。
LWP使ったほうが楽じゃないかと...
875 :
nobodyさん :04/11/22 10:28:03 ID:/gdSyseW
>print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n"; 素人考えで申し訳ないですが、GETのところでオプションなどをつけてその応答メッセージを 出さないようにすることってできないものですかね? HTTP/1.1 200 OK 〜〜text/html 取得したログファイルの内容〜 取得した内容は↑のようになっていて、応答メッセージと取得したログの間は半角スペースと なっています。 応答メッセージを取得時にカットできない場合、取得後にカットするわけですが、シンプルに カットするには、どういう方法があるでしょうか?perl初心者なもので、たびたびすみません。
>>859 初心者にセキュリティホールのある方法教えるな。クズ。
878 :
806 :04/11/22 11:50:53 ID:dylfkRdn
>829さん print "Content-type: image/jpeg\n"; print "Content-length: $filesize\n\n"; と書いてみました。swf側でファイルサイズを取得できて大喜びだったんですが、 jpg画像が途中から壊れて表示されるようになってしまいました。 >(一旦テンポラリファイルを作らないとだめかも知れないけど) すみません。調べてみたのですが、ちょっと意味が。。。
>>878 もしContent-lengthをつけただけでそうなったのなら、
$fileseizeの値がおかしい可能性が高いな。
880 :
806 :04/11/22 13:03:45 ID:dylfkRdn
>879さん レス、ありがとうございます! print "Content-type: image/jpeg\n"; print "Content-length: 100000\n\n"; とかやってみたのですが、やはり画像が壊れて表示されます。 (こんなことしてはいけないのかな。。。)
881 :
806 :04/11/22 13:14:51 ID:dylfkRdn
>879さん できました!! やはり値がうまく入っていないだけでした。 ただ ($width, $height, $filesize)= $i->Get('width', 'height', 'filesize'); と値をとっただけなのでリサイズ前のファイルサイズがとれているだけなのですが。 テンポラリファイルとは一度このファイルをtmp.jpgとかにしてそのファイルサイズを を測らなくてはならないという意味だったのでしょうか?
882 :
nobodyさん :04/11/22 14:04:38 ID:/gdSyseW
>>876 http://x68000.q-e-d.net/~68user/ x68userのページで、「HTTP クライアントを作ってみよう」という記事を見ましたが、
どうもヘッダを除いてボディだけを出力するというのはできなさそうに感じました。
LWPについてはx68userのページで一通り見ましたが、掲載されていないように
見受けられるので、いろいろ検索してそれらしい解説ページを見ましたが、
使用方法について内容の濃いページを見つけられませんでした。
一般的にどのサーバーにもLWPのモジュールが入っているのか?、当方のレンタル
サーバーでLWPは使えるのか?といった辺りからよくわかりません。
(見当違いなことを言っていたらごめんなさい。)
結局、ソケットでヘッダー(応答メッセージ)も含めてファイルを取得し、文字列操作
して、わざわざいらない部分を取り除かなければならないことになりそうです。
同じサーバーならopenしてファイルを参照できるのに、他サーバーのファイルを
参照するだけで、えらく苦労しています。
884 :
nobodyさん :04/11/22 14:30:16 ID:C0NQJmHQ
サーバーに新しいメールアカウント(例:abc)を作り そこに添付されてきた画像ファイルをCGIで読み込み メインアカウント(例:main)内にあるフォルダに保存させています。 読み込むCGIをgetmail.cgiとするとこれを手動で実行すると 問題なく動作するのですが crontabを用いて自動実行させると添付ファイルの保存がされません。 crontabによりgetmail.cgiは動作しているものの 保存のみがされないようです。 0-59/2 * * * * cd /home/sites/www.xxx.jp/web && /home/sites/www.xxx.jp/web/mailget.cgi で実行させています。 環境はRed Hat Linux 7.3 Apache 1.3.27 Sendmail 8.11.6 です。ちなみに、別のレンタルサーバー(FreeBSD)では動作していました。 原因がどこにあるのかご教授ください。
>同じサーバーならopenしてファイルを参照できるのに、他サーバーのファイルを >参照するだけで、えらく苦労しています。 いやそれはそういうモノだ Perlコーディング以前の「コンピュータが動くしくみ」とかいう次元の問題として
886 :
nobodyさん :04/11/22 14:54:17 ID:/gdSyseW
>>882 ひとまず、ご指摘の箇所を適用してヘッダーを読み飛ばし、ボディだけ抽出できました。
ありがとうございました。
>>877 じゃあ初心者にセキュリティホールの無いやり方を教えてみろクズ。
何も提案できない奴が偉そうな事抜かすな。
>>884 実行ユーザ名・使用するファイルのパミッション・使用する環境変数等々
チェックすることはいっぱいあるよ。
んでも、エラーを適切に処理してればどこでコケたか分かるでしょ?
>>887 初心者自体がセキュリティフォールです。はい。
ふぉーる
890 :
nobodyさん :04/11/22 16:04:25 ID:C0NQJmHQ
>>884 です。
>>888 さん、ありがとうございます。
色々チェックしましたがイマイチ解りません。
ブラウザから実行した場合は正常なのですが
crontabで自動実行した場合のみ保存がなされません。
調べたところ、添付ファイルの取り込みも問題ないようで
問題なのはopenして書き込む部分が実行されていないと言うことです。
ファイルの所有者とグループが違うのかと思ったのですが
これらは変更したりできるのでしょうか?
>>888 検索方法の話であって初心者云々関係ねーし。おまけにフォールだし。
子供達を責めないで(by デスラー)を思い出すな。
「私は子供に生まれないで良かったと、胸をなでおろしています!」っての。
>>888 は初心者に生まれないで良かった胸をなでおろしてるんだろうな。
次スレ案 【初心者は】Perlコーディング初心者質問スレ Part 39【セキュリティフォール】
#! c:/perl/bin/perl print "Content-type: text/plain\n\n"; print "Hello Perl !"; 今日からPerlをはじめまして、本どうりにこれを打ち込んで、表示さしてみると ファイルを開く、保存のダイアログボックスが表示されます。開くを押すと メモ張にHello Pealと表示されます、本ではブラウザ上に表示されると なっているのですが、違うCGIをためしてみるとちゃんとブラウザに表示されます。 本の付属のサンプルでやってもこれだけは、安心できる発信もとからの・・・ ファイルを開く 保存・・がでてブラウザに表示されません。これだけ なぜかこうなります。 無視して、これは飛ばして次のCGIからやったほうがいいのでしょうか? 原因がわかるかたぜひおしえてください。
>>887 とりあえず、$keywordをサニタイズするようにぐらい書いておけ
うーん、grepのシェル起動はやっぱマズイ気がするな。 $keywordが実行されないようにしないと。 バッククォートは確実に殺しとけ。
そもそもgrep使っても1ファイルずつひらいて舐めるのは かわらないのでperlの中だけで完結した場合に比べて 劇的に処理が軽くなるとはとは思えないのだが。
898 :
888 :04/11/22 16:58:04 ID:???
(((η)
| | (っ))) ヒャッホー! オレ様がスレタイに!!
| | //
|∧_∧ //
>>890 (´∀`*// cgiの実行ユーザ名でcrontab -eを実行してないのでは?
l / その場合ならパーミッション関係でエラーがでて
保存できないこともありうる。原因を探らないと。
open() 関数の戻り値が false だったら $! を表示させてみる、とかな
900 :
nobodyさん :04/11/22 17:51:31 ID:TZImgkmI
sendmail時のことで質問です。
subjectはちゃんとmimeエンコードしてるのですがfromに日本語を埋め込む時にも
mimeエンコードする必要がありますか?
JISでそのまま書いても駄目ですよね?
from: "送り先の人間の名前" <
[email protected] >
みたいになってますがどうすれば大方のメールソフトで問題なく動作するでしょうか?
>>887 クズのくせに威勢がいいな。
特別に教えてやろう安全なパイプの使い方だ。二度と初心者に穴コード教えるなよ。ヘッポコ。
$pid = open(IN, "-|");
if (!defined($pid)) {
die "cannot fork";
} elsif ($pid == 0) {
exec('grep', $keyword, 'file') || die 'grep';
}
>>900 MIMEエンコードすりゃいいだけだろ。何が聞きたいんだ?
>>894 .cgiファイル?
まあどっちにしろ
__END__を忘れてないか
あとどんな本だ?
>>894 ここはコーディングの質問スレなので、それ以前の方はお引き取りください。
904 :
nobodyさん :04/11/22 19:16:13 ID:4/apYG7/
>>901 そんなんで虚勢張られてもなぁ・・・
空しくならない?
後出しじゃんけん キタ━━━━(゚∀゚)━━━━ッ!!
っていうか悪意のある入力値のサニタイズとは関係ない気が。
外野だけど$keyword = quotemeta($keyword)じゃだめ?
バッククォートとシングルクォートだけで良いと思うけど。 ()もマズイか? いずれにせよ、パイプの使い方云々って話じゃなくて。
909 :
nobodyさん :04/11/23 01:23:12 ID:nMfYIywn
あのね、僕ちゃん達、何のためにサニタイズするの?
shが余計な解釈して、コマンド実行されると困るからでしょ。
>>901 の方法でパイプ使えばshは経由しないから、安全なの。
910 :
nobodyさん :04/11/23 02:23:51 ID:7PvclRNn
まぁまぁ、まぁまあ、 マーライオン , ―‐ 、 /r‐' ,ェェr‐..、 | l | ____Y)........ | l ヽ ┴‐┬'''''''''' ::::......... | l l `ー‐1 ::::::::....... 7レヘ! / ::::::::::::..... l |. | / :.:.:.:::::... /7ーー7777! :.:.:.:::::.... T--l⌒ヽ{ l :.:.:.:.::::::... |vv'レ⌒!'ー! :.:.:.:.::::::... |vv'ヽソー1 :.:.:.:.::::::. _ヽVVVー7__ :.:.:.:.:::::.. ,〜〜〜〜〜〜〜ヽ ヽ、 :.:.:.:.:.:..::.. ∠二二二二⌒二二二二二二ユ :.:.:.:.:.::::::...
>>881 出力するデータのサイズを出力しないとだめだよー。
>>894 ・IEを投げ捨てて他のブラウザを使う。
・おまじないとして最後に"/"を付ける。
・Windows XP SP2にして、IEをレスポンスヘッダに従うように設定する(できるらしい)。
・HTMLで出力する。
原因はIEの仕様。
894は拡張子がcglとかなんだってば
>>913 > ファイルを開く、保存のダイアログボックスが表示されます。開くを押すと
> メモ張にHello Pealと表示されます、
これから察するに、CGIとして動作していると思うが。
>>894 CGIとして動作しているのはたしかだが
ダイアログを出したくないんだったらこうしなされ。
x print "Content-type: text/plain\n\n";
o print "Content-type: text/html\n\n";
>>909 ポカーン。
$keyword に
; rm -rf *;
って入れると実行されちゃいますが?
死ねよキチガイ。
みんな冷静になって
>>894 を読んでみろよ。
print "Hello Perl !";
なのに「Hello Peal」って表示されるんだぞ。
Perl自体のバグでは?
919 :
nobodyさん :04/11/23 11:08:09 ID:nMfYIywn
>>916 顔真っ赤にして、嘘付くなよ。ヘッポコ
実験すれば実行されないことは簡単にばれちゃうのに、事実を捻じ曲げてまで絡んでくるとは
そんなに馬鹿にされたのが悔しいのかな?
でも、実際馬鹿なんだからしょうがない。親を恨んであきらめることだ。
$keyword=';rm -f *';
$pid = open(IN, "-|");
if (!defined($pid)) {
die "cannot fork";
} elsif ($pid == 0) {
exec('/bin/echo', $keyword, 'file') || die 'grep';
}
while(<IN>) {
print $_;
}
>>919 grepに失敗するだけでrm -rf は実行されるぞ低能
あとrm -rf *; だ。;が抜けてる。*fileだったらそんなファイルなけりゃ何も削除されん罠
922 :
nobodyさん :04/11/23 11:27:41 ID:nMfYIywn
>>920 やってから言えよ。ヘッポコ。行末の;を入れたって実行されねーよ。
破壊的な馬鹿だな。
気になったから試してみた
"test.pl" [New File] 12 lines, 213 characters [E]
[***@***** test]$ chmod +x test.pl
[***@***** test]$ ls
aaaa ahie aisjrioe iruiet test.pl*
[***@***** test]$ ./test.pl
;rm -f *; file
[***@***** test]$ ls
aaaa ahie aisjrioe iruiet test.pl*
コードは
>>919 に;いれた奴
>>916 は逃亡か?
perlは奴のようなヘッポコでもそれなりのコードをでっち上げる事が出来てしまうので、
「俺ってできるじゃん」と勘違いしてしまったのだろう。
勘違いして玉砕してしまった
>>916 に「伝説のヘッポコ」のコテを贈ろう。次からはこのコテで出て来い。ゲラゲラ
│ト、l、 /´, '`⌒'´ `ヽ: : . ヾヽ!lV/ / ,/ / ,' ハ、: . ,ィニ≧ゝレ' / / ,./ / , ハ : : . く<-‐7´ _」] l l/_,∠/ / / / い : : .  ̄ノ/: :f r'l l /レ'/、_/‐ト'、/l| li l : : : : . . : {ハ : :|{(l|y==ミ _ノ、/ソリ ll | : : : : : : : : :ヽヽ: :|、lハl、゙ ⌒ヾlノリ ll l : : : : : : : : : : : : : : V\ヽ、 `ー ゛ノルんイリノ : : : : : : : : : : : : : : : ,.--、_ハ`−r=ニ--、′ノ. : : : : : : : : : : : : : : : / /-ョロ'ヲ´ i l : : : : : : : : : : : : : : : : : 〈 ,ハフ'兀「 ! } : : : : : : : : : : : : : : : : : ヽ, ト{‐lハ. ヽ ' ノ : : : : : : : :
926 :
nobodyさん :04/11/23 13:14:57 ID:7PvclRNn
どうせここにいる連中は俺より低脳なんだから、 黙って頭下げて俺の靴でもなめてりゃいいんだよカスどもが(pgr
↑ 締め付けチカンビーム発射!!
928 :
nobodyさん :04/11/23 14:24:02 ID:nMfYIywn
その中で最下層に位置してるのが
>>916 である事は間違い無さそうだ。
おやおや、めずらしく荒れてますな。 そろそろ次スレの頃合かの。
初めまして。gzipに関する質問です。 gzipの利点は「負荷を削減する」「転送量を減らす」というのは分かりましたが、早さの面ではどうなりますか? 私としては、転送量を減らすので早くなりそうな気もしますが、ブラウザに解凍する処理をさせるので遅くなりそうな気もします。 ご回答を宜しくお願いします。
無名ハッシュに、ハッシュのスライスで値をセットしてそのリファレンスを 返すことを一度にやりたいんですけどできません。 どうやればいいのでしょうか?
PerlとPHPってどっちがいいですか?
ページ全体(例えばyahooのトップなど)を配列に取り込む方法はないでしょうか。 自分のサイトで他ページの情報を一部使いたいのです。
>>930 自鯖でやらせるんならええけど、レンタルでやったら怒られること間違い無しであろう。
2ch閉鎖みたいに転送量でゴルァされて初めて意味がある処理ではある。
935 :
930 :04/11/23 16:51:27 ID:???
>>934 >レンタルでやったら怒られること間違い無しであろう。
それは何故ですか?
>>931 無名ハッシュのリファレンスを得るなら、先に得ないと無理だと思う。
で、無名のハッシュのリファレンスを得て、ハッシュスライスに値を代入にしてみたけど。
use strict;
use Data::Dumper;
my @pos = qw(msn yahoo google);
my $value = 'search engine.';
my $hash_ref;
@{($hash_ref = {})}{@pos} = ($value) x @pos;
print Dumper($hash_ref);
>>935 回線の負荷は減らせるが、逆にサーバマシンの負荷は増大する。
938 :
930 :04/11/23 17:54:03 ID:???
>>937 そういうことだったんですか。。負荷状況を見ながら導入を検討したいと思います。ありがとうございました。
>>930 ,938
ブラウザの負荷はあまり気にしなくても良いよ。
低スペックのPCでISDNでも体感速度は速くなった。
もし、テーブルを使ったレイアウトをしているなら、
gzipよりもHTMLを変更した方が体感速度は速くなることが多い。
サーバー負荷が心配なら予め圧縮しておくと良いよ。
execでメタキャラクタを解釈させないようにすると。
でもこれじゃ
>>854 の言う「データディレクトリでgrepかけて、該当したファイルのみ読み込みたい」
ってのは無理だね。
結局、grepだって一つ一つファイル開くんだし スクリプト内で一つ一つ開いてやれ。たいして負荷かわらんってオチか。
楽にやりたけりゃFile::Searcher使えって話。
@aaa = (['a','b','c'],['A','B','C']); この['a','b','c']を@bbbに入れたいなんて場合はどうすればいいですか?
>>944 IEコンポーネントとか使わないと難しいんじゃない?
LWP云々の問題じゃないし
=@{$aaa[0]};
>>944 > LWPモジュールだと、テキストデータしか取得できないと思うのですが、
取れるだろ?
949 :
944 :04/11/24 17:31:19 ID:???
>> 948 画面のスクリーンショットを取得できるんですか? もう少しマニュアル読んでみます。
いや、
>>944 の言いたいことは、
HTMLレンダリングしたページイメージを取得したい、
という話らしい。
>>946 の言ってるとおり、それは LWP とか「取得」とかいう問題ではなく、
LWP で取ってきたデータをローカルでレンダリングするにはどうしたら、
という話になるわけだが。
必要なデータを渡すと gecko 使ってレンダリングして
Image::Magick オブジェクトを返してくれる、
とかいうモジュールがあるといろいろ便利そうではあるが、
かなり難しそうだわなあ。
html2[jpg,bmp,png,ps etc.] でググれば結構見つかるよね。 大体がブラウザにレンダリングをさせて画面をキャプチャーするタイプ。 他にも、Windows限定だけど web制作板のCSSでイケてるかも知れないデザインサイトスレで 使っているwebnailとか。
デスクトップ環境構築してるなら、数行のShellスクリプトで済むけど。 サーバー側で使うとなると、ちょっと敷居高いんじゃないかな。
あるディレクトリ内のファイル名一覧を取得する時って、 opendir,readdirかFile::Findかどちらを使うべきだろう。 1000ファイルほどあるんですが、パフォーマンス的には変わりませんかね? (ファイルは階層的に掘り下げる必要は無いんですが)
@array = ('aaa','bbb','ccc'); $key = 'bbb'; このような変数があるとして、$keyが@arrayの要素に存在するかどうかを 一発で判定する書き方って無いでしょうか?
(;゚Д゚)
いえ、ループとか制御構文使わないで、1行ですっきり判定する方法ないかなーと・・・
1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。
map使えば簡潔に書ける。と思うが。
ていうか連想配列でif($array{$key}){処理;}とかでいいじゃない。
>>956 my $count = grep{ $_ eq $key } @array;
# 中身はループだけどね。
最近CGI.pm使い始めたんだけど、もしかして重いですか? cgi-libでReadParseして%inを取り回してた方が負荷的にも鯖にやさしい?
さあ?ってか必要なのだけインポートしなよ。
CGI.pm は実際に呼び出された関数だけコンパイルする仕様なので、 import するかどうかはあんまり負荷に影響しない。 -compile :all とかするとさすがにアレだが。 俺も CGI.pm のコンパイルは若干重めだと思うが、 Template Kit や DBI の重さに比べれば誤差なので、 遠慮なく使っている。 それに mod_perl 環境下ではコンパイル負荷をほぼ無視できるしな。
Template Kit重いのかー。 ヒアドキュメントだらけでなんとかしたかったんだが、やめとくか。
掲示板で、データを順番に、任意のハッシュに入れたいのですが、 my @data_list = qw/name date com/; my %data = (); 〜〜 while (<FILE>) { my @temp = split(/<>/); $data{$data_list[$_]} = $temp[$_] for (0..$#data_list); print '名前:', $data{'name'}, $data{'date'}, $data{'com'}, '<br />'; } 現在はこのように一旦別の配列に格納してからループしてます。 split(/<>/) からストレートにハッシュに格納することは難しいでしょうか。
971 :
nobodyさん :04/11/26 08:28:36 ID:hJWQX2yr
質問させてください。 ActivePerl-5.8.4.810-MSWin32-x86.msi とwin2000を使っています。 my $Name_T = ''; $Name_T =~ s/([\x20(){},+^~%`])/{$1}/g; いろいろ試してこのような正規表現で以下の文字が$Nameに含まれている場合{}をつけて置換しようとしました。 (){},+^~%` とスペース +なまえ+ → {+}なまえ{+} %^なまえ^% → {%}{^}なまえ{^}{%} こんな感じです。始めは上手くいっていたのですが不具合をみつけました。 "タ"や"ミ"、全角の"+"などです。 "タ"や"ミ"は"ボ^}"と置換されていまい、全角の"+"は"+{}"と置換されてしまいます。 ご指摘、アドバイス等いただければ幸いです。
>>971 文字コードをEUCにして下さい。
SJISだと他にも同じような事がいっぱい起こります。
>>970 ハッシュのスライス使って
@data{@data_list} = split(/<>/);
あたりでどうすか?
974 :
970 :04/11/26 10:48:29 ID:???
>>973 ありがとうございます。無事考えていた処理ができました。
スライスというものを使えばいいのですね……知りませんでした。
975 :
971 :04/11/26 11:00:48 ID:???
>>972 ありがとうございます。
文字コードEUCについて調べてみます。
976 :
972 :04/11/26 13:09:04 ID:???
>>971 そういえばSJISでも、
s/\Q([\x20(){},+^~%`])\E/{$1}/g;
だったら大丈夫かも…。
まぁ、EUCにもしておいた方が無難。
977 :
nobodyさん :04/11/26 14:49:02 ID:eKQW3m7f
簡易なアンケート(書く人がフォームに文章を書いて、ボタンを押せばデータに文章が保存される) と言う事がしたくて教本を見ながらやっていたのですが #!/usr2/bin/perl BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } #ライブラリ require 'cgi-lib.pl'; #デコードするサブルーチン &ReadParse(*form); #ライブラリ require 'jcode.pl'; #文字コード変換のサブルーチン &jcode'convert(*form, 'sjis'); #連想配列から値だけを取り出し、区切りのハイフンを追加 $data="$form{'kansou'}\n\n-------\n\n"; #追加書き込みモード open(ENQ, ">>enquete.dat") || die "File 'enquete.dat' Open Error." flock(ENQ, 2); print ENQ $data; flock(ENQ, 8); close(ENQ); --以下HTML文-- これをサーバー上で実行すると 「syntax error at enquete.cgi line 21, near "flock" Execution of enquete.cgi aborted due to compilation errors.」 と言ったエラーが出ました。 教本についてたサンプルを使ってやっても同じエラーが出てしまうのですが…どこか間違っている部分がありますでしょうか? ググってもどれが参考になってるのかもよく分からず…お手数ですがご教授お願いいたしますm(_ _)m
さげ忘れ…すいませんorz
syntax error at enquete.cgi line 21 と出たときの8割は 20行目の行末のセミコロンを付け忘れている
>>977 21行目で構文エラーだって書いてあるんだから、どこがその
行か示せよ。そのコピペは20行ないからソースそのままじゃ
ないので意味ナシ。
おおかたopen 〜 || die 〜の行の最後にセミコロンがない
せいだとは思うがナ。
なんと…三十分も見落とし続けてた…お恥ずかしい●| ̄|_ 解決しました、ありがとうございましたorz
>>980 改行が多すぎると出たので改行も消してました。
重ね重ね申し訳ないorz
実行ステップ数は変わらない場合、1ソースよりも、ソース分割して必要に応じて requireしていく方が速いでしょうか?
use Benchmark;
実行ステップ数が変わらないんじゃたいして意味無いと思うぞ。 昔は、BBSのスクリプトとかで、表示、書き込み、検索でcgi自体を分けたりしてた頃もあったなぁ。 でも最近はベタ書きばかりだけど。 javaではしっかりモデリングするんだけど、言語によって人格変わる。
>>971 文字 x があり、x が'\x20(){},+^~%`'のいずれかであった場合、
xを'{}'で囲むということは、言い換えれば(\x7b x \x7d)という文字列を作るということです。
'+'は (\x81\x7b)で、\x7bは'{'なのでマッチし、
'{}'で囲って(\x81\x7b\x7b\x7d)になります。
(\x81\x7b)は'+'で、\x7bは'}'なので、'+{}'になります。
'タ'は(\x83\x5e)で\x5eは'^'なのでマッチし、
'{}'で囲って(\x83\x7b\x5e\x7d)になります。
'ミ'は(\x83\x7e)で\x7eは'~'なのでマッチし、
'{}'で囲って(\x83\x7b\x7e\x7d)になります。
(\x83\x7b)は'ボ'、\x5eは'^'、\x7eは'~'なので、
それぞれ'ボ^}'と'ボ~}'になります。
解決策は
use encoding "shiftjis";
です。
>>976 大丈夫ではありません。
次スレキボン
CGI.pmの場合、$query->param(hoge);とかでフォームからの入力データを参照できますが、 タグを無効にしたり文字コード変換したりしますよね? この場合、新たなハッシュテーブルなりに入れるか、$queryを直接書き換えるか、 どんな風にデータを取り回してますか? 私は色々変換した後に新たなハッシュテーブルに入れて、それを以降の処理で使うようにしてますが、 何だか領域が勿体無い気もします。
>>988 Perlスクリプトである以上、メモリを使うのはしょうがないよ。
掲示板のログをまるごと配列に入れるのは論外だけど、
通常の操作なら(・ε・)キニシナイ
cgi-lib使ってた頃は%inを直接いじってたので、CGI.pmに乗り換えた時に $queryから更に別領域にデータ確保するのは何となく抵抗あったな。 でもやっぱりデコードやらコード変換した後に別領域に入れてるよ。 気にスンナ。
($hoge) = split(/<>/) と $hoge = substr($_, 0, index($_, '<>') はどちらが効率が良いでしょうか。100回ぐらい繰り返します。
>>992 100回ぐらいならどっちでもいいと思うが気になるなら
ベンチ取れよ。$_がどういう文字列かにもよりそうでは
ある。
100回程度ならまず差は出ないだろう。気にするな、それがパールの世界だ。
ぱっと見、substrの方が最初の'<>'が見つかった時点で文字列サーチ 終わるから速そう。てことでベンチ。 use Benchmark; $s = 'foo<>baa'; timethese(undef, { split => sub { ($hoge) = split(/<>/, $s); }, substr => sub { $hoge = substr($s, 0, index($s, '<>')); }, }); てな感じで結果は Benchmark: running split, substr for at least 3 CPU seconds... split: 4 wallclock secs ( 3.21 usr + -0.01 sys = 3.20 CPU) @ 396900.00/s (n=1270080) substr: 2 wallclock secs ( 3.11 usr + -0.00 sys = 3.11 CPU) @ 1306832.15/s (n=4064248) 予想通りsubstr圧勝。
996 :
992 :04/11/27 18:32:47 ID:???
インタプリタが左辺の変数を数えて、splitはその分だけサーチするなんて事を やるとでも思ったか。
ベンチってオモロイから良くやるけど実用上意味が無い場合が多いな。