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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/11/26(日) 14:38:23ID:SlmGsFMB
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0111JAPU ◆lVJAPUTeX. 2006/11/30(木) 20:29:39ID:???
>>93

map はあるリストを元にして別のリストを作るために使います。
もちろん、map を利用しなくてもプログラムは書けますが、map を利用したほうがすっきりと書けることが多いのです。

@odds = (20, 16, 4, 8, 12);
print_odds(map { $_*2 } @odds);

@ids = qw[mami pelsia emi yumi];
@names = map { $userinfo{$_}{name} } @ids;

>>100

むしろ、strftime

>>101

多く起動される環境であれば、mod_perl, SpeedyCGI, FastCGI を検討するべきかと。

たしかに Encode は重いけど…
% /usr/bin/time perl -e ''
0.00 real 0.00 user 0.00 sys
% /usr/bin/time perl -MEncode -e ''
0.07 real 0.01 user 0.01 sys
Perl v5.8.1以降であれば、JcodeはEncodeのwrapperとして動作するので、Encode単体より重くなります。

>>102

open FH, "> ./ filename"; としても良いです。
0112nobodyさん2006/11/30(木) 21:31:15ID:???
COOKIEについて質問です。

今まで、COOKIEが有効かどうかって、
x.cgiでCOOKIEセット、y.cgiに飛ばす
y.cgiでCOOKIE読んで、書き込みできたかチェック
こんなことしてました。

COOKIEが有効か調べる関数ってありますでしょうか。
よろしくお願いします。
0113nobodyさん2006/11/30(木) 21:42:53ID:???
>>107
個人的な嗜好の問題だけど俺は前者の方が美しいと思う
0114nobodyさん2006/11/30(木) 22:28:40ID:???
ちょいと質問させてください。

my %func = (
'1'=>'\&hoge',
);

sub hoge
{
処理
}

$func{'1'}->();

ぐぐってみたらこれでhogeが実行できる
みたいなことが書いてあったんですが
ダメみたいなんすよ。
なぜかわかりませんかねぇ?
0115nobodyさん2006/11/30(木) 22:46:53ID:???
>>114
'1'=>\&hoge

の間違いでしょう? クォートしちゃダメ。
0116nobodyさん2006/11/30(木) 23:24:54ID:???
ありがとうございやす!動きました。
ぐぐって見つけたページもクォートなしでした。
いやはやお恥ずかしい。
0117nobodyさん2006/12/01(金) 01:14:03ID:???
明らかに文字列を受け取って文字列を返す関数にundef渡したとき、
戻り値はundefと0文字列のどっちが安全で親切なんだろうか。
ケース倍ケースかな。

0118nobodyさん2006/12/01(金) 02:08:36ID:???
お願いします。

sub aaa{
 my $select;
 foreach my $l(sort { $ir{$a} <=> $ir{$b} } keys %ir){
  $select .= qq|<option value="$count">$l</option>\n|;
 }
 return $select;
}
上記をCGIで動かすと
「Can't use "my $a" in sort comparison at ...」
というエラーがでます。どう改善したらよいのでしょうか...
環境は
windowsXPsp2
ActivPerl 5.8.7
です。
0119nobodyさん2006/12/01(金) 02:22:30ID:???
use strict;

my %ir = (
'kaede' => '大瀬 楓',
'mikitty' => '藤本 美貴',
'maasa' => '須藤 茉麻'
);

foreach my $l (sort { $a cmp $b } keys %ir){
  print "<option value=\"$l\">$ir{$l}</option>\n";
}

うちではエラー出ず。

で、ちょっと突っ込みを

key で sort 掛けようとしてるんですよね?
なのにデータで sort 書けちゃってますよ?
0120nobodyさん2006/12/01(金) 02:38:41ID:???
>>119
はい。
以下のようなハッシュを値でソートしたいと思いまして・・・。

%ir = (
"あああ" => 1,
"いいい" => 2,
"ううう" => 3,
"えええ" => 4,
"おおお" => 5,
"かかか" => 6,
"ききき" => 7
}

.pl単体では上手くテストで動いたんですけど、いざCGI用に
コピーするとエラーがでます(T_T)
0121nobodyさん2006/12/01(金) 03:20:08ID:???
>>118
$count はどっからでてきたの? パッケージ変数? $ir{$l} の間違いじゃない?
それに、『sort に渡してる関数の中で「my $a」とは書けません』ってエラーなんだから
実際の CGI ファイルのコードは違うんじゃないの? ちゃんと確認した?
0122nobodyさん2006/12/01(金) 08:18:39ID:???
>>111
> むしろ、strftime
POSIX::strftime か。しらなんだ、とんくす。
0123nobodyさん2006/12/01(金) 10:57:45ID:???
Shift_JIS 環境です。

CGI.pm の escapeHTML 関数を使うと、「規制」 が 「&#8249;K制」 (実際には、&と#は半角) になっちゃうんですが、
どうにかならないものでしょうか…。

これじゃあ、日本語を処理する上で実用性が無いので困っています。
01241232006/12/01(金) 11:01:25ID:???
というより、何故こんな風になるのかが知りたいです。

HTMLの特殊文字は↓ですよね。
< = 0x3C
> = 0x3E
& = 0x26
" = 0x22
' = 0x27

そして、問題となる "規" は、0x8B4B です。

特殊文字にあたるコード(16進レベル)が含まれていないので、
おかしくなる理由がないと思うのですが…。
0125nobodyさん2006/12/01(金) 11:10:09ID:???
>>123
CGI.pmを読めばわかるが、charsetがISO-8859-1かWINDOWS-1252のときに
その変換が行われるようになっていて、charsetは特に指定がなければISO-8859-1
だからほっとくとそうなる。CGI.pmのescapeHTML使うんならcharset設定すればよい
と思われる。あるいは別のを自分で書くなりどっかから探してくるなりして使うかだな。
0126nobodyさん2006/12/01(金) 11:16:18ID:???
データベース検索のCGIを作っているのですがサーバ負荷(CPU)が高くて困っています。
ファイル数は200個、容量は全部で40MB程のテキストファイルで、ファイル数と容量はだんだん増えていきそうです。
数回実行しただけで Load Average が 1.00 を超えるような状況で、このままじゃサイト閲覧者向けに公開できそうにないです。

データベースの構造はこんなこんな感じです。
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)

ちなみに、検索処理には index 関数を使っています。
ファイル内容は一回変数にいれるといったことはせずに、openでよみとって 1行ずつ検索して、おわったら閉じる。openでファイル開いて・・・ の繰り返しです。
負荷の原因と考えられるのはどこらへんでしょうか?

(1) 200個 のファイルを open 関数で開く処理。
(2) index関数での検索

ちなみに、必要なのは要素1と要素2だけ、しかも、完全一致でいいので、
split関数で要素毎に分割して == を使って等しければー、にしたほうが負荷は少なくなるもんなんでしょうか?

ある程度絞り込めれば実験でもいいんですが、
負荷関係に詳しい方がいたらお願いします。
01271232006/12/01(金) 11:21:25ID:???
>>125
回答ありがとうございます。

charset指定というのはどんな感じにやるもんなんでしょうか?

use Encode 風に指定して、

use CGI 'sjis';
use CGI 'shift_jis';

とかやってみましたが、駄目だったようですorz
0128nobodyさん2006/12/01(金) 11:31:17ID:???
>>121
sub aaa{
my $count = 1;
my $irselect;
foreach my $l(sort { $ir{$a} <=> $ir{$b} } keys %ir){
next if ($l == 99);#("99"=>"99")というデータを省く
$irselect .= qq|<option value="$count">$l</option>\n|;
 $count++;
}
print<<"_EOT";
.
.
<select>
$irselect
</select>
.
.
_EOT
}
こんな感じです。
一応並び順を考えない仕方で解決しました。
もう少し自分で調べてみます。ありがとうございました。
0129nobodyさん2006/12/01(金) 11:32:40ID:???
>>127
キーワード教えてもらったんだからマニュアルぐらい読めよ...

Provided that you have specified a character set of ISO-8859-1 (the
default), the standard HTML escaping rules will be used. The "<" char-
acter becomes "<", ">" becomes ">", "&" becomes "&", and the
quote character becomes """. In addition, the hexadecimal 0x8b
and 0x9b characters, which some browsers incorrectly interpret as the
left and right angle-bracket characters, are replaced by their numeric
character entities ("?" and "?"). If you manually change
the charset, either by calling the charset() method explicitly or by
passing a -charset argument to header(), then all characters will be
replaced by their numeric entities, since CGI.pm has no lookup table
for all the possible encodings.

charset()メソッドを使うか、header()に-charset引数を渡せばいいらしい。
01301232006/12/01(金) 11:35:16ID:???
>>129
ご親切にありがとうございます。
次からなるべくマニュアル読むようにします。

01311232006/12/01(金) 11:39:27ID:???
実際に使ってみたら解決しました。

$CGI->charset('Shift_JIS');

ありがとうございました。
01321262006/12/01(金) 11:43:37ID:???
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2306988 を参考に時間の計測をしてみたら、

全体で 1秒ちょっとだったのが、index関数の部分をコメントアウトしたら、
0.01秒ぐらいに…。

ここまで極端に分かるとはおもいませんでした
01331262006/12/01(金) 11:47:52ID:???
勘違いでしたorz
while (my $line = <IN>)
の部分もコメントアウトしてました。
これを外したら、0.6秒ぐらいに…。

膨大なデータを1行ずつ読み込む、ここが負荷のメインだったようです。

こうなると、namazuとか他の言語を使うぐらいしか負荷削減の方法はないですね。
0134nobodyさん2006/12/01(金) 11:49:40ID:???
>>126
毎回40MBあってこれからもどんどん増える予定のファイルを全部なめるのがそもそもだめ。
もう少しデータの持ち方を工夫した方がいいよ。バークレーDBぐらいはせめて使え。あるいは
インスコ面倒でなければまともなDB(mysqlとかpostgresとか)つかっちゃったほうが楽な気も
する。
01351262006/12/01(金) 11:54:15ID:???
>>134
なるほど
DB使ったほうがいいわけですか…
それは思いつきませんでした

実はこれフリーで配布されているCGIスクリプトのログファイルでして
過去ログも含めた検索をやりたいのでその検索スクリプトを自作していたとこなんです

ログファイルをHTML化して namazu かなんかで検索させるのとDB化、両方を検討してみます。
0136nobodyさん2006/12/01(金) 12:07:44ID:???
read(FH, $buff, (-s FH));

でログを読んだときは負荷減りませんか?
0137nobodyさん2006/12/01(金) 12:40:28ID:???
ファイルを全部読む時点で負けだろ
01381262006/12/01(金) 12:42:32ID:???
>>136
サンクスです。
読み込んだ時点の負荷は 1/3 〜 1/2 程度になりました。(でも1行ずつの処理を加えると同じかそれ以上になるかも…)

ただ、変数 $buff には全データが入っていることになるので、これを1行ずつ処理するときにどうすべきかが悩みます。
split 関数 で改行コードでの分割をして、配列にいれてから、while 関数で1行毎に処理したくなりますが、
これだとメモリ山ほど食いそうですし…。
0139nobodyさん2006/12/01(金) 13:28:54ID:???
>>126
>>134に禿同です。
検索対象が決まっているのなら、その元のデータから検索用のデータ(インデックス)を作るプログラムを作り、
定期的に保守をするのが楽です。この処理自体が多少重くても、バックグラウンドで1日数回で済むのなら
いいのではないかと。
インデックスデータは、DBMに持たせる(検索対象文字列をキーにする)のが一番効率がいいと思います。
プレーンテキストでも、元のデータを丸々スキャンするよりはるかにましです。
01401262006/12/01(金) 13:43:25ID:???
>>139
やはりその方法がベストですよね。
データベースの勉強をしてやってみようかと思います。
ありがとうございました。
0141nobodyさん2006/12/01(金) 14:04:00ID:???
正規表現で、エスケープをつけて表す文字は
+ * ? . ( ) [ ] { } | \
らしいのですが、/もですよね?
if($aaa =~ /\//)
とすれば望みどおりの動作をするのでこう思うのですが、間違ってますか?
0142nobodyさん2006/12/01(金) 14:26:10ID:???
/そのものじゃなくて区切り文字
当然要エスケープ
0143nobodyさん2006/12/01(金) 18:30:05ID:???
でも区切り文字変えたほうが読みやすいと思う
$hoge =~ m{/}
0144nobodyさん2006/12/01(金) 18:55:31ID:???
ttp://www.sk.aitai.ne.jp/~shim/Workshop/html/wlist.htm

ここの真ん中付近にあるリスト作成を使ってファイルを出力しようとしてるんですが、
出力ファイル先のカタカナのサ行などが文字化けしてしまいます。
jcode.pl を使えば直るんじゃないかと思っているのですが、どこに何を書き足せばいいのでしょうか?
0145nobodyさん2006/12/01(金) 18:58:33ID:???
スクリプト改造依頼スレへどうぞ
http://pc8.2ch.net/test/read.cgi/php/1157787046/
0146nobodyさん2006/12/01(金) 19:39:42ID:???
>>145
そんなに大変な事だったんですか。
どこかを書き足すだけで解決できると思ってたのですが、大変そうなので諦めます・・・。
申し訳ありませんでした。
0147nobodyさん2006/12/02(土) 00:17:21ID:???
<FORM action="xxx.cgi" method="POST">
<INPUT type="submit" value="送信">
</FORM>
これを送信ボタン押すとPOST形式で送信されると思いますが、
プログラムが自動でPOST送信する方法ありますでしょうか。

GET形式の場合は、"http://xxx/xxx.cgi?xxx=xxx";
wget すればよいでしょうか。

よろしくお願いします。
0148nobodyさん2006/12/02(土) 02:43:19ID:???
>>147
GETの場合そのとおり。「送信」はURL encodeしる。curl なら
curl -d xx=送信(URL ncodeしる) "http://xxx/xxx.cgi";
でPOSTできる。ってかここperlスレなんだが。
LWPでもできるよ。
0149nobodyさん2006/12/02(土) 08:58:16ID:???
>>147
LWPっていうモジュールがあったんですね。
こういうのが知りたかったんです。
ありがとうございました。
0150nobodyさん2006/12/02(土) 11:24:22ID:???
WindowsでCGIを作っています。
GDで日本語文字列を出力したいのですがうまくいきません。
現状、stringTTFメソッドでTrueTypeフォントのパスを指定してるのですが(WindowsのFontsフォルダ内)
エラーは出ないものの「・・・」といった出力にしかなりません。英数字でも同様です。
Winで画像出力の際にbinmodeを指定するような感じで
何かあるのかも、と思って調べてるのですが・・・
ちょっと漠然としていますが、チェックポイントなど気がついた方いましたら
おしえてください。よろしくおねがいします。
0151nobodyさん2006/12/02(土) 12:46:30ID:???
自作の関数で、エラーのときにエラーメッセージを返したいときに、
$@とか勝手に上書きしたらまずいですか?
#やってみたらできましたが・・
何か専用の特殊変数ってありますか?
0152nobodyさん2006/12/02(土) 13:03:38ID:???
$gErrStr のようなエラー用のグローバル変数を用意するか、

my $err = &testfunc(\$ret, \$val1, \$val2);

のように渡して、戻り値は \$ret へ入れて、エラーコードとこエラー文字列は $err に返す
といったことも出来る

エラー無しの場合は $err は undef であるか "" または 0 です。
0153nobodyさん2006/12/02(土) 13:23:08ID:???
どうもです。
関数はモジュール化したいので、自前のグローバル変数は使いたくないんですよねえ。
しかもオブジェクト指向にしたいんですが、returnでエラー返す以外に
定番の方法ってないですか?
0154nobodyさん2006/12/02(土) 13:29:26ID:???
エラーメッセージを取得するメソッドを定義するとか、Error.pm使う前提で例外に
しちゃうとか。
0155nobodyさん2006/12/02(土) 14:11:21ID:???
Perlはそんなに厳密にオブジェクト指向で書ける言語じゃないよ。そういうのが希望なら、RubyとかJavaやった方がいい。
0156nobodyさん2006/12/02(土) 14:25:39ID:???
うーん、どうしようかなー
0157nobodyさん2006/12/02(土) 14:27:33ID:???
>>153
結果をオブジェクトで返したらどうか
正常ならnew HogeResultして情報をそれに格納し、そのリファレンスを返す
エラーなら文字列を返す
受け取り側は
my $res = getHoge($foo);
if (ref $res) {
 # 成功
} elsif {
 # 失敗
}
0158nobodyさん2006/12/02(土) 14:41:08ID:???
ほほう、ref関数の使い方を初めて知った。
ありがとうございます・
0159nobodyさん2006/12/02(土) 16:25:39ID:???
いくら勉強しても次々に知らないことが出てくるんですが、
Perlをすべて把握している人って世の中にいるんでしょうか。
オライリーさん以外に。
0160nobodyさん2006/12/02(土) 16:41:38ID:???
そんなの誰もいないだろ。PerlコミュニティはLarryでも把握しきれない規模だろうから。
たとえばEncodeだけに限っても、メインのメンテナーのdankogai以外にも何人もかかわってる。
個人ですべてを把握するのは無理じゃないか?

# オライリーさんって誰? Tim O'Reillyのことか?
0161 ◆TWARamEjuA 2006/12/02(土) 18:48:07ID:???
オライリーオライリー♪
ワタシニ電話シテクダサイ ドーゾヨロシク♪
0162JAPU ◆lVJAPUTeX. 2006/12/02(土) 20:09:06ID:???
ごきげんよう。

>>112
ない。Cookieが読み込まれていない場合でも動作するように書くべし。(エラー出して終了でもいいけど。)

>>117
個人的には undef が好み。処理によっては結果的に空文字列を返すこともあるから、undef に統一しておいたほうが分かりやすい。

>>135
HTML化して、Googleに検索させる作戦もあり。自前でやる場合は他の方が書かれている通り。

>>141
迷ったら、記号類はとりあえず \ を前置しておけばOK。記号類 → \ をつけた場合、それがメタ文字であってもそうではなくてもその文字自身を表す。
英数字 → \ をつけた場合、メタ文字になる場合がある。

>>151
問題ない。やりたまえ。

>>151,154
多くのモジュールでは error みたいなメソッドを定義していますね。んで、そのメッセージを格納しておくにはグローバル変数を使っているわけですが。
グローバル変数 == 悪 というわけではないので、ホゲホゲ。外部から隠蔽したいなら、
{ my $ERRORMSG; sub _set_error { $ERRORMSG = "@_" } sub error { $ERRORMSG } }
こんな感じ? さらに、_set_error も隠蔽したいなら、
{ my $ERRORMSG; my $_set_error = sub { $ERRORMSG = "@_" }; sub error { $ERRORMSG } sub hoge { $_set_error->("hoge"); return undef; } }
0163nobodyさん2006/12/03(日) 01:37:01ID:???
連続投稿10秒規制を付けたいのですが
どのようにすれば良いでしょうか?

if(現在の時間 - 最終投稿時間 < 10秒)er{エラー}

このような感じでしたいのですが
最終投稿時間の取得はどのようにすれば良いでしょうか?
0164nobodyさん2006/12/03(日) 02:25:35ID:???
クッキーか、最新投稿100件ぐらいを別ファイルに保存
(クッキーが処理できない場合は投稿そのものを拒否)
0165nobodyさん2006/12/03(日) 02:49:58ID:???
>>163
いろいろ調べたんだね。えらいぞ。

これはぼくの想像だけど、恐らくは既存の何がしかの Web アプリケーションに機能追加しようとしているんだね。
そしてその機能は(恐らくは同一端末からの)投稿間隔が短くなりすぎないように制限したい、とそういうわけだ。
で、不明点が「最終投稿時間の取得」方法ということだけれど、「取得」というからには保存しているのだろうね。
「現在の時間」は恐らくアプリケーションが動作する機械のシステム時刻なので、そこから取ってくることができるけれど、あなたのアプリケーションにおける特定端末からの投稿履歴は、あなた以外に面倒を見てくれる人はいないはずなので保存しているはず。
保存の目的がそもそも「最終投稿時間の取得」なのであれば、そこから取り出す事も考えていたはずですよね。

あとはそのようにコードを書くだけだよ。がんばって。
0166nobodyさん2006/12/03(日) 03:31:47ID:???
>>163
セッション管理しているかどうかで変わってくる。
セッション管理不可な場合、IPアドレスで判断することになるかな。
単純にIPアドレスに対応するファイルを更新して、そのファイルのタイムスタンプと比較するのは簡単だね。
ただし、プロキシ経由のクライアントは一緒くたに判断されちゃうかな。

セッション管理してれば、セッションに関連づけて何らかの方法で更新時刻を保存するんだろうね。

なんか抽象的な答えだな。
色々やり方があると思うんだが、アプリケーションの要件用途で適切な道具は変わってくるからね。
0167nobodyさん2006/12/03(日) 08:01:07ID:???
>>165-166
とりあえず日本語の勉強だぜ?
01681512006/12/03(日) 10:08:46ID:???
$@でエラーを返す件、自己レス。evalで呼ぶときには
evalが正常時に$@を初期化してしまうので、呼び側で配慮が必要ですね。

sub hoge {$@ = 'hoge'; return}
eval '&hoge(); $gERROR = $@';
$@ and die;
print $gERROR if $gERROR;
0169nobodyさん2006/12/03(日) 17:00:34ID:???
>>150
文字コードをutf-8に
>>155
そうでもない
0170nobodyさん2006/12/03(日) 19:59:04ID:???
まあ自分一人でしか使わないんだったら御自由にってとこだが
>>168
呼び出し側に配慮が必要って時点で止めないか?普通。
お前さんが体感した通り $@ を書き換えるのはお行儀が悪いし呼出側に負担を強いる。
0171nobodyさん2006/12/03(日) 22:05:01ID:???
「ご自由に」と言って頂いている前提で反論しますが、
数件、代案を教えて頂いた限りで、「エラーは$@を参照してくれ」という
取り決めが一番呼び側の負担が少ない気がするのですが、どうでしょう。
$@はevalとバッティングするのでevalの場合のみ168のように書かなければ
ならないことは、もし説明がなかったとしても自明なことのように思います。
ほかに$@を使うデメリットってあるでしょうか。
0172nobodyさん2006/12/03(日) 22:15:17ID:???
あ、ref関数を参照させるのは行儀もよく、負担も少ないかも知れないとは思います。
だったらそうしろよ、って話なのですが、本当にそれでいいのか、検討しているところです。
0173nobodyさん2006/12/04(月) 00:26:50ID:???
>>171
本当に「エラー」ならば Carp or wanings ( $SIG{__WARN__} ) に任せれば?
もしくは誰かがレスした Error.pm
単なる「制御上のメッセージ 」を返したいならば戻り値を下みたいな
ref にしちまえばいいだけじゃねーの?
return { 'data' => undef, 'msg' => 'お前さんの望んだメッセージ' } ;

$@ に関するルールを変更してまで $@ を参照させるってのは傲岸に
感じる。上の例で云うと前者には用意がされてるわけだし、後者は
エラーですらない。
CPAN でそんなモジュールに当った事がないがそういうモジュール
に当ったら、別モジュールを探すなあ。
そういうモジュールがあったら後学のために教えてください。
0174nobodyさん2006/12/04(月) 00:33:59ID:???
eval で catch したいなら素直に die したらいいじゃない。
死にたくないなら生きればいいじゃない。
0175nobodyさん2006/12/04(月) 16:55:58ID:???
HTMLで、フレーム表示させたいんですが、
どういうふうにすればよいのでしょうか?

index.htm(フレームについて書いたページ)
^^^^^^^^^^|^^^^^^^^^^^^^^^^^^^^|
メニュー | メインページ   |
menu.htm | main.htm     |
     |          |
     |          |
     |          |
     |          |
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

普通一ページだけだったら、
print <<"HTML"
<html>
・・・
</html>
HTML
ですよね。

print <<"HTML"
#indexを書く
HTML
print <<"HTML"
#menuを書く
HTML
print <<"HTML"
#mainを書く
HTML
これだけで、OKでしょうか?
よろしくお願いします。
0176nobodyさん2006/12/04(月) 17:08:08ID:???
>>175
それぞれのxx.htmに対応するcgiを用意する。
複数用意するか、なんかパラメタ与えて動作を
切り替えるかはお好みで。

クライアントからは別々にリクエストが来るので、
情報をひきつぎたければそれもパラメタで引き継ぐ
とかセッション使うとかいろいろ必要。

たぶん質問の仕方からいってこの辺の仕組みは
すぐには理解できないと思うので地道に勉強して
くれ。
0177nobodyさん2006/12/04(月) 17:27:59ID:???
つか、フレームは時代遅れ
0178nobodyさん2006/12/04(月) 17:52:25ID:???
>>176
ありがとうございます。
ちょっとずつ勉強してみます。

>>177
なるほどぉ。
フレーム使わない方法もありますね。
0179nobodyさん2006/12/04(月) 18:23:52ID:???
フレームはstrictじゃないから使わないほうがいい
0180nobodyさん2006/12/04(月) 18:24:06ID:???
>>178
で、いつ Perl の話になるんだ?ならないんだったらスレ違いだから。
0181nobodyさん2006/12/04(月) 21:26:59ID:???
こっちで、質問していいのかわかりませんが
ActivePerl Build 819 MSWin32
には、HTML埋め込み型のaspl(C:\Perl\eg\PerlEx\examples.aspl)とか
あるんですが

Apache(Linux系)とかでも、埋め込み型で動かせるのって
なかったでしょうか?
昔に、そんなのがあった気がするんですが
名前が思い出せなくて
01821812006/12/04(月) 21:29:45ID:???
すみません
思い出しました。
Embperlとかでした
0183nobodyさん2006/12/05(火) 00:10:37ID:???
$str = "AoUDqGrsqcUSgVGsCphafNXhkEtsfCcANeLDsTFq";
$str =~ s/[C-G][pqst]/1-9/g;
print $str;

置き換えたところ1から9と順に置きかえたいのですが
置き換えた部分すべて1-9と表示されてしまいます。
どの部分を変えればよいのでしょうか??
0184nobodyさん2006/12/05(火) 00:35:41ID:???
>>183
これがお望みのものか?

$str = "AoUDqGrsqcUSgVGsCphafNXhkEtsfCcANeLDsTFq";
$cnt = 1 ;
$str =〜 s/[C-G][pqst]/$cnt ++/eg ;
print $str . "\n" ;
01851832006/12/05(火) 00:43:04ID:???
>>184
すっげぇ簡単ですね・・・できない自分にショックです。
教えてくれてありがとうございます。
0186nobodyさん2006/12/05(火) 01:58:21ID:???
正規表現中でインクリメントって出来るのか
知らなかった (;゚Д゚)
0187nobodyさん2006/12/05(火) 02:21:49ID:???
まあPerlの正規表現に慣れると、PHPのpreg_なんとかって、てんでウンコだね。
0188nobodyさん2006/12/05(火) 02:23:05ID:???
画像を連続で出力する時、以下の場合だと画像名が同一で
後から送られてきた画像が上書きされてしまいます。

binmode(STDIN);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'} );

print "Content-type: image/jpg\n\n";
open(IMG,">sample.jpg");
binmode(IMG);
print IMG $buffer;
close(IMG);

これを No1.jpg No2.jpg・・・のように連番で保存させたいのですが
どこを変えればいいのでしょうか?
よろしくお願いします。
0189nobodyさん2006/12/05(火) 04:54:50ID:???
初めてのperlの練習問題で、引数で指定したファイルの
最後の行から順番に表示するってのがあって、答えは納得できたのですが
↓でうまくいくのが、foreachをwhileにするとうまくいかない理由がわかりません
reverseがなければwhileでもエラー出ないのですが・・・
何故なんでしょうか?よろしくお願いします

foreach (reverse <>) {
chomp;
print "$_\n";
}
0190nobodyさん2006/12/05(火) 12:05:35ID:???
>>189
それ、あなたの期待する $_ もしくは @_ への代入が実行されてない。
以下が機能しないのと同じこと。
reverse 'foo' ;
print $_ . "\n" ;
print @_ . "\n" ;

reverse 関数は単独使用時に「左辺が指定されてなかったら $_ or @_ に代入する」
なんて機能を持ってない(つーか勝手にコンテキストの判断してもらっても困るw)。
foreach VAR ( LIST) BLOCK の場合は () 内のリストを暗黙の内に一個一個 $_ に
入れてくれるけど while ( EXPR ) BLOCK は、そんな器用なことはしてくれない。
() 内に条件式を必要とするだけ。
while ( <> ){ } は、あくまでも while ( defined ( $_ = <> ) ) { } の省略。

foreach と同一結果を得たければ、やはり一旦配列に突っ込むのが正攻法
@foo = reverse <> ;
while ( defined ( $_ = shift @foo ) ){ print $_ ; }

以下は見た目、正解っぽく感じるかも知れないが当然ダメ。
while ( defined ( $_ = reverse <> ) ){ print $_ ; }
別のお話しになってしまうので説明割愛。
0191nobodyさん2006/12/06(水) 00:09:51ID:???
>>186
> 正規表現中でインクリメントって出来るのか
> 知らなかった (;゚Д゚)

s/// 式の右部分は正規表現じゃないということも知らなかったんだね。ふぁいと。
0192nobodyさん2006/12/06(水) 00:57:09ID:???
…言われて見ればそうだね・・・orz
01931892006/12/06(水) 05:32:50ID:???
>>190
ありがとうございました
同じように使われることはあるけど
そもそも機能がかなり違うのですね
勉強になりました
0194nobodyさん2006/12/06(水) 17:53:32ID:???
$a = "1167354687","3546879867321","735246;
1 while $a =~ s/(.*\d)(\d\d\d)/$1,$2/;

配列の最初の部分しか出力されないのですがどうしたらよいでしょう?
0195nobodyさん2006/12/06(水) 18:14:05ID:???
配列について勉強し直してはどうかな。
0196nobodyさん2006/12/06(水) 19:17:48ID:???
>>191-192
わかってると思うけど、式が評価されるのは /e オプションの効果です。
ただ単に右部分に式書いても評価されないので注意。

>>194
まず書いたスクリプトが動くかどうか確かめましょう。
0197nobodyさん2006/12/06(水) 23:57:05ID:???
ブラウザ上で更新したcsvファイルを
即時別のサーバーへftp接続してアップロードしたいと思っています。
サーバーにNet::FTPをインストールすることができない状況で可能ですか?
良い手があれば教えてください。
サーバーのOSはSolaris9、CGIバージョンは5.8.8です
0198nobodyさん2006/12/07(木) 00:53:15ID:???
flockについて質問です。

x.cgiを
open(OUT,"+<$file") ;
flock(OUT, 2);
@data = <OUT>;
#close(OUT); closeしません。

ブラウザでx.cgiをcloseしないで処理終わりました。
違うブラウザでx.cgiを実行したんですが、flockで止まりませんでした。

x.cgiのプロセスが終わると、flockはcloseしなくても
解除されるんでしょうか?
ループとかさせて、プロセスが生きてたりすると
x.cgiのflockで止まりますか?

よろしくお願いします。
0199nobodyさん2006/12/07(木) 01:38:36ID:???
プロセスがexitする時、全てのファイルはcloseされる。
0200nobodyさん2006/12/07(木) 01:41:43ID:???
プロセスが死ねばロックも解除されます
で、flockはアドバイザリなのでflockを使ってないプログラムなどからは問答無用で読み書きできます
0201nobodyさん2006/12/07(木) 07:35:05ID:???
たとえプロセスが死んでなくても再びopenされるときにcloseされます
0202nobodyさん2006/12/07(木) 11:11:15ID:SekHzZx8
shift JISのページに設置したテキストボックスのボタンを押すと、euc-jpのページ
で使われている検索エンジンにジャンプし検索結果を表示したく思います。
今のままですと、文字化けが起きてしまいます。

(HTMLソース)
<form method="POST" action="http://www.hogehoge.co.jp/cgi-bin/search/"; target="_blank">
<input type="text" name=textdata size="20">
<input type="submit" name=botan value="Search">
</form>


文字化けがしないようperlプログラムをかませて、shift JISに変換してから変換させたい
のですが、どのようなコードを書いたらよいでしょうか?
0203nobodyさん2006/12/07(木) 11:26:48ID:???
Encodeで変換後にURLエンコードしてリダイレクトが簡単かと思う
0204nobodyさん2006/12/07(木) 11:27:17ID:???
テンプレぐらいは読みましょう
こっちのスレのほうがオススメ
http://pc8.2ch.net/test/read.cgi/php/1145308869/
0205nobodyさん2006/12/07(木) 12:06:04ID:???
>>203-204
ありがとうございます。
0206nobodyさん2006/12/07(木) 16:35:47ID:???
>>200
そうなのか。
それは知らなかった…。

質問なのですが、

・Perl で flock したファイルを php で読み書き。
・php で flock したファイルを perl で読み書き。
・test1.cgi で flock したファイルを test2.cgi で読み書き。

この場合って、正常にロックはされるのでしょうか。
0207nobodyさん2006/12/07(木) 16:40:00ID:???
>>206
flockがちゃんと動作する環境で正しくプログラムかけば。
02082062006/12/07(木) 16:53:51ID:???
>>207
なるほど
私はflockがちゃんと動作する環境で正しくプログラミングしていると思われるので大丈夫ですねb

安心致しました^^
0209nobodyさん2006/12/07(木) 18:20:59ID:???
>>199
>>200
>>201
お礼遅れました。
flockわかりました。
ありがとうございました。
0210nobodyさん2006/12/07(木) 20:53:15ID:???
WindowsXP上でコマンドプロンプトを作業ディレクトリの指定なしに起動させて、
プロンプトに最初から C:\DOCUME~1\user\デスク~1> となっているときに
perl -MCwd -e "print cwd"
とすると、C:/DOCUME~1/user/デスク~1 を返すのですが、
C:\DOCUME~1\user\デスク~1> cd "C:\Documents and Settings\user\デスクトップ"
C:\Documents and Settings\user\デスクトップ> perl -MCwd -e "print cwd"
とすると、C:/Documents and Settings/user/デスクトップ を返してしまいます。
これを、常に C:/DOCUME~1/user/デスク~1 を返して欲しいのです。
どなたかご存じでしょうか。
■ このスレッドは過去ログ倉庫に格納されています