初めて来た方、初心者はまずこのスレッドから始めよう。
尋ねる前に同じ質問がないかこのスレや旧スレ、及び
>>2 のリンクを一通り見てみよう。
案外答えはもう書かれているかもしれない。
3 :
名無しさん@お腹いっぱい。 :2001/05/03(木) 22:32 ID:HAK5ITOE
age
鯖移転したのかな? 本当にPart5はここでいいのかな? 最近はトップページ(インデクス)見てないからわからな〜い(はあと
5 :
名無しさん@お腹いっぱい。 :2001/05/05(土) 16:42 ID:xlcP2XLA
小数点の含まれる引き算を行なうと、たまに0.000000000000001の 誤差が出ることがあります。 10.45-9.55の答えが0.899999999999999とかになるのですが、 どなたかこの現象の原因と解決法をご存知ないでしょうか?
>>5 いい所に気がついた。
長くなるので原因については割愛。
解決法は幾つかあるが、簡単なのは(s)printfだな。
printf '%.2f', 10.45 - 9.55;
$d = sprintf '%.2f', 10.45 - 9.55;
print $d;
>>6 カコイイ。。。
有能な回答者はコテハン化きぼーん!
8 :
5 :2001/05/05(土) 23:02 ID:???
>>6 ありがとうございます。
とりあえずなんとかなりました。
後学の為に原因も知っておきたいのですが
どこかにそれを記載している場所などを
ご存知でしたら教えていただけないでしょうか?
重ねての質問申し訳ありません。
10 :
6 :2001/05/06(日) 00:23 ID:???
>>8 原因を一言でいうと「Perlの内部では数値は文字列として格納されているわけではない」って事だな。
変数に型のある言語(Cなど)を扱っていれば理解しやすいし、教えやすいのだろうが
あいにくPerlオンリーな俺に分かりやすく詳しい説明は無理だ。スマソ。
だが「後学の為に知っておきたい」という意欲があるのならラクダ本でも買ってみたらどうだろうか。
浮動小数点数の精度については少ししか載っていないが、損はしないと思うぞ。
代わりといっちゃなんだが
>>5 の別の方法
>>6 の他に標準モジュールのMath::BigFloatを使うという手がある。
これなら精度は無限だ。
#!/usr/bin/perl
use Math::BigFloat;
$a = Math::BigFloat->new(10.45);
$b = Math::BigFloat->new(9.55);
$c = Math::BigFloat->new('0.123456789');#小数点以下が長い場合は文字列としてnewに渡す
print $a - $b, "\n"; #".9"
print $a + $b + $c. "\n"; #"20.123456789"
__END__
>>7 ヘタレをおだてないでくれ(w;
コテハンはJapuさんや_gunzipさんくらいにならんとな・・・。
11 :
5 :2001/05/06(日) 02:03 ID:???
>>10 丁寧な解説ありがとうございます。
ラクダ本に載っているのは知りませんでした。
まだ途中までしか読めていないので。
これから頑張って続きを読んでいきたいと思います。
本当にありがとうございました。
12 :
名無しさん@お腹いっぱい。 :2001/05/08(火) 15:31 ID:Ngqkrj.g
すいません、教えてください 入力フォームからデータを受け取ってPostgreSQLにデータを渡す際に日本語は 文字化けしてしまいます。 どのようにしたらいいのでしょうか?
14 :
nanasy :2001/05/08(火) 16:24 ID:MgnUxoZo
連想配列のサイズの制限は? いまは、なんでもかんでも連想配列に放り込んでいる(だって、便利だもん)んだけど、 将来的には、データサイズが大きくなりすぎたら、自動的にSQLのDBとかを叩く、みたいな 仕様を考えてます。 で、質問。 連想配列(にかぎらず、PERLの変数全般)に、サイズのリミットをかけることは 可能ですか? # 心配しなくても、仮想記憶が解決してくれるよ、ってのはナシ。
>>14 サイズ=キーの数って意味なら
擬似ハッシュというものがある。
通常のハッシュより遅いけどな。
データサイズが大きくなりすぎて困るってのなら
DB_Fileを使うという手もあるぞ。
追記 Perlの変数にサイズを設ける事は、可能。 tie()を調べよ。
17 :
12 :2001/05/08(火) 17:07 ID:Ngqkrj.g
フォームからの入力を受け取る ↓ EUCに変換 ↓ insert into * values (hoge,hoge2); ↓ (゚д゚)ダメダコリャ という感じなのですが
>>17 その文から想像するに
#--
$query = $ENV{QUERY_STRING}
or
read STDIN, $query, $ENV{CONTENT_LENGTH};
$query = Jcode->new($query)->euc;
#--
とでもやってるのか?
そりゃダメだわ(藁
表示は文字コード何? フォーム(Shift_JIS) ↓ EUC-JPに変換 ↓ DBに入れる ↓ 表示(Shift_JIS) とかDBから表示の際に文字コード変換してないとか言うオチじゃない? もしくは半角カナ入れてるとか。
20 :
12 :2001/05/08(火) 18:13 ID:Ngqkrj.g
21 :
名無しさん@お腹いっぱい。 :2001/05/13(日) 12:01 ID:/ewKYqPQ
どなたか教えてください。 yomikomi.txtというテキストファイルにデータが 一行に一つずつ入っています。何個データが入ってるか判りません。 それを配列に入れて、とりあえずランダムで要素を一つだけ選びました。(kazu1) もう一つ配列の中からランダムで選びたいです。 ただし、先に選んだkazu1以外の要素にしたいです。(kazu2) ↓のようにやってみたのですが上手くいきません。 #yomikomi.txtを@nyuuryokuという配列にする open (KENSAKU,"<yomikomi.txt"); $count = 0; while ($nyuuryoku[$count] = <KENSAKU>){ chop $nyuuryoku[$count]; $count = $count + 1; } close (KENSAKU); #とりあえず、ランダムで要素を一つ選ぶ srand(); $kazu1 = int (rand($count)); #もうひとつ、ランダムで要素を選ぶ srand(); rand; $kazu2 = int (rand($count)); #選んだ要素(kazu1 と kazu2)が同じならkazu2を選びなおす while (kazu1 == $kazu2){ rand; $kazu2 = int (rand($count)); } #表示して確認。※ここで$kazu1とkazu2がそれぞれ違っていれば #良いのですが同じになってしまいます。 print "$count ←要素数\n"; print "$kazu1 ←kazu1\n"; print "$kazu2 ←kazu2\n"; exit;
22 :
22世紀を目指す名無しさん :2001/05/13(日) 13:23 ID:tI0gSNbQ
>>21 ちょっと無駄が多いな。
open (KENSAKU,"<yomikomi.txt");
$count = @nyuuryoku = <KENSAKU>;
close (KENSAKU);
srand();
$kazu1 = int (rand($count));
$kazu2 = int (rand($count));
while ($kazu1 == $kazu2){
$kazu2 = int (rand($count));
}
print "$count ←要素数\n";
print "$kazu1 ←kazu1\n";
print "$kazu2 ←kazu2\n";
exit;
srandは1回にしろ。
『srand』(乱数の初期化)は、()を省略した場合、その時の時間を入れる。
sleepでもかけない限り、srandの結果は大抵同じになるってこと。
あと、所々$が抜けてるからそれも確認してみな。
#!/usr/bin/perl use FileHandle; srand; chomp(my @in = FileHandle->new('< yomikomi.txt')->readlines); my($n1, $n2); until($n1 eq $n2){ ($n1, $n2) = (int(rand(@in)), int(rand(@in))); } my $count = @in; print <<EOD; $count $in[$n1] $in[$n2] EOD __END__ ところどころvoidでrandが置いて有るのがよく分からんが
25 :
21 :2001/05/13(日) 15:59 ID:RORO2Xd.
23さんありがとうございます。 > srandは1回にしろ。 親切に教えていただいてありがとうございます。 > あと、所々$が抜けてるからそれも確認してみな。 すみません。全く気づかなかったです。 -wcでチェックしたんですがエラーにならないんですね。 24さんありがとうございます。 > ところどころvoidでrandが置いて有るのがよく分からんが 何回も呼び出したほうが、よりランダム性が高まるかと思って使いました。 24さんのスクリプトは自分にはかなり難しいですが勉強になります。
>-wcでチェックしたんですがエラーにならないんですね。 use strict 'subs';によりそのような間違いを回避することが出来ます。
27 :
名無しさん@お腹いっぱい。 :2001/05/14(月) 12:39 ID:ja2f3uZE
perlってlinuxだと大抵デフォルトで入っているんだけど HP-UXだと公式には入っていないのでソース持ってきてインストール しなきゃならんですよね。SUNとかIBMとかはどうなんでしょか?
乱数にはrand()というのがありますが、かなり質の悪い乱数のように 思えます。 もう少し綺麗な乱数を作るにはどうしたら良いんでしょうか? 勿論、rand並に手軽に使えるぐらいの大きさで、ですが。
>>28 逆に聞きたい。
キミの言う綺麗な乱数とは何か?
30 :
名無しさん@お腹いっぱい。 :2001/05/15(火) 03:41 ID:U38TPPmg
31 :
名無しさん@お腹いっぱい。 :2001/05/15(火) 04:19 ID:itC.85zc
がいしゅつかもしれないけど、昨日こんなコードではまってしまった. function Ike($mojiretu = NULL) { //文字列があったら処理せよ. if ($mojiretu) { echo "逝ってよし"; } else { echo "文字列ないよん"; } } このコードは、 $mojiretu = "0"; がきたときには else に分岐してしまう. ちゃんと、 if ($mojiretu != NULL) と、しないとだめなのだ... 実行時に型判別の恐怖.鬱だ.
33 :
32 :2001/05/15(火) 11:15 ID:???
PHPのスレと間違えました. ごめんなさい.
34 :
名無しさん :2001/05/15(火) 14:52 ID:hcMTBPhU
CRとLFの改行って何が違うのですか?
文字が違います。
36 :
名無しさん@お腹いっぱい。 :2001/05/15(火) 18:24 ID:c9i14K.Y
UNIX LF \n Win CR+LF \r\n Mac CR \r かな
>>36 シッタカはカコワルイね
WinでもUnixでも(多分Macでも)改行は\nだよ
38 :
37 :2001/05/15(火) 18:36 ID:???
binmodeすればWinの\nとUnixの\nは同じになるけど。
(Macは知らん)
とりあえずLFは改行、WinだとCRというゴミが付くと思っていれば良いんじゃないの?
>>34
39 :
名無しさん@お腹いっぱい。 :2001/05/15(火) 19:27 ID:itC.85zc
CR \x0D \015 \cM LF \x0A \012 \cJ
40 :
名無しさん@お腹いっぱい。 :2001/05/15(火) 22:46 ID:a8Q7zCBA
myの使い方について質問です。 1;foeeach my $var(@array){ } 2;my $var; foreach $var(@array){ } この1の使い方、毎回my宣言しているので2と比べ効率が悪い気がするのですが、 JAPUさんなどはよく1の方法で回していますよね? これは何か理由があるのでしょうか。
41 :
名無しさん@お腹いっぱい。 :2001/05/16(水) 00:15 ID:1AgH6foc
>>40 おれも無意識に1の方法を使ってるなあ。なぜかと考えるに、
$varのスコープをブロック内に局所化できるのが
気持ちいいから、ではなかろうか。
42 :
40 :2001/05/16(水) 10:15 ID:ufM2vq4Q
訂正) s/foeeach/foreah/;
>>41 簡単なベンチマークを取ったところ、数%ですが2の方が高速でした。
気にするほどではないと思いますが、
無意識に1の方法を取るほどいいメリットとも思えません…<$varのforeachブロック内への局所化
他に利点は無いのでしょうか?
43 :
初心者過ぎる人 :2001/05/16(水) 11:19 ID:E0ODptoI
すみません新規質問です。 ASPで動くXML::DOMモジュールはどこにあるんでしょうか?
44 :
JAPU :2001/05/16(水) 13:59 ID:???
私が 1. の方法を利用するのは、
>>41 さんと同じ理由です。
変数は可能な限り局所化する主義なので。
# その2%程度が気になるような人はアセンブラで組めば良い。:-p
45 :
40 :2001/05/16(水) 15:15 ID:ufM2vq4Q
>>44 なるほど。納得しました。
>>41 ,
>>44 ありがとうございます。
ずっと気になっていたのでスッキリしました。
46 :
初心者 :2001/05/16(水) 17:03 ID:dHgf5I9c
スクリプトA.plの中からスクリプトB.plを起動させるときに B.plへ変数を渡す方法とB.plが終了した事をA.pl内で 判断する方法を教えてください お願い致します
47 :
初心者 :2001/05/16(水) 17:19 ID:dHgf5I9c
スクリプトA.pl内 system(perl B.pl $A $B $C > $log_file) open(LOG,"< $log_file") というコーディングでよいのでしょうか?
>>46 require 'A.pl';
では不満なのか?
49 :
初心者 :2001/05/16(水) 17:58 ID:dHgf5I9c
>>48 Aの中から変数を与えてBを実行し
Bのログをファイルにリダイレクトさせた物を
再びAの中で加工したいのです。
50 :
名無しさん :2001/05/16(水) 18:02 ID:dUC0dSnc
チャットについて質問です。 チャットのリロード機能がついてる仕様は絶対にフレーム型でしょうか。 つまり、chat.cgiで入力フォームと会話表示(ログ表示)部分をlog.htm などとします。 log.hmにrefreshを使い自動更新しますよね。 しかし、入力部分と会話表示部分がひとつ画面だと chat.cgiを更新してしまうので入室画面に戻ってしまいます。 結論は、フレーム型のチャットが嫌なので一体型で自動更新したいのですが 何か方法はありますでしょうか?
51 :
名無しさん :2001/05/16(水) 18:04 ID:dUC0dSnc
>つまり、chat.cgiで入力フォームと会話表示(ログ表示)部分をlog.htm >などとします。 ちょっとここは書き間違いです。
>>50 理屈の上ではフレームを使わないCGIも作れます。
でも書き込みしてる最中にリロードが起きると、
せっかく途中まで書いた文章が消えちゃうよ?
それって利用者から文句出まくりだと思うんだが。
>>49 とりあえず
>>47 でいいのでは。
systemの引数がクォートされてないのだけ気になったけど。
こうね => system("perl B.pl $A $B $C > $log_file");
ごく簡単な改造でイイと思うんだけど 作製依頼は何処で出したらイイですか?
56 :
投票などについて :2001/05/17(木) 00:11 ID:T3NJy0u2
どのスレに書き込むか迷ったので初心者に書きます。 ある板でロゴの投票をしようという事になったのですが、 Win板のロゴ投票では、投票した人間のアクセスログも わかっていたようです。 こういうのは投票用のCGiにアクセスログの機能もついてる ものなのか、アクセスログ用のCGIの見る先が投票用のCGI にしてるのかわかりません。 アクセスログ機能がついてる投票用のフリーCGIとか あればいいんですが、探す限り最新の投票のホスト名だけ とかばかりで一覧にバーッとログファイルができるようなのが ないんですが‥うーん‥
>>56 なにが言いたいのかわからんぞ。もちっと整理してくれ。頼むよ。
Windows版がロゴ投票に使ったのと同じCGIが欲しいってことか?
しかしそれならWin板に行って話をすればいいだろうし・・・。
#あ、もしかしたら、同じようなCGIが欲しいけど、
#Win板に頭を下げるのがイヤなマッカーな人?
58 :
初心者 :2001/05/17(木) 03:33 ID:rW7cRx.k
>>53 レスありがとうございます。
ログ加工までなんとかできました。
59 :
初心者 :2001/05/17(木) 03:39 ID:rW7cRx.k
ついでといってはなんなのですが、 実際にスクリプトを実行せずにコーディングチェックだけを 行えるデバッグモードみたいなことはperlで出来ませんでしょうか? 環境はシステムがwin32でperlはperl5とjperlがあります。 (perl5とjperlの違いもよくわからないのですが・・・)
60 :
名無しさん@お腹いっぱい。 :2001/05/17(木) 04:24 ID:KYQIk2Ao
>>59 ん? perl -wc <スクリプト> じゃだめ?
# Tもつけよう。
61 :
初心者 :2001/05/17(木) 08:46 ID:rW7cRx.k
たびたびすみません。 配列@getに変数で値を追加していきたい時は while(....){ @get = $hensu } で行えますでしょうか?
62 :
56 :2001/05/17(木) 08:48 ID:.GKme7Xc
>57 Win板で聞いてきたんですが 誰も答えてくれません(泣) ロゴ投票まとめてた人の目につかないだけかもしれませんが。 投票した人間のログを記録するようなCGIが 欲しいということです。 一応フリーの投票用の探したんですが ログファイルとか残すタイプがなかったもので。
63 :
初心者 :2001/05/17(木) 08:52 ID:rW7cRx.k
$i = 0; while(....){ $get[$i] = $hensu; ++$i; } と行わなければ、やっぱり駄目でしょうか?
64 :
名無しさん@お腹いっぱい。 :2001/05/17(木) 08:57 ID:rZ3d9O0s
>>63 push @get, $hensu;
Perlの本でも買ってきたら?
65 :
名無しさん@お腹いっぱい。 :2001/05/17(木) 08:58 ID:/ddSlCio
>>63 while(...) {
push @get, $hensu;
}
66 :
65 :2001/05/17(木) 08:59 ID:???
被った・・・
67 :
名無しさん@お腹いっぱい。 :2001/05/17(木) 09:47 ID:WmKEiYPc
Perlで簡単なプロクシサーバー(つーかただのフィルタみたいなもんだけど) を書いているのですが、ActivePerlで fork 使うと速攻で落ちます。 やっぱりWindowsで fork は無理ですか?ちなみにスクリプトの方のバグかと 思ってLinuxでテストしたら普通に動きました。なんかActivePerlは かわりにスレッドが使えるとかなんとか聞いたような気がするんですが どうなんでしょう。
>>68 ActivePerl-5.6.0.616です
>>62 #---
sub logsave{
local *LOG;
open LOG, '>>log.dat' or return;
flock LOG, 2;
print LOG <<EOD;
${\time()}<>$ENV{REMOTE_ADDR}<>$ENV{HTTP_USER_AGENT}
EOD
close LOG;
}
#---
71 :
68 :2001/05/17(木) 10:47 ID:???
>>69 スマン、俺じゃ分からん。
Perl5.6.0.623でforkのテストをすると成功する事もあるがDLLのエラーで落ちる事もあった。
スレッドはサパーリわからん。"perldoc Thread"とでもしてくれ。
72 :
69 :2001/05/17(木) 11:02 ID:WmKEiYPc
>>71 あら、残念。ActivePerlじゃなくても最近のPerlは
スレッド使えるみたいだけど、スレッドに関する資料が
少なくてよくわからないよ。ちなみに perldoc は見た
んだけど、スレッドが使えるって言うのはこのモジュールの
ことを指すの?なんか実験的な機能とか書いてあるけど…
まあとりあえずちゃんと読んでみるよ
あと、とりあえず perl -V 打ったら
usethreads=undef
ってなってたからこのままじゃスレッドは使えない
のかな。もしかしてこれを有効にするにはソースから
なんかオプションつけてコンパイルしなくちゃならないの?
わから〜ん!誰かヒントを!
73 :
初心者 :2001/05/17(木) 12:35 ID:rW7cRx.k
if($data[2] =~ /^$data2[0]/){ } 以上のようにコーディングしたら if文のセンタックスエラーでこけてしまいました。 //で変数は使えないのでしょうか?
74 :
名無しさん@お腹いっぱい。 :2001/05/17(木) 12:46 ID:WmKEiYPc
>>73 パターンマッチの中では[]は特別な意味あり
ちなみに変数は使える。
$tekito = $data2[0];
if ($data[2] =~ /^$tekito/) {}
とかにしたら?
syntax errorなら何処かでセミコロンが抜けているに一票
ちなみに
>>74 は不正解。
#!/usr/bin/perl
$data[2] = 'abc()';
$data2[0] = 'ab';
print $data[2] =~ /^$data2[0]/;
__END__
77 :
74 :2001/05/17(木) 14:09 ID:???
>76 ほんとだ、真になってた。適当書いてスマソ
78 :
名無しさん@お腹いっぱい。 :2001/05/17(木) 16:19 ID:eJAJlr4A
>>67 -72
おおー。ActivePerlの5.6って、
スレッドを使ってforkのエミュレーションするようになったんだ。
perldoc perlfork をざっと見てみました。
まだpipeは使えないんだね。
79 :
名無しさん@お腹いっぱい。 :2001/05/17(木) 19:33 ID:KWAHrWxw
二次元配列で配列の二次元目(?)の要素数を調べには どうしたらいいでしょうか? $hoge[0][$n]の$nが何個か知りたいんです あんまりPerlでは二次元配列はつかわないんでしょか?
80 :
名無しさん@お腹いっぱい。 :2001/05/17(木) 19:52 ID:PKwP8X0M
>>79 $size = scalar @{$hoge[0]}
Perlの2次元配列は実際には「配列へのリファレンス」の配列。
つまり$hoge[0]等は各々が配列へのリファレンスである。
@{$hoge[0]}としてデリファレンスすると配列の実体になる。
あとは定石通りscalar関数で配列サイズを取得。
>>79 自分が知らないというだけで「使われていない」と思うのはどうか。
まぁ修得が若干難しいというのは確かだが。
#!/usr/bin/perl
$aryref0 = [qw(0 1 2 3 4 5)];
$aryref1 = [qw(0 1 2)];
$aryref2 = [qw(0 1 2 3 4 5 6 7 8 9)];
@ary = ($aryref0, $aryref1, $aryref2);
print <<EOD;
$#{$ary[0]} + 1 = ${\($#{$ary[0]} + 1)}
$#{$ary[1]} + 1 = ${\($#{$ary[1]} + 1)}
$#{$ary[2]} + 1 = ${\($#{$ary[2]} + 1)}
EOD
__END__
>>80 -81
サンキュー
{$hoge[0]}って囲む事を知らなかったから問題だったんだな
説明もわかりやすかったし
スクリプトもわかりやすくて助かりました
あまり使われていないのかって書いたのは
Cの参考書には二次元配列について書いてあっても
Perlの参考書には書いてなかったからさ
Perlはいろんな方法がある分二次元配列とかは
そんなに使わないのが普通なのかなって思って
サブルーチンの中でグローバル変数を
あんまりつかわないのと一緒で
大体他の方法で抜けるのが一般的かなと思ったんです
ほんとにありがとう
Perlの参考書に書いていないのは CGIスクリプトを作る際に必須な概念ではないってのが大きいんじゃないかな。
84 :
名無しさん@お腹いっぱい。 :2001/05/17(木) 22:57 ID:693Tbg52
85 :
名無しさん :2001/05/17(木) 23:36 ID:ENQ64Pv6
mod_perl てなんて読むの。 もどぱーる? もじゅーるぱーる?
86 :
名無しさん@お腹いっぱい。 :2001/05/18(金) 05:54 ID:YOZjqt/s
う。なやまず「もっどぱーる」とよんでた。 どうなんだろう。
おれも「もっどぱーる」派
88 :
名無しさん@お腹いっぱい。 :2001/05/19(土) 00:46 ID:pQYsUf86
>>85 「もっとPerl!」を、方言にした感じで「もっどぱーる」
なにも知らずに動けばそれで良しな私は @data[x] $data[x] を一緒に使っちゃってますが、やはり問題ありますよね?
90 :
名無しさん@お腹いっぱい。 :2001/05/19(土) 07:15 ID:pQYsUf86
詳しいことは知らないが、Perl6からは、@data[x]は、配列のスライスではなく、 配列の要素を指す記述方法になるらしい。 配列のスライスは、別の記述方法が用意されるらしいです。
92 :
名無しさん@お腹いっぱい。 :2001/05/19(土) 12:36 ID:mE7mDJyE
半角カナの処理ってどうされてますか? おいらはjcode.plで全角にしちゃってますがその他ってなにか方法 ありますか?
ベツニ。メールジャネーンダカラメクジラタテルコトモアルマイ<ハンカク ISO-2022-JPッツーワケデモナイノニゼンカクニシチマウノハドウカトオモウ
JavaScript で頑張る。
すごく恥ずかしい質問なのですが JAVAのコメントアウトみたいに /* ココがコメントにょ */ みたいな機能はないのでしょうか?
96 :
名無しさん@お腹いっぱい。 :2001/05/19(土) 17:14 ID:wk52aSL.
>>95 POD形式のコメントにするのが正式だと思う。
参照: perldoc -q "comment out" および perldoc perlpod
ちょこっと部分的にコメントアウトしたいときは
=pod
この部分はパースしないよ
=cut
だけでいいかもな。
>>95 Cみたいに /* */ や // が使いたい場合は、
----------
#!/usr/bin/perl -MFilter::cpp
/*
複数行コメント
*/
print "ok!"; //一行コメント
----------
とする手もあります。
本当は96さんのようにするのがベストだし、自分も普段は
そうしているのだけれど、一応、雑学的知識として....
#事前にCプリプロセッサ(うちでは"gcc -E")に食わせているだけです。
98 :
95 :2001/05/19(土) 22:32 ID:1jbpiiuM
96さん97さん、ありがとうございました。 #入門本に載って無くてずっと#を20行とか打ってました・・・
>>98 いや#を20行というのが間違いというわけではないよ。
PODにしろCプリプロセッサに食わせるにしろ、"完全に無視される存在ではなくなる"からね。
いろいろ方法があるんですねえ。ていうかそれがPerlというものか。 このスレのPart1から全部まとめて「Perlの雑学」っていう サイトを作ったら面白いかもなあ。
>>100 > このスレのPart1から全部まとめて「Perlの雑学」っていう
> サイトを作ったら面白いかもなあ。
それマジで誰かやってくれないかな。
漏れは取捨選択できるレベルじゃないからダメっぽいけど…。
勉強がてらに作ろうかしらん
>>102 場所を用意してくれるんなら少しは協力するぞ。
アカウント提供しようか?
PERL勉強できるHPある? せっかくLINUXいれたので・・・。
ヒューレットパッカードのマシンですか?>106
>>107 まだそんな事でつっこむのかよ。
サブッ
111 :
名無しさん :2001/05/20(日) 08:31 ID:/uasmmyo
Apache::PerlRunとApache::Registryの違いって何ですか。
112 :
(・∀・)イイ!! :2001/05/20(日) 10:31 ID:3QTA/xf2
114 :
初心者 :2001/05/20(日) 13:32 ID:4X2s.QbM
すみません助けてください。 perlでAとBのファイルのレコードマッチングで 同じレコードを抜き出してCというファイルを作るのですが foreachの入れ子で作るとどうしても抜き出すレコードが 2レコードずつ出力されてしまいます。 どこかによい例がありませんでしょうか?
115 :
初心者 :2001/05/20(日) 13:31 ID:4X2s.QbM
すみません助けてください。 perlでAとBのファイルのレコードマッチングで 同じレコードを抜き出してCというファイルを作るのですが foreachの入れ子で作るとどうしても抜き出すレコードが 2レコードずつ出力されてしまいます。 どこかによい例がありませんでしょうか?
>>115 まずはそのスクリプトを書くなりアプするなりしたらどうだ。
117 :
初心者 :2001/05/20(日) 13:48 ID:4X2s.QbM
すみません、こんなかんじです。 @new = <NEW>; foreach $new_rec (@new){ #---関数 comp_update $subname="comp_update";&local_time; &comp_update; $val = &comp_update; if($val){ if($hit_sw eq "0"){ print OUT "$new_rec2---unm\n"; } print OUT "$new_rec2\n"; } } # sub comp_update{ # 新旧更新情報ファイルの比較 $hit_sw = "0"; $new_rec2 = $new_rec; @new_data = split(/\s+/,"$new_rec"); @old = <OLD>; foreach $old_rec (@old){ @old_data = split(/\s+/,"$oup_rec"); if(($new_data[0] eq $old_data[0]) && ($new_data[1] eq $old_data[1]) && ($new_data[2] eq $old_data[2])){ $hit_sw = "1"; if($new_data[3] eq $old_data[3]){ return[0]; }else{ return[1]; } } } if($hit_sw eq "0"){ return[1]; } }
118 :
初心者 :2001/05/20(日) 13:50 ID:4X2s.QbM
段差がつかなくてすみません あと4行目はファイルの突き合わせには意味のない サブルーチンです。
なんつーか…いっちゃ悪いが無茶苦茶だな 思うに問題は"return[n]"じゃないか?勘だが。 真偽値を返すつもりなら"return(n)"と書いてみな。
120 :
初心者 :2001/05/20(日) 14:11 ID:4X2s.QbM
>>119 nって数字ではないのですか?
アルファベットの“n”ですか?
メインルーチン側はどうやって真偽を判断するのですか?
解決にはならないが、気になる点。 >return[0]; return(0); []じゃなくて()だよ。(このままだと、0という要素を持った配列へのリファレンスを 返すことになってしまうよ) >$hit_sw eq "0" 数値を""でくくるのは、なんか変。 $hit_sw = 1; $hit_sw == 0; >$new_rec2 こういった変数の付け方は、後から見ると(or 他の人が見ると)何を指しているのか 分かりづらいのでやめよう。(しかもグローバル変数で突然現れるし......) >$old_data[0] eq $new_data[0] とか どんなフィールドを比較しているのか.....わからん。 >@old = <OLD>; 毎回読むの?最初の一回でファイルの終端まで全部読んでしまうから 二回以降@oldは空じゃない? #どういったことをやりたいのかを(114より詳しく)正確に書いて欲しい。
>2レコードずつ出力されてしまいます。 ってことは、 >if($hit_sw eq "0"){ >print OUT "$new_rec2---unm\n"; >} >print OUT "$new_rec2\n"; >} の後者のprintが要らない?......というか、よくわからん。
123 :
ははは :2001/05/20(日) 14:28 ID:???
デバッグする気になれんよ・・・・・
124 :
初心者 :2001/05/20(日) 14:38 ID:4X2s.QbM
>>121 やりたいことは 更新情報であるNEWファイルのレコードを
OLDファイルのレコードと比べて、
互いのレコードデータの項目[0]〜[2]まで一致したら
日付(YYYYMMDD・・・)の入っている項目[3]を比べ
差異があればOUTファイルへ出力させます。
但し、NEWファイルにしかないレコードもunmatchとして同じく出力させます。
>>@old = <OLD>;
>毎回読むの?最初の一回でファイルの終端まで全部読んでしまうから
>二回以降@oldは空じゃない?
NEWのレコード1行毎に、OLDファイルは頭から再び
探したいのですけど・・・意味ないのでしょうか?
125 :
初心者 :2001/05/20(日) 14:57 ID:4X2s.QbM
>return[0]; >return(0); >[]じゃなくて()だよ。(このままだと、0という要素を持った配列へのリファレンスを >返すことになってしまうよ) スミマセンここもう少し詳しく教えてください。 1度シンタックスエラーになり リファレンスマニュアルを読むと[]と書いてあったので変えたのですが・・・ 戻り値に真偽を与えメインルーチン側で真偽を判断する方法がよくわからないのです。 あと 一度、配列にファイルハンドルで全てあたえたら 繰り返し処理でやる意味はないのですか? open... @old = <OLD>; close... とファイルを開いて全て読みこんでファイルを閉じるのが正しい 使い方なのでしょうか?
>>125 悪い事は言わないからまともな本買って勉強し直しな。
その方が君のためになる。
ああ、昼寝してた。すまん。 #!/usr/bin/perl -w use constant NOT_EXISTS => 0; use constant EXISTS => 1; use constant LAST_MODIFIED => 3; @old = map{ [ split ] } <OLD>; while($rec = <NEW>){ chomp $rec; $is_exists = NOT_EXISTS; @new = split(/\s+/,$rec); foreach $old (@old){ if(($new[0] eq $old->[0]) && ($new[1] eq $old->[1]) && ($new[2] eq $old->[2])){ $is_exists = EXISTS; if($new[LAST_MODIFIED] ne $old->[LAST_MODIFIED]){ print $rec , "\n"; last; } } } if($is_exists == NOT_EXISTS){ print $rec , "---unmatched\n"; } } やりたいのはこういったこと?
>print $rec , "\n"; print OUT $rec , "\n"; だな。それにNEW,OLDも開いてない。
綺麗なソースだ…。 流石_gunzipさんです。
ああ、また寝惚けて読んでなかった。すまん。
>>125 >1度シンタックスエラーになり
うーん。あり得ないような。
>リファレンスマニュアルを読むと[]と書いてあったので変えたのですが・・・
どんな記述だったのか知りたいなあ。
>戻り値に真偽を与えメインルーチン側で真偽を判断する方法がよくわからないのです。
うう....言ってることが分からない。戻り値として返されたものを評価すればいいだけでは(?)
>あと 一度、配列にファイルハンドルで全てあたえたら
一回目の&comp_update()の呼び出しで
>@old = <OLD>;
@oldには($/未変更時)ファイルハンドルOLDの各行が一行ずつ入る。
ついでにEOFもセットされる。(最後まで読んだので)
二回目の&comp_update()の呼び出しで
>@old = <OLD>;
OLDにはもう残っていないので@oldは空になる。
>>129 ありがとう。何か変なところがあったら指摘してくれると嬉しいです。
131 :
初心者 :2001/05/20(日) 17:39 ID:4X2s.QbM
>>126 そうしたいのは山々なのですが(ここからは言い訳になります)
コンピュータはインターネットとゲームをするていどの
ど素人だったのが
COBOLの研修を2週間程度受けて、いきなり配属され
一人ぼっちでperlと格闘している最中の新入社員なのです。
(でもperlってコンパイルしなくていいのが好き)
周りは年老いたおじサンばかりで若いというだけで引継ぎも
ままならないままサーバ管理をまかされてしまいました・・・・
>>127 あまりにも・・・高等すぎてよくわかりませんが
有り難くコピペさせて勉強させていただきます。
先ほどの突き合わせ処理の問題はなんとか解決できました。
やはり御指摘の通り @old = <OLD>を繰り返し処理の中で
行っていた事が原因でした。
(2行づつ書きこむのは別の原因でしたが)
perlのマニュアルは沢山買いこみましたが
肝心の無い様が私にとってチンプンカンプンで・・・
今の仕事向いてないのかもしれません・・・
ありがとうございました。
追伸:どこかおすすめのPerlのサイトありませんでしょうか?
132 :
名無しさん@お腹いっぱい。 :2001/05/20(日) 17:49 ID:MGMWE3cQ
全角のA..Z1..9を半角のA..Z1..9に置き換えたいんですが、 上手い方法ないですか? tr/a/a/g; tr/1/1/g; みたいにやってもだめでした。
>>131 関連サイトは
>>2 を参照
しかし…君を悪く言うつもりは無いが、
酷い会社だなそこは…それともそういうものなのか。
ま、頑張れや
>>132 jcode.pl(またはJcode.pm)のtr()関数を使えばいい
#!/usr/bin/perl
require 'jcode.pl';
$str = 'ZENKAKU123';
jcode::convert(\$str, 'euc');
jcode::tr(\$str, 'A-Z0-9', 'A-Z0-9');
print $str, "\n";
__END__
134 :
名無しさん@お腹いっぱい。 :2001/05/20(日) 18:31 ID:P53jKHxs
135 :
初心者 :2001/05/20(日) 18:40 ID:4X2s.QbM
>@oldには($/未変更時)ファイルハンドルOLDの各行が一行ずつ入る。 >ついでにEOFもセットされる。(最後まで読んだので) すみませんもう一つだけ eofなんですけど、ファイルの一括処理 >@old = <OLD>; を行った時も下記の様に使えますか? @old = <OLD>; foreach $old_rec(@old){ if(eof(OLD)){ #最終行の処理 } } マニュアルには eof(ファイルハンドル)を指定すると 書いてあるのですが、この場合もファイルハンドルで いいのでしょうか?
>>135 @old = <OLD>;
とした時点で配列"@old"とファイルハンドル"OLD"は何の関係も無くなる。
同じ事をしたいのならwhileで回せ
while(defined($old_rec = <OLD>))
{
&nbsp;&nbsp;if(eof(OLD)){
&nbsp;&nbsp;&nbsp;&nbsp;#最終行の処理
&nbsp&nbsp;;}
}
台無しだ(;´Д`) while(defined($old_rec = <OLD>)) { if(eof(OLD)){ #最終行の処理 } }
138 :
132 :2001/05/20(日) 21:00 ID:Ir3q0zHo
>>133 無事変換できました。3日悩んでいたのでとても嬉しいです。
ありがとうございました。
139 :
馬鹿 :2001/05/20(日) 22:34 ID:???
>>131 直接には役に立てなかったけど、上手くいってよかった。
お仕事頑張って。(ちょっと無責任かな.......)
>この場合もファイルハンドルでいいのでしょうか?
はい。ちなみに、
perldoc -f eof
でPerlの関数(この場合はeof)についてのマニュアル(英語)を読むことが出来ますよ。
他のも色々試してみてください。
>>139 これでいいか?
#!/usr/bin/perl
@url = split /\n/ , <<;
www.hogehoge.com
www.hogehoge-u.ac.jp
hogehoge.com
http://hogehoge.com/ http://hogehoge.com http://www.hogehoge.com/ foreach(@url){
m%([0-9a-z\-]+\.)*?([a-z0-9-]+)\.([a-z]{2,3})(?:\.([a-z]{2}))?([^a-z]|$|/$)%i;
print "$_ :\t \$1 = $1, \$2 = $2, \$3 = $3, \$4 = $4\n";
}
142 :
馬鹿 :2001/05/20(日) 23:21 ID:???
143 :
めっちゃ初心者です :2001/05/21(月) 21:53 ID:Ra9UJdqo
よくわかりませ〜ん /を,に変換したいのですが美味くいきません こんな感じです。 $moji = "111/222/333"; $moji =~ tr///,/; print "$moji"; /という文字がやっぱ不味いんでしょうか?でも/をどうしても, に変換したいんです。 宜しくおねがいします。
\/
>>144 美味くいきました。ありがとう
ネタじゃないっす。
すいませんもっと勉強します
>>144 たった2バイトの回答で感謝されるのも珍しい(笑)
>>146 気づく時は「あ〜っ」という感じなんだろう(笑)
148 :
初心者 :2001/05/22(火) 17:16 ID:v5lFmpjo
すみません 「スカラー変数の値の左端からn桁を抜き出す」 コマンドってありませんか?
149 :
初心者 :2001/05/22(火) 17:17 ID:v5lFmpjo
すみません 「スカラー変数の値の左端からn桁を抜き出す」 コマンドってありませんか?
150 :
初心者 :2001/05/22(火) 17:18 ID:v5lFmpjo
すみません 「スカラー変数の値の左端からn桁を抜き出す」 コマンドってありませんか?
substr($str, n, 1)
152 :
初心者 :2001/05/22(火) 17:56 ID:v5lFmpjo
ありがとうございます。
perlにC言語のファイルを組み込むことはできますでしょうか? また、できるとすればどうやったらできるんでしょう? やっぱり変換するしかないのかな・・・・。
154 :
疑問。 :2001/05/22(火) 23:59 ID:???
そのファイルにアクセスされたら他のプログラムを動作させること ってどうやるんでしょうか。 サブルーチンではなく、普通のファイルを、なのですが・・。
>>154 require "./file.pl";
$ call japu
158 :
JAPU :2001/05/23(水) 02:38 ID:???
159 :
名無しさん@お腹いっぱい。 :2001/05/23(水) 11:29 ID:Qg5ERlzM
VisualC++みたいな形の、GUI環境のデバッグツールはありますか?
161 :
名無しさん@お腹いっぱい。 :2001/05/23(水) 17:39 ID:Lqr/QSWw
#!/usr/bin/perl $str = "12345"; $str =~ tr/0-9/0-9/; print "Content-type: text/html\n\n"; print $str, "\n"; print "</body></html>\n"; とすると出力が 0203040506 となってしまいます、普通に 12345 とは表示できないのでしょうか?
eucで ----------------------------------- require './jcode.pl'; $str = "12345"; jcode::tr(*str, "0-9","0-9"); print $str;
eucで ----------------------------------- require './jcode.pl'; $str = "12345"; jcode::tr(*str, "0-9","0-9"); print $str;
かぶる・だぶる のワンツーパンチ。 あ、タイムスリップもしてる(w
166 :
名無しさん@お腹いっぱい。 :2001/05/23(水) 18:02 ID:Lqr/QSWw
EUCでですね。。。できました(^^; ありがとうございます
最近モジュールなるものを知ったのですが、 ローカル(win98/httpd)で使用することは出来ますか? つーか使い方もまだ良く分からないんだけど(ぉ
>>167 モジュールを使ってみようとしましたか?
169 :
167 :2001/05/23(水) 23:44 ID:???
>>169 はいってアンタ…(w
使ってみた結果は?
平和だね(w
マターリとしたのもたまには イイ!(・∀・)
173 :
名無しさん@お腹いっぱい。 :2001/05/25(金) 00:05 ID:wtGhDgwQ
age
よくあるフレーム式のチャットを組んでいるのですが、 メッセージを送信した後に記事表示部をリロードするには どうすればいいのでしょうか? 教えてください。
>>174 HTMLの勉強をしよう。
<form method=POST action=undex.cgi target=under>
それともオートリロードの仕方かい?
<meta http-equiv="refresh" content="90;url=under.cgi">
必要ならunder.cgi?name=$nameとかにすればよろし。
176 :
175 :2001/05/25(金) 01:38 ID:???
タイプミスしたけど自分で修正してくれ。
177 :
174 :2001/05/25(金) 02:53 ID:???
>>175 無事解決しました。
ありがとうございました。
178 :
名無しさん@お腹いっぱい。 :2001/05/25(金) 07:29 ID:tY41esp2
Perl6はいつ頃でるんでしょうか?
今年の夏あたりにコアが出来るとかいうのをどこかで読んだ気がする。
cronの使い方がイマイチ分からないのですが、 やはりtelnet設定してやらナイト無理ですか? ちなみにサーバはf2sです。
181 :
名無しさん@お腹いっぱい。 :2001/05/26(土) 00:11 ID:ykv1O/hI
CGIのソースをいろいろ見て参考にしたいのですが、 使用されているCGIのソースをこっそりダウンロードする方法ってありますか?
182 :
名無しさん@お腹いっぱい。 :2001/05/26(土) 00:57 ID:AODUSOWA
>>181 無い。あまりそんな質問されると厨房だと思われますよ。
今は去年の新人をいじめてる。 こいつはやめそうにないんで とりあえず泣かそうと思ってる。
>>182 本気でIDカッコ(・∀・)イイ!
# アドゥソワ?
186 :
名無しさん@お腹いっぱい。 :2001/05/26(土) 19:51 ID:ojerd3UA
perlccで途中のcのファイルを残せないのでしょうか?perlからCへの 移植に使えるかと思ったんですが・・・。
187 :
名無しさん@お腹いっぱい。 :2001/05/26(土) 19:58 ID:GHTZid3c
メモ帳で printf"Hello World\n"; と書いてsample001.plで保存。 Perlでperl sample001としてもなにも起こりません。ソースのパスを 指定してないからなんでしょうが、パスを変更する方法がわかりません。
>>187 なんでsample001.plの.pl抜かしてんだよ
>>187 ・printf
・.plを抜かす
・「なにも起こらない」
ってことでネタと断定
>・printf 確かにあまり使わないが、別に誤りでもなかろ。
質問なんですけど、よく open(FILE,"$filename") or die('...'); ってしてますよね? sleep(1) until open(FILE,"$filename"); みたいなのは駄目なんでしょうか?
>>193 ファイルがずっと開けない状態にあったらどうなるのかな?
そもそもファイルがなかったりとかね
>>186 >perldoc perlcc
$ perlcc -c file # Creates a C file, 'file.c'
$ perlcc -c out.c file # Creates a C file, 'out.c' from 'file'
$ perlcc -c -e 'print q//' # Creates a C file 'a.out.c'
197 :
187 :2001/05/27(日) 04:03 ID:fXHTNImE
いやネタじゃないですよ、最初に書くソースってことでcのまね してみただけです。ちなみに perl e:/書類/ユーザー/perl/sample001.pl ってやったらMS-DOS窓が閉じちゃいました。なにか表示されたのが 一瞬見えましたが。perl5.6.1です。
>>197 DOSプロンプトで起動してるのか?
system(exit);
でもやらんと閉じない気がするのだが。
199 :
187 :2001/05/27(日) 07:32 ID:daAcq/BI
>DOSプロンプトで起動してるのか? え?PerlのアイコンwクリックでDOS窓が開きませんか?
200 :
187 :2001/05/27(日) 07:37 ID:daAcq/BI
失礼しました。DOSじゃなかったです。 あれがPerlのインターフェイスですね。
201 :
187 :2001/05/27(日) 07:41 ID:daAcq/BI
system(exit);とやってもなにも起こらず・・・。 ActivePerl-5.6.1.626-MSWin32-x86-multi-thread これ以外になにかインストールしないといけないんでしょうか。
202 :
187 :2001/05/27(日) 08:29 ID:daAcq/BI
試しにDOSプロンプト立ち上げてからPerl 〜とやってみたら ちゃんと動作しました。これでなんとかなりそうです。 お騒がせしました。
>>202 >試しにDOSプロンプト立ち上げてからPerl 〜とやってみたら
・・・今まではどうやっていたの?
204 :
名無しさん@お腹いっぱい。 :2001/05/27(日) 09:30 ID:NfbVrjcI
>>203 >>199 の
> PerlのアイコンwクリックでDOS窓が開きませんか?
にあるとおり、Windowsで普通にActivePerlをインストールすると hoge.pl をダブルクリックで
DOS窓起動→hoge.plが起動→hoge.pl終了→DOS窓終了→一瞬で窓閉じたー
ってなる。
あと、DOS窓内で直接 hoge.pl ってやっても関連付けの関係で起動できたりする。
205 :
187 :2001/05/27(日) 12:04 ID:IqGMfkVQ
>>203 204さんの解説どおりです。204さんありがとう。
>>206 おおっ!
凄い便利そうですね。
205じゃないけど早速使ってみま…あれ?
…落として展開したらこんなドキュメントが…
>本ディレクトリに収められているのは、受動喫煙(Passive Smoking、他人の煙
>草の煙を吸わされること)による健康被害の問題に関する資料です。
(゚Д゚)ハァ?
AN HTTPD で、ImageMagick を動作させたいのですが、 やっぱ無理っすかね?
210 :
207 :2001/05/27(日) 22:11 ID:???
211 :
209 :2001/05/27(日) 22:14 ID:???
>>210 サンクス。
…漏れもビクーリしたよ(w <受動喫煙
212 :
207 :2001/05/27(日) 22:58 ID:???
ああリダイレクトが、パイプが…!(嬉) 上等です。_gunzipさん感謝っ! . . . …ただ付属のmksos.comがうまくいかないのは俺だけ?(;´Д`) デフォルトがjperlだし(;´Д`) しょうがないのでrunperl.com #perl %0 %@ ($program = $0) =~ s{^.*[/\\]|\.[^./\\]*$}{}g; exec 'perl', $program, @ARGV; exit $!;
>>207 appeal/ディレクトリね。自分も展開してみて驚いた。(→削除)
自分も煙草は吸わんです。(´ー`)y−~~
>>209 -210
ちょっと事情が分からないのだけど・・・もしかしてappeal/ディレクトリしか無かったとか?
それと、1.11に上がっていたとは知らなかった。ありがとう。
>>212 >…ただ付属のmksos.comがうまくいかないのは俺だけ?(;´Д`)
>デフォルトがjperlだし(;´Д`)
うーん。これだけでは、どこが上手くいかなかったのか分からないけれど、
mksos.comを↓のように修正すればperl(≠jperl)でも動くし、
ちゃんとperl(≠jperl)用のcomファイルを吐くようになるよ。(1.11では一行づつずれる)
____________________________________________________
15c15
< #jperl %0 %@
---
> #perl %0 %@
22c22
< join($;, 'p','Perl (jperl)', 1, '.pl', 'Perl', 'jperl %0 %@'),
---
> join($;, 'p','Perl (jperl)', 1, '.pl', 'Perl', 'perl %0 %@'),
160c160
< close(HDR), last if /^#jperl/;
---
> close(HDR), last if /^#perl/;
____________________________________________________
214 :
207 :2001/05/28(月) 09:44 ID:???
>>213 >ちょっと事情が分からないのだけど・・・もしかしてappeal/ディレクトリしか無かったとか?
そゆことです。
展開中にエラーが出て…(;´Д`)
展開ソフト(ラプラス)のバグでしょうかね。
>mksos.com
_gunzipさんうまくいきました?
俺の場合、jperlはともかく、mksosしても
mksosファイルの最後に目的のスクリプトが追加されるだけで、
動作はmksosと同じになってしまいます(;´Д`)
>>214 Ver1.13ではOKやった(らぷらす)
>>214 >そゆことです。
>展開ソフト(ラプラス)のバグでしょうかね。
そうだったんだ・・・受動喫煙云々しかなかったら、そりゃ驚くね。
自分は五年以上前からLHAユーティリティ(16,32)使ってます。
>mksos.com
あれ?
>>213 のように修正しても上手くいかなかった?
うちでは上手くいってるのだが・・・
>mksosファイルの最後に目的のスクリプトが追加されるだけで、
から推測するに、14行目だけしか修正していないのでは?
mksos.comは自分自身を開いて、#jperlから始まる行まで(ヘッダ部)を複写しているので、
(素直にsos.hdrを読めばいいのに、と思うが・・・158-161行参照)
14行目の#jperl %0 %@を#perl %0 %@に修正して、取りあえずperlで起動するようにしただけでは、
mksos.comは#jperlで始まる行を見つけられないので、自分自身を最後まで複写し、そしてその後ろに
指定されたファイルを読み込んで追加書き込みを行う、というわけ。
(って我ながら分かりにくい説明だな・・・)
うーん。とにかく>213のを試して欲しいなあ。(既にやっていたのならすまん)
____________________________________
・・・・・sos.hdrの中身・・・・・・
(改行をあけないで)
#perl %0 %@
____________________________________
というファイル(comhdr)でも作っておいて
cat comhdr example.pl >example.com
で連結するだけの方が手軽かも。
Perlの勉強を全てWEB上のものを使ってやろうとすれば どういった感じ&どういった資料を使ってで勉強します? 前もって知っているプログラム知識はCの初級者から中級者レベルぐらいだとして。 いや、急にそう言う奴にPerl教えろって言われて・・(鬱
219 :
22世紀を目指す名無しさん :2001/05/29(火) 16:24 ID:876XnkeU
#! /usr/local/bin/perl open(IN,"count.dat"); @lines=<IN>; close(IN); ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time); $count=$lines[$hour]; $count=$count+1; open(OUT,">count.dat"); flock(OUT,2); print OUT "$count"; flock(OUT,8); close(OUT); 時間毎のアクセス数の集計をしたいのだけど、 ↑のプログラムじゃ駄目なんですか? どこが駄目なのかわからんす
>>219 そりゃダメだろう。
chomp($lines[$hour]);
$lines[$hour] = $lines[$hour]+1 . "\n";
open(OUT,">count.dat");
flock(OUT,2);
print OUT @lines;
flock(OUT,8);
close(OUT);
じゃないのか?
221 :
名無しさん@お腹いっぱい。 :2001/05/29(火) 18:06 ID:r6iK.VsQ
XML::Parser (というかexpat)でxmlファイルをパースした時に、 テキストノード中の>とか< 等が 元の文字( > とか < )に戻るのを防ぐ方法(オプション)がありますか? いちいち変換するのは鬱なので。 # でもモジュールのドキュメントにはそれらしい物もなかった…
222 :
207 :2001/05/29(火) 21:46 ID:???
>>216 あ…160行目をいじってませんでした。
お騒がせしてスミマセソ(;´Д`)
223 :
219 :2001/05/30(水) 11:15 ID:???
CGIで、どんな串でも生IP引き出せる技あるんだけど その技を知っている人いますか?
>>224 (゚Д゚)ハァ?
中学卒業してからこいや。な?
226 :
名無しさん@お腹いっぱい。 :2001/05/30(水) 13:27 ID:4wOldUvA
>>220 #! /usr/local/bin/perl
open(IN,"count.dat");
@lines=<IN>;
close(IN);
($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);
chomp($lines[$hour]);
$lines[$hour] = $lines[$hour]+1 . "\n";
open(OUT,">count.dat");
flock(OUT,2);
print OUT @lines;
flock(OUT,8);
close(OUT);
でやってみたんだけど駄目です。
時間毎のアクセス数の集計をしたいのだけど、
色々調べてやってみたんだけど、どこが駄目なのかわからんす。
誰か分かる人教えてください
>>226 はじめに
0
0
0
・・・・って感じに25行続いてるcount.datを用意ておくこと。
それでもだめなら、数回動かしたあとの count.dat を貼り付けてくれ。
228 :
220 :2001/05/30(水) 14:01 ID:???
>>226 1: count.datに24行分の0が用意されていない
2: count.datにパスが通っていない
3: パーミッションがおかしい
4: Perlのパスが通っていない
5: flockが使えない
他にはなんだ?
つーか、何がどうダメなんだよ?
CGIは動くのか?
エラー表示はないのか?
count.datはどうなってる?
君の聞き方に問題はないのかい?
少なくともこっちがローカルで試した分にはきちんと動いてるぞ。
>>221 パーサオブジェクトをnewするときに、NoExpand => 1 を指定する
方法はどうかと思って試してみたけど、使えないですねー。
つーか、XML::Parserのソースを読んでみたら、
entityを展開するあたりは「TO-DO」事項となってて、
まだコードも流動的みたいです。
230 :
名無しさん@お腹いっぱい。 :2001/05/30(水) 17:46 ID:OOYQyBGY
Perl で、Cの構造体みたいなのを つくるときは、リファレンスとハッシュで作りますよね? その場合で質問したいのですが、データ構造を「固定化」するのは どうやるのですかね。 つまり、 foo.str1 / foo.str2 みたいなメンバ(Cでいえば、ですけど)しか 許してないのに、foo.srt1 とかタイプミスしてるお馬鹿さんに エラーを出してほしいわけですよ。 ハッシュでやると、タイプミスでも、新たなキー、バリューのペアとして 認識されちゃうので・・・・。 ちなみに、constant pragma はダメっす。 やってみたけどうまくいかない。涙。
>>230 方法その一
擬似ハッシュを使う
#!/usr/bin/perl
use 5.005;
use constant NL => "\n";
$hash = [
{
a => 1,
b => 2,
c => 3,
},
"value a",
"value b",
"value c",
];
print $hash->{a}, NL; # $hash->[ $hash->[0]->{a} ] と等価
print $hash->{z}, NL; # 致命的エラー
#新たなフィールドを作成するには
$hash->[0]->{z} = 4; # まずIndexをいじってから
$hash->{z} = "value z"; # 値を入れる
__END__
方法その二 メソッドを介してのみアクセスする 方法その三 Tie::Hashを使って、 未定義のキーにアクセスしようとするとエラーを起こさせるクラスを書く。 (探せば既にCPANにあるかも知れない。)
233 :
CGI串 :2001/05/31(木) 00:38 ID:4JRetkV.
CGI串を作ってみたんだけど、ウェブメールみたいに、レスポンスヘッダのロケーションで飛ばされる場合、
目的のファイルにアクセスできないのですが、対処方法がありますか?
use Socket;
read(STDIN,$_,$ENV{'CONTENT_LENGTH'});
($par0,$par1)=split(/=/);
$par0="";
$par1=~tr/+/ /;
$par1=~s/%([0-9a-fA-F][0-9a-fA-F])/pack('C',hex($1))/eg;
while($par1)
{
$par1=~/^
http:\/\/ ([^:\/]+)([^\r\n]+)/;
$par1="";
socket(AUXFIL,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
connect(AUXFIL,sockaddr_in(80,inet_aton($1)));
select(AUXFIL);
$|=1;
select(STDOUT);
$|=1;
print AUXFIL "GET $2 HTTP/1.0\r\n\r\n";
while(<AUXFIL>)
{
s/\r*\n$/\r\n/;
if(/^set-cookie[\s:]+/i)
{
$par0.=$_;
next;
}
if(/^location[\s:]+([^\r\n]+)/i)
{
$par1=$1;
next;
}
if(/^content-type[\s:]+/i)
{
$par2=$_;
next;
}
if(/^\r\n$/)
{
$par2.=$_;
last;
}
}
close(AUXFIL) if $par1;
}
234 :
CGI串 :2001/05/31(木) 00:39 ID:4JRetkV.
if($par2=~/^content-type[\s:]+image\/(\w+)/i) { $par1='TMPFIL'; $par2="temp.$1"; open($par1,">$par2"); } else { $par1='STDOUT'; print $par0.$par2; } while(<AUXFIL>) { print $par1 $_; } close(AUXFIL); if($par1 eq 'TMPFIL') { close($par1); print $par0."content-type:text/html\r\n\r\n"; print "<html>\r\n"; print "<head>\r\n"; print "<meta http-equiv=\"content-type\" content=\"text/html;charset=x-sjis\">\r\n"; print "<title>image</title>\r\n"; print "</head>\r\n"; print "<body>\r\n"; print "<p><center><img src=\"$par2\">\r\n"; print "</center></p>\r\n"; print "</body>\r\n"; print "</html>\r\n"; }
(゚Д゚)ハァ? レスポンスのヘッダのロケーションを見て目的のファイルにアクセスすればいいだろ?
236 :
CGI串 :2001/05/31(木) 01:27 ID:???
>>235 書いたソースでも、ロケーションを辿っているのですが、目的のURLがロケーションの中に
出てこないんですよね。どうしてでしょう?
237 :
221 :2001/05/31(木) 02:43 ID:???
ありがとうございます。
>>229 そうなんですよ<NoExpandでできない
しょうがないんで、ファイルをパースする前に&を全部&に変換してます。
238 :
名無しさん@お腹いっぱい。 :2001/05/31(木) 02:44 ID:Tcn2CYCI
>>236 アクセスできなかったURLって、たとえばどこよ。
239 :
CGI串 :2001/05/31(木) 09:09 ID:hqu7A44A
240 :
CGI串 :2001/05/31(木) 09:10 ID:hqu7A44A
241 :
名無しさん@お腹いっぱい。 :2001/05/31(木) 14:40 ID:1N8fTgyg
オブジェクトからそのオブジェクトが属しているクラスの名前を呼び出すやり方は わかったのですが、オブジェクトから現在のオブジェクトの名前を呼び出すには どうしたらいいのですか?
「オブジェクトの名前」ってなに?例えばどんなの?
$objname = { foo => 'bar', hoge => 'fuga' }; $self= bless $objname; コレの"$objname"ってのが知りたいとか(ムリ
244 :
名無しさん@お腹いっぱい。 :2001/06/01(金) 16:51 ID:SCNbEuy6
自宅のローカルPCにApacheインストールして
perlもインストールして勉強してる人いますか?
ブラウザで
http://127.0.0.1/~***/index.html で表示できるようになりましたが
http://127.0.0.1/~***/*.plはそのまま文字列のまま 表示されたり、エラーが返ってきます。
↓のはCGIのためのPerl実践入門 技術評論者のp224のです。
#!/usr/local/bin/perl
$|=1;
print <<"HERE";
content-type: text/html
<html>
hello,world!
</html>
HERE
↑の場合は500servererrorになってしまいます。
*.cgi拡張子のサンプルはうまくいくのですが
*.plはトラブルばかりです。Apacheのconfファイルに
何か追加記述が必要なのですかね・・・。
245 :
名無しさん@お腹いっぱい。 :2001/06/01(金) 17:09 ID:9xf3QHUM
>>244 おれも Win2kにいちおうApache入れてます。
.plをCGIとして実行したいなら、httpd.confで
AddHandler cgi-script .cgi
を
AddHandler cgi-script .cgi .pl
とすればいいんじゃなかな?今試したら動きました。
246 :
名無しさん@お腹いっぱい。 :2001/06/01(金) 17:28 ID:SCNbEuy6
>>245 245さん、レスありがとうございます。
書かれたようにhttpd.confに追加記述してみました。
ですが、やはり500のエラーが返ってきてしまいます・・。
なんでなんでしょうね?
私もWin2000でApacheはc\webにapache.exe、
その下にwwwwというフォルダを作り*.cgiも*.plも置いて実行しています。
perlは
>>244 で書いてあるとおりパスのところへインストールしてあるんです。
もうちょっと格闘してみます。245さん、ありがとうございます!
突然ですが、ちょっと質問です CGIで 「ある時間になったら自動的に0にリセットされる」 プログラムってあるかな? 日にちごとのカウンターと言うのは 「本日のお客様は○○名です」と言うのは、最終更新した日と 現在の日が異なった場合リセットするのはわかってます。 最終更新した時刻に関係なく、夜の0時になったら自動的に カウンターがリセットされる。そんなプログラムってないですか?
cron CGIとは無関係だが
あれ…? STDINがキーボードの時、 eof(STDIN)をすると入力を促されるんですが、正常ですか?? % perl -e "print eof(STDIN)"
>>248 247ではないですが、cronの設定が出来ないサーバで擬似的にcronを
実装するにはどうしたら良いでしょうか?
ってそんな方法あるわけないか。
WINのhttpdで勉強してますけど、上級テクニックを覚えるためにはやはり
unix系のOSで勉強しないとイケマセンかねぇ・・・。
>>247 さん
$filename = 'times.dat';
print "いらっしゃいませ\n";
($tmday, $tmon, $tyear )
= ( gmtime( time + 9 * 60 * 60 ) )[3..5];
if( open fp,"$filename" ){
($mday, $mon, $year )
= split ',',<fp>;
close fp;
}
if( ($tyear>$year) or ($tmon>$mon) or ($tmday>$mday) ){
print "今日最初のアクセスです(´ー`)\n";
if( open fp,">$filename" ){
print fp "$tmday,$tmon,$tyear";
close fp;
}
}
基本はコレでいいかと。
252 :
251 :2001/06/02(土) 07:37 ID:???
>>251 さん
補足っす
> 最終更新した日と
> 現在の日が異なった場合リセットする
と
> 夜の0時になったら自動的に
> カウンターがリセットされる
は,見た目には同じことだと思って↑を書きました。
253 :
252 :2001/06/02(土) 07:38 ID:???
254 :
名無しさん@お腹いっぱい。 :2001/06/07(木) 11:10 ID:ym.eiAto
Perlのデータの型を調べる方法ってありませんか? Data::Dumperの出力を見ると数値を文字列をちゃんと識別してるようなのですが、 ソースを見ても分かりませんでした。 よろしければご教授願います。
255 :
名無しさん@お腹いっぱい。 :2001/06/07(木) 13:02 ID:XmkeoP0E
>>254 とりあえず、ref $var; とかやってみれ。
String なのか int なのかを調べたいって言うなら、
print "int" if ($var eq $var+0);
とかかな?
256 :
名無しさん@お腹いっぱい。 :2001/06/07(木) 13:29 ID:v985Z4cI
ヒアドキュメントの中で計算をすることってできますか? (例 $foo=$bar=1; print <<"EOF"; $foo+$bar EOF これだと「1+1」 って表示されますよね?「2」って表示したいんですが、、、 その前で$hoge=$foo+$bar; として$hogeを表示すればいいのはわかるんですが あんまり一時変数をつくりたくないもんで、、、 なにか、トリッキーでもいいんで一時変数を作らなくていいやり方などないでしょうか?
>>256 ヒアドキュメントじゃないとダメなの?
ヒアドキュメントじゃ出来ないと思うけど。
$foo=$bar=1;
print <<"EOF";
なにか
EOF
print $foo+$bar;
print <<"EOF";
なにか
EOF
258 :
e2j :2001/06/07(木) 14:03 ID:???
>>256 キリ番おめでとう
#!/usr/bin/perl
$foo = $bar = 1;
print <<EOD;
${\
($foo + $bar) # 括弧は必須
}
@{[
$foo + $bar # 括弧は不要
]}
EOD
__END__
259 :
名無しさん@お腹いっぱい。 :2001/06/07(木) 14:16 ID:v985Z4cI
>>257 かっちょいい答えありがとうございます!
リファレンスを使うのかな?とか思ってたんですけど
やはり(?)そういうかんじですかね。
${\($foo + $bar)}
んーでもどうしてそうなるのか若んないや。
()の中は2になるわけだから
スカラー変数のリファレンスに"\2"を渡してるわけですよね。
\ってのはどういう意味があるんだろ、、、
260 :
名無しさん@お腹いっぱい。 :2001/06/07(木) 14:19 ID:v985Z4cI
>>257 あ、確かにそういう風なやり方もできるんですけど
ヒアドキュメントを途切れないように長く続けたいんですよ。
(続いてないとhtmlデザインとプログラムの分離が起こってしまうから)
しかも単純な計算をするところはヒアドキュメントの中でやればわかりやすいですよね。
(ヒアドキュメントの前で計算して変数を作るより)
結構わがままな望みでしたけどね(^^;
261 :
名無しさん@お腹いっぱい。 :2001/06/07(木) 14:20 ID:v985Z4cI
262 :
e2j :2001/06/07(木) 14:29 ID:???
"\"ってのはリファレンスを得る演算子です
$foo = 2;
$bar = \$foo;
print ${ $bar };
print ${ \ 2 };
>>258 に追加
無茶苦茶ですがこういうことも可能です。
print EOD;
${\do{
use strict;
print "Hello world\n";
my $foo = my $bar = 1;
foreach my $i(0 .. 5){
$foo += $i;
}
$foo + $bar;
}
EOD
263 :
名無しさん@お腹いっぱい。 :2001/06/07(木) 14:34 ID:v985Z4cI
>>262 うひゃ、、、さすがにそこまでやるとなると
ヒアドキュメント切ります、、、
しっかしそんなこともできるんですねー
勉強になりました。
264 :
254 :2001/06/07(木) 14:49 ID:???
>>255 いや、そういうわけではなく、
例えば "1" と 1 の違いを調べることが出来るのか、
という事を知りたいのです。
数値じゃない文字列に0+をすると-wの元で警告が出るのも嫌ですし。
265 :
257 :2001/06/07(木) 14:57 ID:???
>>258 そんな事が出来るのか・・・。
勉強になりました。
サンクス。
>>264 Perlでは数値と文字列を区別しない。
これが素人ウケするところ。
だから"1"を数式にも使える。
267 :
254 :2001/06/07(木) 15:15 ID:???
>>266 それは承知ですが、それでも区別したいんですよ。
Data::Dumperでは確かに区別されているので、方法はあると思うのですが。
#!/usr/bin/perl
use Data::Dumper;
my @list = (1, '2', 0+'3', 4 . "");
print Dumper(\@list);
__END__
>>267 Perlは内部で数値と文字列を区別してるよ。ただ、
>数値じゃない文字列に0+をすると-wの元で警告が出るのも嫌ですし
が「数値か文字列か知りたい」理由ならば、use warningsして、numeric警告
をオフにするのが一番。
この辺りはperldoc perlexwarnが詳しい。
#!/usr/bin/perl -w
use warnings;
{
no warnings qw[ numeric ];
$str = "ABC";
print $str * 5;
}
-------
0 (-w,-Wでも警告無し)
------
あと、内部でどのようにデータが格納されているかを知りたければ、
Devel::Peekの出力が助けになるかもしれない。
-----------
#!/usr/bin/perl -w
use Devel::Peek;
$str = "15";
$int = 15;
Dump($str);
Dump($int);
-----------
SV = PV(0x176eb98) at 0x1765768
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x176020c "15"\0
CUR = 2
LEN = 3
-----------
SV = IV(0x1763ce8) at 0x1765774
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 15
-----------
構造体のFLAGSメンバに注目。IOK,POKの意味についてはperldoc perlgutsほか、
http://gisle.aas.no/perl/illguts/ を読むのがいい。
>構造体のFLAGSメンバに注目。 じゃなくて、(flagsメンバなんて無いし) SV = PV(0x176eb98) SV = IV(0x1763ce8) ここら辺ね。 あと、口調が変に偉そうになったのは申し訳ない。
なんか勘違いしてた。
>ソースを見ても分かりませんでした。
おそらく、Dumper.pmを読んだのだと思われるけれど、
Data::Dumper::Dumper()は大抵Dumpxsを呼ぶから、
おそらSvTYPE()マクロあたりで数値型か文字列型かを
判別しているのではないかと思うよ。
・・・とにかく、Dumper.xsを読めば分かると思ふ。
試しに、>267のスクリプトを
#!/usr/bin/perl
use Data::Dumper;
my @list = ("w",1, '2', 0+'3', 4 . "");
print Data::Dumper->Dumpperl([\@list]);
としてXSを呼ばないようにして、違いを比べてみては?
それと、昔
http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 の828,829辺りで同じ事を書いた記憶が。
271 :
254 :2001/06/07(木) 21:00 ID:???
>>270 Perl内部の事はわかりません(泣)
が、一応求める答えはわかりました。
Data::DumperはXsubを使ってたんですね…
お手数かけました。ありがとうございます。
うー、もしかしてWindowsだとDB_Fileの$DB_RECNOって使えないんでしょうか。
274 :
272 :2001/06/08(金) 00:40 ID:???
>>273 このコードが動きません…。
間違ってはいないですよね…?
#!/usr/bin/perl
use DB_File;
use Fcntl;
use strict;
use warnings;
my @file;
my $db = tie @file , DB_File => 'hoge.dat' , O_RDONLY, 0666, $DB_RECNO
or die "can't open hoge.dat: $!$^E\n";
__END__
276 :
272 :2001/06/08(金) 00:55 ID:???
>>275 D:\> perl foo.pl
can't open hoge.dat:
D:\>
空です…わけ分からんです
>>276 #!/usr/bin/perl
use DB_File;
use Fcntl;
use strict;
use warnings;
my @file;
my $db = tie @file , DB_File => 'hoge.dat' , O_RDWR | O_CREAT, 0666, $DB_RECNO
or die "can't open hoge.dat: $!$^E\n";
ファイルが存在しなかった場合、作成するようにしないと。(O_CREAT)
詳しくはperldoc -f sysopen
278 :
名無しさん@お腹いっぱい。 :2001/06/08(金) 02:15 ID:cJiaW2fQ
メールアドレスをsendmailのBccに入れたいのですが入ってくれません。
$HOGE{$in{'hoge'}}に値が入っていることは確認できています。
%HOGE = (
'A','
[email protected] ',
'B','
[email protected] ',
);
open(OUT,"| $sendmail -t");
print OUT "To: $mailto\n";
print OUT "From: $mailfrom\n";
print OUT "Bcc: $HOGE{$in{'hoge'}}\n";
print OUT "\n";
途中で、
$mailbcc = $HOGE{$in{'hoge'}};
として
print OUT "Bcc: $mailbcc\n";
のようにしてもダメです。何がいけないんでしょう?
279 :
278 :2001/06/08(金) 02:17 ID:???
ちなみに、メールはBcc以外ちゃんと届きます。
>>278 -279
普通はこれで問題なくBcc:に送れるよなー。
OSやsendmailのバージョン書いてみたら?
メールって改行はCRLFじゃなかったっけ? この問題とは多分関係ないけど。
282 :
278 :2001/06/08(金) 10:43 ID:0V.Sa7B.
うーむ、やっぱり何かがおかしい? FreeBSD 4.2 のバーチャルホスト Sendmail 8.11.2 です。
283 :
276 :2001/06/08(金) 11:28 ID:???
>>277 いえ、ファイルが存在するのは確認済みですよ、当然。
だから何か別の…って、ありゃりゃ成功した!?
そんな…?
って、O_CREATを外しても成功…?
.
.
.
…これは…どうもRDONLYでオープンすることは出来ないって事らしいです。
ううぅ…かなり悩みましたが、これって仕様なんでしょうか。
284 :
276 :2001/06/08(金) 14:13 ID:ikkb28As
DB_Fileの配列…むっちゃ速いですね… indexがあるわけではないのに何故こんなに速いんでしょうか Benchmark: timing 10000 iterations of DB_File, getline... DB_File: 3 wallclock secs ( 2.58 usr + 0.00 sys = 2.58 CPU) @ 3875.97/s (n=10000) getline: 4 wallclock secs ( 3.68 usr + 0.00 sys = 3.68 CPU) @ 2717.39/s (n=10000)
285 :
276 :2001/06/08(金) 14:14 ID:ikkb28As
↑ #!/usr/bin/perl use DB_File; use Fcntl; use strict; use warnings; use Benchmark; my @file; my $db = tie @file , DB_File => 'hoge.dat' , O_RDWR, 0666, $DB_RECNO; open IN, 'hoge.dat'; binmode IN;my($t_length, $s, $i, @index) = (0);sub getline($); my @list = (1, 100, 1000, 2000, 3000, 5000, 10000); push @list, reverse @list; timethese(10000, { DB_File => sub{ foreach $i(@list){ $s = $file[$i]; } }, getline => sub{ foreach $i(@list){ $s = getline($i); } }, }); sub getline($){ my $n = shift; if(defined($index[$n])){ seek IN, $index[$n], 0; return scalar(<IN>); } local $_; while(<IN>){ $index[$.] = ($t_length += length($_)); $. == ($n +1) and last; } return $_; } __END__
286 :
名無しさん@お腹いっぱい。 :2001/06/08(金) 16:00 ID:GuCXLnfI
perlでcookieを相手に送るには どうしたいいんでしょうか?
287 :
286 :2001/06/08(金) 16:01 ID:GuCXLnfI
らが抜けてますな、、 よろしくお願いします
>>287 print "Set-Cookie: $cookie\n";
言うまでも無いが、$cookieには適切な書式のクッキーが入っているものとする
289 :
名無しさん@お腹いっぱい。 :2001/06/08(金) 20:40 ID:eaozRcTQ
カールさんのサイトって今どこかにありますか? あったら教えてください。検索してもリンク切れのところばっかりで。
sendmailでReceivedを隠す(または偽装)方法ってありますか? ちょっとした事情で必要なのですが・・・・・ よろしくおねがいします。
> ちょっとした事情 SPAM
> ちょっとした事情 ボム
> ちょっとした事情 MLでジサクジエン
295 :
名無しさん@お腹いっぱい。 :2001/06/08(金) 22:45 ID:uMb8RtP.
ちょっとずれているかもしれないが、Web中継のことで質問です。 あれって、一体どのようにやればいいのでしょうか? どんな道具が必要なのか、是非教えて下さい。 簡単にいうと、赤ちゃんが生まれいくまでの過程を全世界中に オンラインムービーを流す技術が欲しいのです。
296 :
295 :2001/06/08(金) 22:47 ID:uMb8RtP.
あっ、別に赤ちゃんじゃなくて、ディープな車レースを流したいだけです。
297 :
289 :2001/06/09(土) 13:24 ID:y1DFOqBY
CGIスクリプトを配布してるところでお願いします。 もうないんでしたっけ?
勝手に流していいのか?
299 :
295 :2001/06/09(土) 17:40 ID:aiiOiIcw
>>298 いいですよ。某会社の常務からの依頼ですので、
許可とやらの問題はありません。
わっ、タイムスリップ・・・ 鬱だし脳
303 :
名無しさん@お腹いっぱい。 :2001/06/09(土) 23:53 ID:GnWQlRGQ
情けない質問で申し訳ないが質問させてください。 FreeBSD 4.2 / apache 1.3.20 にてperlのCGIを実行させたく 試行錯誤しているのですが、巧く行かずに苦労しています。 現在は〜/apache/cgi-bin/printenv の実行は正常に行われる環境です。 実行させたいperlスクリプトは、KENT-WEBさんのYY-BOARDです。 どう、巧く行かないのかと言いますと、perlを見つけられない???のではないかと。 試しにtelnetで該当dirに行きまして、./yybbs.cgiとタイプしますと >./yybbs.cgi: コマンドが見つかりません. と怒られてしまいます。 ですが、perl5 ./yybbs.cgiとタイプしますと希望の結果が帰って来ます。 yybbs.cgi1行目のperlへのパス指定は合っているハズなのにどうして こんな事になるのでしょうか??? 何方かアドバイスしていただけますでしょうか。
304 :
名無しさん@お腹いっぱい。 :2001/06/09(土) 23:55 ID:Stf2UWrU
305 :
名無しさん@お腹いっぱい。 :2001/06/09(土) 23:57 ID:GnWQlRGQ
>>304 説明不足でした。
ブラウザでの表示は403 Forbiddenとなっています。
けど、、、うぅーむ???
馬鹿ですか?ワタシ
chmod 755 ./yybbs.cgi
307 :
303 :2001/06/10(日) 00:04 ID:4dlL9Pdo
>>306 確かに755としています。
ちなみにapacheのUserはnobodyからhttpdというユーザに変更
していますが、弊害ありますでしょうか?
308 :
306 :2001/06/10(日) 00:07 ID:???
んじゃ、 > yybbs.cgi1行目のperlへのパス指定は合っているハズなのに がまちがってるんでは? 1行目と which perl5 の結果でも見比べてー。 それ以上はわからん。
309 :
303 :2001/06/10(日) 00:13 ID:4dlL9Pdo
>>308 httpd.conf中の
Options Indexes FollowSymLinks
を
Options Indexes FollowSymLinks ExecCGI
に変更するのを忘れていたようです。大変失敬。
で、状況が変わりました。
ブラウザでは500 Internal Server Errorとなっており、
error.logには、Premature end of script headersが記録されました。
ん〜???
310 :
306 :2001/06/10(日) 00:25 ID:???
そのエラーだとどうせ改行コードだろ・・・・ なんか疲れた。
ヘッダ吐かずに死んだな。
312 :
名無しさん@お腹いっぱい。 :2001/06/10(日) 00:31 ID:M/Q/m3rw
えっと、ディレクトリにあるファイルの名前を取得して、リストにい れたいですが、どうしたらいいでしょうか?
313 :
306 :2001/06/10(日) 00:31 ID:???
と言うか、 > 試しにtelnetで該当dirに行きまして、./yybbs.cgiとタイプしますと > >./yybbs.cgi: コマンドが見つかりません. > と怒られてしまいます。 をまず直せ。 CGI以前の問題。 多分、/usr/bin/perl5\r とか言うファイルを探しに行くからエラーになるの。 改行コードの問題じゃなければ、/usr/bni/perl5 とかを探しにいって略。 何も考えずにエラーメッセージをGoogleに突っ込んだら山ほど出てくるんだから、 多少は自分で考えたほうがいいと思うぞ。
opendir DIR, "./"; @dir = readdir DIR; closedir DIR; print "$_\n" for (@dir):
315 :
303 :2001/06/10(日) 00:38 ID:4dlL9Pdo
>>313 手を煩わせて申し訳ない。自分でもあれこれ探してはいるのですが…
>コマンドが見つかりません
これを解決しないことには、とは自分も考えています。
改行コードの問題は知りませんでした。
出直してきます。
316 :
312 :2001/06/10(日) 00:43 ID:???
317 :
306 :2001/06/10(日) 00:47 ID:???
>>315 これで最後ね。
とりあえず、1行目の最後に -- を付けて、
#!/usr/bin/perl5 --
とか(もちろん自分の環境に合った奴)に変えてみ。
改行コードが原因なら ./yybbs.cgi で起動しないのはこれで直るはず。
原因は自分で調べること。
318 :
303 :2001/06/10(日) 01:13 ID:4dlL9Pdo
>>317 大変良く理解出来ました。
やはり改行コードの問題だったようです。
有難う御座いました。
319 :
名無しさん@お腹いっぱい。 :2001/06/10(日) 10:11 ID:fkqIyGrs
320 :
名無しさん@お腹いっぱい。 :2001/06/11(月) 01:55 ID:8pqT6lXA
WebProgの意味がわかりません。 誰か教えてください。お願いします。
321 :
名無しさん@お腹いっぱい。 :2001/06/11(月) 02:38 ID:KPOx6cx2
322 :
名無しさん@お腹いっぱい。 :2001/06/11(月) 10:31 ID:TvlqC4OU
ヒントだけでいいんで教えてください。 SAFEってありますよね。 変数のネームスペースにおけるCHROOTみたいなの。 あれの原理って・・・? Perlには、あれを行うための秘密の機能とかがあるのですか? モジュールのソースを読んだんですが、原理がわからんです。
323 :
名無しさん@お腹いっぱい。 :2001/06/11(月) 23:07 ID:pKfL8KNc
>>321 有り難うごさいます。
このタイトルは、初めて来る人はわからないと思います。
Web_PG
こう書いてくれると助かる。
324 :
名無しさん@お腹いっぱい。 :2001/06/11(月) 23:48 ID:4YVegt0Y
カンマ区切りで書かれた a.csv の、 4番目の項目が「ok」だったら、 その行の3番目と6番目のセルをタブ区切りで b.csv に保存する。 というのはどうしたらいいでしょう?
#!/usr/bin/perl
use IO::File;
use strict;
my $a = IO::File->new('a.csv');
chomp(my @b = grep{ (split/,/)[3] eq 'ok' } IO::File->new('a.csv')->getlines);
IO::File->new('>b.csv')->print( map{ join("\t", (split/,/)[2, 5]) . "\n" }@b );
__END__
>>324
ぬ、4行目の"my $a ..."は不要ね
>>325 -326 さん、ありがとう
ばっちりでした。感謝感謝!!
>>322 ヒントになるかどうか分からないが。
#Safe.pm(209-222)
return Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub);
# $root には"Safe::Root1"のような文字列 $obj->{Mask} は制限用ビットマスク
# $evalsub はcoderef
/* Opcode.xs(257-295) */
void
_safe_call_sv(Package, mask, codesv)
char *Package #一時的なパッケージ
SV *mask #opコード制限マスク
SV *codesv #実行するサブルーチン
PPCODE:
[中略]
ENTER; #スコープに入ります
[中略]
# 内部API関数 void Perl_save_hptr(pTHXo_ HV** hptr) を呼び出し、
# 他パッケージへのポインタを格納した最上位スタッシュ defstash への
# ポインタを一時待避させる。(スコープ終了時に自動回復)
save_hptr(&PL_defstash);
# 内部API関数 HV* Perl_gv_stashpv(pTHX_ const char *name, I32 create)
# により、パッケージ名 Package のHV(スタッシュ)へのポインタでdefstash
# (メインスタッシュ)を置き換える。
# パッケージ名 Package が存在していなければ(あり得ない)
# GV_ADDWARN により警告
PL_defstash = gv_stashpv(Package, GV_ADDWARN);
[中略]
# 引数として与えられたcodesv(SV*にキャスト済み)を呼び出す。
perl_call_sv(codesv, GIMME|G_EVAL|G_KEEPERR);
[後は眠いので略]
#間違いが有れば教えて欲しひ。
一時的なパッケージ -> 一時的な*ルート*パッケージ
330 :
教えて坊主 :2001/06/12(火) 09:05 ID:qzJs/a5U
すみません。今LWP使っていろいろ試してるんですが、LWPで取得してきた HPに画像ファイル(.jpg)があったとして、それを自分のPCに保存する プログラムを書いています。(ようは右クリックして保存を自動化するもの) どうも上手くいかないので、わかる方いましたら教えてください。 宜しくお願いします。
331 :
名無しさん@お腹いっぱい。 :2001/06/12(火) 09:35 ID:M/ZGscH2
>328さん ふむふむふむ。 やはり、Perlの秘密(でもないのかな?)の 内部関数を呼び出していたのですね。 このヒントを頼りに、自力(←もう他力になってるけど(爆笑))更生を 目指します。
332 :
名無しさん@お腹いっぱい。 :2001/06/12(火) 11:44 ID:sehxFmlg
<input type="radio" name="hobby" value="野球"> <input type="radio" name="hobby" value="テニス"> として、両方$hobbyにぶち込みたいのですが、 DBに登録するときには、最後の一個しか入りません。 &hobby=....&hobby=....&となるせいなのですが。 初心者スミマセン
>>332 <input type="checkbox" name="hobby1" value="野球">
<input type="checkbox" name="hobby2" value="テニス">
>>330 間違っても共用鯖ではやらないように。
#!/usr/bin/perl
#getimage.pl
use LWP::Simple;
binmode(STDOUT);# Windowsでは必須
print get(shift);
__END__
C:\> perl getimage.pl
http://hoge.net/foo/bar.image > bar.image
>>332 Queryを解析する時に
$data{$name} .= ", $value";
とでもすればよろしい
335 :
324 :2001/06/12(火) 14:24 ID:cGbuu4QE
度々すみません。
>>325 でrubbish_listerさんに教えていただいた
#!/usr/bin/perl
use IO::File;
use strict;
IO::File->new('a.csv');
chomp(my @b = grep{ (split/,/)[3] eq 'ok' } IO::File->new('a.csv')->getlines);
IO::File->new('>b.csv')->print( map{ join("\t", (split/,/)[2, 5]) . "\n" }@b );
__END__
で、6番目の項目が重複していたら b.csv に書き出さない、
とするにはどうしたら良いでしょう?
#!/usr/bin/perl
use IO::File;
use strict;
my %exists;
IO::File->new('>b.csv')->print(
map{ sprintf("%s\t%s\n", @{ $_ }[3, 6]) }
grep{ $_->[4] eq 'ok' and not $exists{ $_->[6] }++ }
map{ chomp; [ undef, split /,/ ] }
IO::File->new('a.csv')->getlines
);
__END__
>>335 あまり大きなファイルを処理するのには向かないが
たとえば、 ../index.html<br> ../doraemon.html<br> ../nobita.html<br> 以下続く・・・ というふうにしたいのですが、 $chon = "../"; print << "EOF"; $chonindex.html $chondoraemon.html $chonnobita.html EOF とすると $chonindex.htmlやら$chonnobitaやらの変数があることに なって困っています。どないしたらいいでしょうか?
338 :
tkx :2001/06/12(火) 16:52 ID:9FWW9dnw
<form action="〜.cgi" method="post" target="_blank"> 〜 </form> という風に別ウインドウにCGIをpostで引き渡すのって反則なんでしょうか? IE5.5+winやNN4.7+winでは問題なく作動するんですがNN6.0+winではpostした内容が一切引き渡されないんです。 NN6.0+winのバグであれば、これを回避する方法ってないでしょうか?
>>337 $chon = "../";
print << "EOF";
${chon}index.html
${chon}doraemon.html
${chon}nobita.html
EOF
俺も昔引っかかった。
340 :
名無しさん@お腹いっぱい。 :2001/06/12(火) 17:08 ID:Ah5wBUQA
ちょっと教えてください。 時間を使いたいんです。 例えば $date_now ;#現在の日時 $date_soon ;#現在から1ヵ月後 とした場合、$date_nowの方は ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); で取れますよね? 一ヵ月後となると。。。難しいですか? 今現在はPostgreSQLに一回$date_nowを落としてから1ヶ月足して それを$date_soonに入れなおしてますがあまり効率的ではないような 気がするんで。。。
>>340 1月31日の一ヶ月後は何月何日にしたいの?
30日後とかなら簡単だよ。
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time+60*60*24*30);
じゃないのかな。
343 :
340 :2001/06/12(火) 17:40 ID:Ah5wBUQA
>>341 それだと13月とかでませんか?
>>342 2月28日にしたいんですが難しいですか?
閏年とかも計算して。。。
今のままの方がやっぱり楽なんですかね(^^;
>>340 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
@dayinmonth = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$year+=1900;
($year_next, $mon_next, $mday_next) = ($year, $mon, $mday);
$year_next++ if $mon == 11;
$mon_next++;
$uruu = 1 if $mon_next == 1 && ($year_next % 400 == 0 || ($year_next + 1900) % 4 == 0 && $year_next % 100 != 0);
print "$dayinmonth[$mon_next]\n";
print "$uruu\n";
$mday_next = $dayinmonth[$mon_next] + $uruu if $mday_next > ($dayinmonth[$mon_next] + $uruu);
う゛〜、ぜんぜんスマートじゃないけど。。。。
あ゛〜、ミスまでまじってるし。6行目の$year_next + 1900は$year_nextです。
それか、こんなのかなぁ。 $time_temp=time(); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time_temp); $time_temp+=60*60*24*31; do { (undef, undef, undef, $mday_next,$mon_next, $year_next,,,) = localtime($time_temp); print "$year_next $mon_next $mday_next\n"; $time_temp-=60*60*24; } while ($mday_next > $mday || $mon_next != ($mon + 1) % 12);
あ゛〜、確認用コードが残ってた。。 print "$year_next $mon_next $mday_next\n"; は要らないです…はぁ〜なにやってんだろ。
モジュールありそうな気がします 私は探してないですが探してみたらどうですか
ん〜、Date::Calc とかつかってみたら? 使ってないからどうかわからんけど。
350 :
335 :2001/06/12(火) 21:18 ID:???
>>336 rubbish_listerさん
再びたいへんありがとうございました。
非プログラマな私には救世主です。
351 :
337 :2001/06/13(水) 00:28 ID:???
352 :
名無しさん@お腹いっぱい。 :2001/06/13(水) 00:28 ID:mJODJwMk
jcode.pl と jcode.pm とではどちらを使用するのが、 良いでしょうか。自分のPCだけでの使用範囲です。
Jcode.pm
別にどちらでも構わないと思いますよ。 ただ、予め文字コードが分かっていて、半角カナを使わないのなら 文字コード変換はNKF.pmの方が圧倒的に高速でした。 参考にどうぞ。
NKF.pm は使い方がいまいちわからない・・・・・
357 :
(-_- :2001/06/13(水) 08:05 ID:20J.4Zf6
cgi.pmを使用してparam()でフォームの内容を取得して 文字コード変換をおこなうのは可能ですか?
358 :
340 :2001/06/13(水) 10:46 ID:5WiWUamY
T女の竹田様 ありがとうございます。 スクリプトも大変勉強になりましたが、何事もめんどくさがらずにやると いう姿勢も学ばせていただきました。
>>359 「cgi.pmを使用して」がどこにかかるかによらない?(国語の問題)
「文字コード変換を行う」にもかかると考えると無理っぽい。
361 :
341 :2001/06/14(木) 20:15 ID:???
>>343 if ($mon eq 13){
$mon=1
}
362 :
名無しさん@お腹いっぱい。 :2001/06/14(木) 21:07 ID:zRHTE03A
perlとは関係ないかもしれませんが、 ゆいちゃっとのkill.datの書き方がわかりません。 どなたか教えていただけないでしょうか
363 :
名無しさん@お腹いっぱい。 :2001/06/14(木) 21:51 ID:elt2x50M
ファイルの更新日時を変えたいんですが 追加オープンしてみたんですがうまくいかないようです。 上書きオープンならなんとかなるんですが なるべくファイルを書き換えずに変更したいんです。 どうしたらいいんでしょうか?
364 :
名無しさん@お腹いっぱい。 :2001/06/14(木) 21:53 ID:q9Gx71xM
漢字のパターンマッチングをやりたいんですが、うまくいきません。 教えてくださ〜い。 if($moji ne ~/[亜-龠]/ ) これで、$mojiが、漢字じゃなかったら、って感じになると思うんですが、うまくマッチングしません。何故でしょうか?
utime
366 :
名無しさん@お腹いっぱい。 :2001/06/14(木) 23:36 ID:HVlmJCFw
>>364 ・ 「=~」演算子の否定形は「ne ~」じゃなく「!~」。
・ 漢字のマッチは日本語モードでないと実行できない。
#!/usr/local/bin/perl -Lsjis
・・・
if ($moji !~ /[亜-龠]/)
・・・
367 :
名無しさん@お腹いっぱい。 :2001/06/15(金) 04:39 ID:r3DAHg.Y
>>366 さん、ありがとーございます!!
で、それを実行してみました。そしたら、、
Internal Server Errorがでます。
たぶん、
#!/usr/local/bin/perl -Lsjis
これが原因だと思うのですが、エラーを出なくするには、どうしたらよろしんでしょうか?
宜しくお願いします。
この呪文は勿論、プログラムの最初に記述するのですよね?
368 :
ななしサソ :2001/06/15(金) 09:24 ID:JAlA10oI
formから送られてくるデータを格納の際の質問です。 <textarea>内の改行をそのままデータとして処理したいのです。 この改行と1レコードを区切る改行は、皆様どう区別されているのでしょうか? 1.データに入れる際に→すべて<BR>に置換する。 2.データにはそのまま入れ、表示するときに<BR>に置換する。 HTML表示だけならば1でよさげですが、1.2両方とも CSV吐き出しでほかのアプリケーション(たとえばエクセル)で 扱うときに問題がありそうですが・・・。 1.だと文章中に<BR>があってわけわからん。 2.だとレコード構造が壊れる or 改行が"・"とか表示? \r, \n \r\nと使い分けできるのかな?
データの保存形式によるのでは 私の場合は,1データ1行のデータとか1行で一つの内容を表すとかそういった場合は1(必ずしも<br>にするとは限らないけど) xmlで保存だったらそのままかな というかHTML表示もCSV吐き出しも原理は同じかと思われ
370 :
名無しさん@お腹いっぱい。 :2001/06/15(金) 11:29 ID:7EF0hPLo
ファイルの内容を置き換えてコピーするスクリプトをつくったのですが、 スペースのところで改行されてしまいます。 配列そのままをコピー先のファイルに書き込むと、 もんだいはないのですが・・ よい方法ありませんか? open(FILE_TO,">>file_to"); open(FILE_FROM,"file_from"); # modify string @string_array = <FILE_BASE>; foreach $string(<@string_array>){ $string =~ s/hogehoge/foofoo/; print FILE_TO $string; print FILE_TO "\n"; } # write to file close(FILE_TO); close(FILE_FROM);
371 :
S :2001/06/15(金) 11:38 ID:O2mrj.vg
>>370 「スペースのところで」という意味がよくわかませんが…。
$string に改行が入ったままなので、
print FILE_TO $string ですでに改行されてます。次の行でさらに
print FILE_TO "\n"; とする必要はないです。
あ、先越されちゃった(^^;)
>>370 書き間違いだと思うけど、
FILE_BASEはFILE_FROM、あと<@string_array>は@string_arrayだよね。
念のため。
373 :
370 :2001/06/15(金) 13:42 ID:???
コピー元 <META name="GENExxxx コピー先 <META name="GENExxxxx って感じだったんです。 >FILE_BASEはFILE_FROM、あと<@string_array>は@string_arrayだよね これが原因でした。 直したらうまくいきました。 半日なやんだ原因がこれだけだったとは・・ でも思い切って聞いてみてよかった。 ありがとうございました
374 :
ななしサソ :2001/06/15(金) 15:58 ID:JAlA10oI
>369 サンクソ >というかHTML表示もCSV吐き出しも原理は同じかと思われ そうなんですど、つまり今度はデータとして使いたいときに、 改行があるから、レコードがおかしくなりますよね? ($1 tab $2 tab $3 tab \n)で1レコードなのに、 $2の中に\nが入ってる訳です。 ($1 tab $2 tab $3 tab \n)が2レコードになってしまいます。
375 :
ななしサソ :2001/06/15(金) 15:58 ID:JAlA10oI
>369 サンクソ >というかHTML表示もCSV吐き出しも原理は同じかと思われ そうなんですど、つまり今度はデータとして使いたいときに、 改行があるから、レコードがおかしくなりますよね? ($1 tab $2 tab $3 tab \n)で1レコードなのに、 $2の中に\nが入ってる訳です。 ($1 tab $2 tab $3 tab \n)が2レコードになってしまいます。
376 :
名無しさん@お腹いっぱい。 :2001/06/15(金) 17:02 ID:m1xvu7Zs
>>374 吐き出したCSVをそのまま別アプリで読みたいってわけ?
ならそのソフトが読める形式でデータ吐くしかないでしょ。
378 :
ななしサソ :2001/06/15(金) 17:25 ID:JAlA10oI
>377 おぅ、サンクソ!!! 印刷して、今晩ゆっくり勉強します。 >376 CSV→SQLで読める形式変換Perl書いてくだしゃい。 ODBC使ってもゴミと一緒に改行吐き出しやがるし、(バグ?) いったいどうすりゃいいんだ?
クソクソうるせーぞ。黙れ。
ごめんクソ(大爆笑)
381 :
363 :2001/06/15(金) 22:29 ID:???
>>365 utime で変更日時とアクセス日時変更できるんですね。
ありがとうございます。
これから試してみることにします。
382 :
名無しさん@お腹いっぱい。 :2001/06/16(土) 01:30 ID:s.BBQbAs
open(LOG,">>./log.dat")などとファイルに追加書き込みする場合、 ファイルロックは不要なのでしょうか。
プロセスA プロセスB ファイルX ↓ ↓ ↓ writeシステムコール ↓ ↓ ↓ ↓ Xに"hoge"を出力せよ writeシステムコール ↓ ↓ ↓ h Xに"foo"を出力せよ h ↓ ↓ ↓ o f hof ↓ ↓ ↓ g o hofgo ↓ ↓ ↓ e o hofgoeo ↓ (´д`)マズーー
なるほど。
open(OUT, "+< outfile.txt"); flock(OUT, 2); truncate(OUT, 0); seek(OUT, 0, 0); print OUT "........"; close(OUT); と書いた場合、ロックが解除されるまで別プロセスは待つのでしょうか。 open(OUT, "+< outfile.txt") || die("ファイルオープンに失敗\n"); と書いた場合はロックがかかっていると書きこまずに終了してしまうので、 確実に書きこみをさせたいのです。 また、1つのファイルに対して読みこみ→処理→書きこみとする場合、 読みこみの時からロックするべきなのでしょうか。
openの成功はflockに関係ないが…。 何か疑問があればまずテストしてみてはどうだろうか。
387 :
名無しさん@お腹いっぱい。 :2001/06/16(土) 23:48 ID:2gIPolvU
>>382 -384
>open(LOG,">>./log.dat")
(1) writeがアトミック動作
(2) openにappendモードがある
が満たされてればロック不要でしょ。
だからUNIX系やWin2000ならロック不要。
Win95はどうだったかな・・・。
「writeがアトミック」を満たすにはsyswriteを使わなくてはだめでわ?
389 :
387 :2001/06/17(日) 14:33 ID:kJNCMImk
>>388 あ、そのとおりだね。syswriteじゃないと、でかいデータは
複数回に分けて書き込まれるのでアトミック性がなくなる。
390 :
名無しさん@いつも空腹 :2001/06/17(日) 16:56 ID:zspd2eTk
掲示板などのCGI起動回数をカウントするにはどうすれば良いですか? 最近、私のホームページにアクセスする人の多くは 掲示板(bbs.cgi)を直接ブックマーク登録しているらしく アクセスカウンタが寂しい状態です
>>390 掲示板にカウンタをつけてトップページと共有する
392 :
名無しさん@お腹いっぱい。 :2001/06/17(日) 19:56 ID:m7qST3dg
会社に好きなおねーちゃんがいるんです。 そのおねーちゃんをひーひー悦ばすぱーる教えてください。 やっぱり真珠埋め込みですかね。
>>392 初心者がいきなりモジュール等に頼るのは感心しません。
まず基礎的な知識を覚えてから経験をつみましょう。
真珠が気持ちいいと思ってるのは馬鹿なヤクザだけ 無知な童貞逝ってよし
ハハハ
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ^∀^)< あほか この低脳が
>>392 ( つ ⊂ ) \_________
.) ) )
(__)_) (^∀^)ゲラゲラ シネ
396 :
名無しさん@お腹いっぱい。 :2001/06/18(月) 09:09 ID:fCtvXMRU
392曰く 真珠が気持ち良くないって言ってるのは、 真珠入りヤクザにケツほられたことない 男だけ とのこと。
397 :
名無しさん@お腹いっぱい。 :2001/06/18(月) 09:46 ID:cfKmX2RE
>>387 syswriteってバッファリングしないって事ですよね?
やっぱり、一つのファイルをガリガリ読み書きする場合、
相当パフォーマンスは落ちるのでしょうか。
399 :
名無しさん@お腹いっぱい。 :2001/06/18(月) 15:29 ID:zLGH8Szo
>>397 バッファリングが効果を発揮するのは、
1文字ずつとか1行ずつとか小分けに読み書きする場合なので、
sysread/syswriteで一気にファイルを読み書きするんだったら
パフォーマンスは落ちないです。
400 :
名無しさん@お腹いっぱい。 :2001/06/18(月) 16:43 ID:478GYAHs
ドキュンな質問ですいません。はじめてPerlをやるんですが、 いきなりつまずいています。 送信して書き込むと言う単純作業なんですが以下のように書いたんですが 動作しません。間違えがあったら指摘して下さい・・・ elsif ($in{'menu'}) { open(IN,"stitle.log") || &error("Open Error : stitle.log","LK"); @line = <IN>; close(IN); # 更新 open(OUT,">stitle.log") || &error("Write Error : stitle.log","LK"); print OUT @line; close(OUT); } print <<"EOM"; <form action="$script" method="POST"> <input type=hidden name=pass value="$in{'pass'}"> <input type=hidden name=mode value="admin"> 一行目 <input type=text name=menu size=30> <input type=submit value="サブタイトル"> </form> EOM
402 :
名無しさん@お腹いっぱい。 :2001/06/18(月) 16:56 ID:478GYAHs
ドキュンな質問ですいません。はじめてPerlをやるんですが、
いきなりつまずいています。
送信して書き込むと言う単純作業なんですが以下のように書いたんですが
動作しません。間違えがあったら指摘して下さい・・・
elsif ($in{'menu'}) {
open(IN,"stitle.log") || &error("Open Error : stitle.log","LK");
@line = <IN>;
close(IN);
# 更新
open(OUT,">stitle.log") || &error("Write Error : stitle.log","LK");
print OUT @line;
close(OUT);
}
print <<"EOM";
<form action="$script" method="POST">
<input type=hidden name=pass value="$in{'pass'}">
<input type=hidden name=mode value="admin">
一行目 <input type=text name=menu size=30>
<input type=submit value="サブタイトル">
</form>
EOM
>>401 だからドキュンな質問なんです。本当にわからないです。
全部出しなさい。
>>402 何度も書くな。
どうせ自分で考えたスクリプトじゃないんだろうから、元のスクリプトを完全に写せ。
写し終わったら氏ね。
405 :
名無しさん@お腹いっぱい。 :2001/06/18(月) 17:12 ID:478GYAHs
>>403 sub kanri {
local(@line, $menu);
if ($in{'menu'}) {
open(IN,"stitle.log") || &error("Open Error : stitle.log","LK");
@line = <IN>;
close(IN);
# 更新
open(OUT,">stitle.log") || &error("Write Error : stitle.log","LK");
print OUT @line;
close(OUT);
}
# 管理画面
&header;
print <<"EOM";
[<a href="$script?">初期画面に戻る</a>]
<table width="100%"><tr><th bgcolor="navy">
<font color="#FFFFFF">管理モード</font>
</th></tr></table>
<P><blockquote>
<form action="$script" method="POST">
<input type=hidden name=pass value="$in{'pass'}">
<input type=hidden name=mode value="admin">
一行目 <input type=text name=menu size=30>
<input type=submit value="サブタイトル">
</form>
EOM
}
exit;
まだ作り中ですが・・・
elsifは何処いったんだよ。 もう良い。お前CGI作成/改造に手出すな。 今日の教訓:ドキュソにも程がある
elsifは何処いったんだよ。 もう良い。お前CGI作成/改造に手出すな。 今日の教訓:ドキュソにも程がある
408 :
S :2001/06/18(月) 17:41 ID:???
初心者コーナーだから仕方ないのでは…。
>>405 どういう風に「動作しない」のかきちんと書きましょう。
動くけど更新されてないとか、エラーで動かないとか…。
・ @line を全く更新していない。$menu を追加するのでは?
・ どうせファイル全体を @line に入れるなら、
open(IN,"+<stitle.log");
@line = <IN>;
(@lineの更新処理)
seek(IN,0,0);
print @line;
truncate(IN,tell(IN));
close(IN);
と一度のファイルオープンで終わらせるようにしましょう。
409 :
S :2001/06/18(月) 17:42 ID:???
まちがえました。 print @line; → print IN @line;
syswrite と、$| = 1 でバッファリングoffした print とは どう違うんですか?
>>410 お前には同じに見えるのか。
すげーな。
413 :
410 :2001/06/18(月) 23:18 ID:2vmGPgqA
>>411 syswriteはstdioを通さないとかありましたけど、何が起こるのか良く解りません。
御分かりなら説明orポインタを示して貰えると有り難いです。
----
ところで、Perlで flush とかいう操作をするにはどうすればいいんでしょう。
select FILE; $| = 1; print '';
でできますか?
引数が全然違うだろうが。ヴァカか?(藁
>>414 久々に真性アホを見つけた。さらしあげ。
あれ?syswriteって書き込むサイズを指定する必要があったと思うけど..........
バッファなしprintとsyswriteは何が違うんでしょうね。 小細工をしている分printの方が重いような… と思いBenchmark.pmで測定するも、差は見られず…。 # やはりPerlを知るためにはCを学ばなければいけないのか…。
422 :
名無しさん@お腹いっぱい。 :2001/06/19(火) 01:33 ID:AOjMGb9g
両者の違いは、でかいデータを書き込むとき、 バッファなしprintだと1KBごとに細切れに書き込むので その境目でタスクスイッチが発生する可能性があるけど、 syswriteは全部いちどに書くのでアトミック性が保証される。 ということかも。 ・・・根拠はFreeBSDのstdioのソース+想像90%
423 :
410 :2001/06/19(火) 01:40 ID:Y5lp4EqE
>>414 ,
>>419 言葉が足りなくてすみません。そういう違いは解ってます。
上のほうでも出てるアトミック性がどうのという話とか、
「stdio を経由しないので、 print と一緒に使うと混乱する」とか、
Programming Perl にも書いてある partial write(書き込み途切れてる?)とか、
ファイルシステムとの関連というか…そこらへんでの違いを知りたいと思いまして。
OS関連のことが良くわからないので…。
>>420 こちらも言葉が足りなくてすみません。
該当ページは以前読んだのですが、最初からautoflushにする方法しか無いようでした。
+> でオープンしたファイルに何か書き込んだあと、それを読むという操作を
したいのですが、でかいファイルにけっこう細かく書き込むので書き込みが
終わるまではバッファリングさせておきたいのです。
その後自分で実験したら、書き込んだあと読むために seek で巻き戻すと flush される
ようで、心配することもないのかな、という感じです…。
長文すみません。
424 :
超初心者 :2001/06/19(火) 04:01 ID:nKH5a7VE
>>423 んーいまいち具体的に何を知りたいのか見えないけれど、
処理の流れは↓のようになっていることは、知って置いた方がいいかな。
・syswrite()
PerlLIO_write()もといシステムコール
write(int filedes, const void *buff, size_t bytes)
filedes --> syswriteに渡されたファイルハンドル(から得られるディスクリプタ)
buff --> syswrite に渡した文字列
bytes --> 書き込むバイト数(指定されなかった場合Perlが内部で計算する)
を呼び出してその場で書き込む。
・バッファリング無しのprint
PerlIO_write()(≠PerlLIO_write) もといstdioライブラリの
fwrite(const void *ptr, size_t size, size_t count, FILE *fp) に、
ptr --> print に渡した文字列(ちょっと違う)
size --> 1 固定だよ
count --> 文字列長(Perlが内部で計算する)
fp --> printに渡されたファイルハンドル(から得られるFILE構造体へのポインタ)
を渡して呼び出し書き込むよう指示する。
その後、IOフラグを調べてIOf_FLUSH ビットがセットされていた場合
(つまり、バッファリング無しに設定されていた場合)PerlIO_flush()もとい
stdioのfflush(FILE *fp)を呼んで、まだ書き込んでいないデータをカーネルに渡す。
>後
>書き込んだあと読むために seek で巻き戻すと flush されるようで
いや、そんなことはないと思うが......。たしかdo_seek()はそんなことはしないはず。
>最初からautoflushにする方法しか無いようでした。
IO::Handle を利用して、適宜バッファを書き出したいときに
$io->fflush();
するのが一番スマート && 安全じゃないかな。
>$io->fflush(); $io->flush(); 癖が。
$datdirというディレクトリの中に 20010617.dat 最終更新日6/19 14:00 20010618.dat 最終更新日6/18 15:00 20010619.dat 最終更新日6/19 18:00 というファイルがあった場合、 最終更新日順に@fileに入れるにはどうsortすればいいんでしょうか?
>>427 @fileに入るのはファイル名のみですか?
#!/usr/bin/perl
use IO::Dir;
use File::stat;
my $dir = '.';
my @file = map{ $_->[0] }
sort{ $b->[1] <=> $a->[1] }
map{ [$_, stat($_)->mtime] }
grep{ not /^\.\.?$/ }
IO::Dir->new($dir)->read;
foreach(@file){
print $_, "\n";
}
__END__
ハハハ ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ^∀^)< あほか ( つ ⊂ ) \_________ .) ) ) (__)_) (^∀^)ゲラゲラ キエロ カイセンキッテクビモキレ ケラ
>>428 はい、ファイル名のみです。ありがとうございました。
432 :
410 :2001/06/19(火) 20:02 ID:tqiPK0Uc
>>425 ありがとうございます。syswrite は最初からダイレクトに書き込む、
$| = 1 はバッファ(?)に書き込んだ後それを flush、という感じなんでしょうか。
こういう違いが知りたかったので勉強になりました。
>seek
open F, "+>hoge.txt";
print F 'hoge';
open F2, "<hoge.txt";
# seek F, 0, 1;
read F2, $buf, 1024;
print $buf;
こんなので試しました。このままでは何も表示されず、# を外すと "hoge" と出力されます。
seek すると書き込まれているように見えるのですが…。
433 :
410 :2001/06/19(火) 20:10 ID:???
あ、flush は flush.pl を見たら
>>413 と同じことをしていたので、これを使おうと思います。
プロバイダのサーバではモジュールが使えないので。
そんなアホな。
下記のようなN88ベーシックをパールで書くとどうなりますか? 2:"A"; lbtmp 4input "?x(%)=";x: input "? "p(mmhg)=";p 6:gosub 500 8:print "t="; using "####.####";t;"c" 10:end 12:lp:rem lb.pres 14:input"x(%)=";x: input "t(c)=";t 16:gosub 514 18;print "p="; using "####.####";p;"mmhg 20:end *lh :rem ent.lb 24:input"?x(%)"=";x: input"? t(c)=";t 26:gosub 525 28:print "h="; using "####.####";h;"kc/kg" 30:end よろしくお願いします。
>>435 スレ違いだ氏ねヴォケ。←おやくそく。
しかしまじでCGI-MLにはこんなのが流れるんですか?
437 :
337 :2001/06/19(火) 23:20 ID:???
クッキーに2バイト文字をかきたいのですが、どうしたらいいでしょうか? 現在、下のようにCGIでクッキーをセットしてるのですが・・・ print &setCookie("POSTNAME", $FORM{'postname'}); sub setCookie { local($tmp, $val); $val = $_[1]; $val =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $tmp = "Set-Cookie: "; $tmp .= "$_[0]=$val; "; $tmp .= "expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; return($tmp); }
438 :
337 :2001/06/19(火) 23:21 ID:???
さげてしまったのでageます
439 :
名無しさん@お腹いっぱい。 :2001/06/19(火) 23:24 ID:lwqdY8As
何か問題でもあるん?
440 :
337 :2001/06/19(火) 23:29 ID:???
えっと、ジャバスクリプトでクッキーに格納された文字を以下のように読み出しているのですが、 文字化けした状態で出てくるのです。 -- <html><head> <SCRIPT LANGUAGE="JavaScript"> <!-- getname = getCookie("POSTNAME"); if (getname == "") { getname = ""; } function getCookie(key, tmp1, tmp2, xx1, xx2, xx3) { tmp1 = " " + document.cookie + ";"; xx1 = xx2 = 0; len = tmp1.length; while (xx1 < len) { xx2 = tmp1.indexOf(";", xx1); tmp2 = tmp1.substring(xx1 + 1, xx2); xx3 = tmp2.indexOf("="); if (tmp2.substring(0, xx3) == key) { return(unescape(tmp2.substring(xx3 + 1, xx2 - xx1 - 1))); } xx1 = xx2 + 1; } return(""); } // --> </SCRIPT> </head><body> <SCRIPT Language="JavaScript"> <!-- mmbb = unescape(getname); document.write("名前:<input type=text name=postname size=30 value=",mmbb,">"); // --> </SCRIPT> </body></html>
441 :
439 :2001/06/19(火) 23:36 ID:lwqdY8As
>>440 JavaScriptで呼び出す場合IEだと確かに化けるね。
NNだと問題ないけど。
$val =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
消すと大丈夫だよ。
その代わり;とか含むとCookieがちゃんと設定されない。
2chはそうなってるね。
IEのシェアが大きいから仕方ないのかな。
つか糞IEバグ直せよゴルァ
>>440 多分文字コードがUTF-8だからですね。
Perl5.6以上ならpackとJcode.pmで何とかなりますが、
それ以下のバージョンの場合はどうすればいいのやら…。
443 :
439 :2001/06/19(火) 23:42 ID:lwqdY8As
ん?UTF-8のせいなの?? NNではOKだからIEのバグだと思ってたが。
確かそうだったと… m/%u([a-fA-F0-9]{4})/ って形ならUTF-8なのではないか。 試してないでアレですが。
「UTF-8なのではないかと」です(汗
446 :
337 :2001/06/20(水) 00:01 ID:???
>>439 消してもダメでした・・・
>>rubbish_l
クッキーの中身をみたところ
テスト中=%A5%C6%A5%B9%A5%C8%C3%E6
でした。UTF-8とやらみたいであります。
弱りました。当方Perl5.0の鯖なんす。
447 :
439 :2001/06/20(水) 00:04 ID:???
むぅ。俺が作った2ちゃん型BBSはそれで直ったんだが・・・。 あとはよう分からんスマソ。
>>446 え?
いやそれは(URIエスケープされているとはいえ)普通のEUC-JPですが…?
って、待てよ?
もしかしてCGIスクリプト側でセットしたクッキーをJavaScriptで読み出そうとしてます?
ちと勘違いしてました。すみません。
…となると…
>>441 さんの方法しか思いつきません。もうしわけない。
450 :
337 :2001/06/20(水) 00:15 ID:???
文字コードはEUCで、cgiスクリプト側で設定したクッキーをジャバスクリプトで読もうとしています。。。
>>437 ほういちさんの所は上手くいっていた記憶があるなあ。
http://www13.big.or.jp/~bell/nanashi/perl/ >>432 >という感じなんでしょうか。
そです。
syswrite --> write()でそのまま書き出し。
$| = 1 && print --> バッファリングされるけれど、print関数内で即フラッシュされる。
と考えればいいかと。
>>seek
>seek すると書き込まれているように見えるのですが…。
PerlIO_seekもといfseek()が、シークする前に__flshfp(FILE*,int)を呼び出して
バッファをフラッシュするのを忘れてた(鬱)すまん。
ちゃんと書き込まれますね。
452 :
S :2001/06/20(水) 00:34 ID:???
>>337 IEのescape/unescapeは%uXXXXという形のUnicodeを使ってます。
なので、%XX の形のCookieはIEのunescapeでは戻せません。
クロスブラウザ(?)にするためには、JavaScriptかCGI内部のどちらかに
統一して、セットも取得も両方行う必要があります。
337のように取得をJavaScriptにするなら、セット(escape)もJavaScriptでやりましょう。
# USER_AGENT を見て、IE なら %uXXXX のように変換することもできますけど…。
453 :
S :2001/06/20(水) 00:39 ID:???
>IEのescape/unescapeは%uXXXXという形のUnicodeを使ってます。 げげ、そうだったんですか… とりあえず%uXXXXという形に出来ますが、 これはIE専用か… use utf8; use 5.6.0; use Jcode; $str = 'テスト中'; $str = Jcode::convert($str, 'utf8'); $str =~ s/(.)/ sprintf('%%u%x', unpack('U', $1)) /ge;
455 :
名無しさん@お腹いっぱい。 :2001/06/20(水) 12:11 ID:78RSTnoI
すみません DOSで構文チェックすると 行数とエラーの内容がでてきますよね? そのエラーの内容を解説してる本とかサイトとか あったら教えてもらえないでしょうか? ガイシュツだったらごめんなさい
456 :
名無しさん@お腹いっぱい。 :2001/06/20(水) 12:19 ID:rCbZrLc.
>>452 おおすげー俺的にタイムリー
板違いになっちゃうけど、javascriptでURLエンコードする
ライブラリってありませんかね?
色々検索したんだけど、全然見つからない。
ここまで見つからないと、javascriptだと実装不可能なのかなぁ。
と思ってみたり。
perlだと一行なのに。
escape()
458 :
S :2001/06/20(水) 14:47 ID:???
>>455 英語ならPerl付属のマニュアルの中の perldiag という項目に出てます。
日本語訳は
http://www.att.or.jp/perl/man/ ここにあります。
>>456 IEの場合、Unicodeでないエンコードは無理です(Appletを使ってやってる人はいますが)。
デコードならできると思いましたが、日本語と認識してくれないです…。
var encoded = "%82%B1%82%F1%82%C9%82%BF%82%CD%81B";
var decoded = encoded.replace( /%([0-9A-Fa-f][0-9A-Fa-f])/g, url_unescape );
function url_unescape( matchedString, subMatch1 ){
return String.fromCharCode(parseInt(subMatch1,16));
}
459 :
455 :2001/06/20(水) 16:14 ID:uuv79wZI
>>458 ありがとうございます。
また何かあったらお聞きしますと思いますが
宜しくお願いいたします。
460 :
名無しさん@お腹いっぱい。 :2001/06/20(水) 16:47 ID:JljLMnck
文字か、アスキーコードを取り出したいのですが、 Perlでは、難しいのでしょうか。 C言語の場合(なにも考えなくてもいい・・・) int asciicode = 'A'; /* asciicode = 0x65; */ Perl の場合(仮定) $str = "A"; $asciicode = getAsciiCode( $str); # asciicode = 65; この getAsciiCode関数が欲しい・・。 my $val = unpack('H2','A'); とした場合、返ってくるのは "41" ですね。近いんですけど、 これは16進数だから、なんとかして10進数に変換しなければいけない・・。
461 :
460 :2001/06/20(水) 16:53 ID:JljLMnck
しまったぁ! こうすればいいんですね・・。jcode.pl のソースみて、 てきとーにやったら、出来てしまった・・。 my $val = unpack('CC','A'); 失礼しました。 (なんで、こうやったら、できるのかはわからんが)
462 :
名無しさん@お腹いっぱい。 :2001/06/20(水) 18:41 ID:B0.Wtqj2
>>460 unpackはいろいろ使えて便利だけど、
動作が理解できないなら専用の関数使ったほうがいいぞ。
$code = ord('A'); # 10進文字コード←文字
$str = chr(65); # 文字←10進文字コード
463 :
JAPU :2001/06/20(水) 18:44 ID:???
$val = ord "A";
質問です。 iモードの掲示板で、絵文字を入力された場合の対策はどのように されてますか?
開いたファイルに毎行処理を行うには while (<FILE>) { 処理 }; と foreach (<FILE>) { 処理 }; ではどちらが速いでしょうか? また、一度配列に入れてからのほうが良いのでしょうか? 教えてください。
466 :
なー :2001/06/20(水) 21:18 ID:f8KvSrzA
>>465 最初に配列にまとめて入れた方が良いと思われ。
whileもforeachも速さは変わらないと思われ。
>>465 配列に入れるとその分メモリを喰う。
あまりにも大容量な場合は配列に入れないほうがいい。
いや普通はwhileでは? 数キロバイトのファイルならいざ知らず、 メガバイト単位だと明らかにwhileの方が速いですよ?
469 :
465 :2001/06/20(水) 21:50 ID:???
ファイルの容量が大きければ配列に入れずにwhile, 小さければ配列に入れてforeach(配列に対してwhileは使えませんよね??) ということですね。 ありがとうございました。
>配列に対してwhileは使えませんよね 念のため while (shift @array) { something; } とかたまに使うよ
っつーか… > 最初に配列にまとめて入れた方が良いと思われ。 これは何故こんな考えが? 後学の為に聞いておきたい。
472 :
名無しさん@お腹いっぱい。 :2001/06/20(水) 23:12 ID:f8KvSrzA
Win2000でActivePerl626 にTkモジュールを突っ込んだんですが、 「PerlCRT.dllがありません」って言われてTk.pmが落ちます。 どうしたらいいんでしょうか? ちなみに、そのプログラムはSolarisのperl5.005_3で動いたものなので コード的にはおかしくないはず・・・・
>>472 特定のコードで落ちるんですか?
それともTk使うと必ず落ちるのか。
474 :
472 :2001/06/21(木) 01:47 ID:???
perl -e "use Tk;" でも落ちます。 これって、なにやっても落ちますよね・・・・
475 :
473 :2001/06/21(木) 02:49 ID:???
Win2000にTkを入れたばかりですけど、いちおう動いてまっせ。 "ppm install Tk"でインストールしました。 * ActivePerlのバージョン v5.6.0 built for MSWin32-x86-multi-thread Binary build 623 * Tkのバージョン C>perl -MTk -e "print $Tk::VERSION" 800.022
perl.exe と同じディレクトリか system32 ディレクトリ内に perlcrt.dll はありますか?
このスレ、勉強になるなあ…ありがたや。
そうだね
>>465 while(<>) --> ファイルを一行毎に読み出す。
foreach(<>) --> ファイルを一括して読み、インデックスを回す。
という違いがあります。
......どちらもスピードはあまり変わりませんから、普通はwhile()の方を使います。
________________________________________ #!/home/devel/5.7.1/bin/perl -Dtls print while <>; ________________________________________ EXECUTING... (while.pl:0) enter (while.pl:0) ENTER scope 2 at pp_hot.c:1535 Entering block 0, type BLOCK => (while.pl:0) nextstate => (while.pl:3) enter (while.pl:3) ENTER scope 3 at pp_hot.c:1535 Entering block 1, type BLOCK => ______________________________________ (while.pl:3) gvsv(main::_) => UNDEF --> gvsv()コードによりSV ${"main::_"} を取得(undef)、スタックに積む。 ______________________________________ (while.pl:3) gv(main::ARGV) => UNDEF GV() --> gv()コードによりGV ARGV(ファイルハンドル)を取得、スタックに積む。 ______________________________________ (while.pl:3) readline => PV("1\n"\0) --> スタックからpopしたファイルハンドルから一行読み出し、$_に設定。 PV とは文字列の意。(ちゃんと改行付き) ______________________________________ (while.pl:3) defined => SV_YES (while.pl:3) and => --> while() 内のテスト。Perl5.001からは while (<>)は while (defined($_ = <>)) と同義になっている。 (op.c pod/perlop.pod,Change.log --NETaa13486を参照) この場合、テストはSV_YES(文字列"1")を返した。(-> true) ______________________________________
...続き (while.pl:3) pushmark => * (while.pl:3) gvsv(main::_) => * PV("1\n"\0) (while.pl:3) print => SV_YES --> $_の値を取得し、printする。成功したためSV_YESを返す。 ______________________________________ (while.pl:3) unstack => --> スコープ終了。オールクリア (-->ループ繰り返し) ______________________________________ #< .....以上をARGVから読みとれる限り繰り返す..... ># (while.pl:3) leave Leaving block 1, type BLOCK (while.pl:3) LEAVE scope 3 at pp_hot.c:1657 => (while.pl:3) leave Leaving block 0, type BLOCK (while.pl:0) LEAVE scope 2 at pp_hot.c:1657 (while.pl:0) LEAVE scope 1 at perl.c:394
________________________________________ #!/home/devel/5.7.1/bin/perl -Dtls print foreach <>; ________________________________________ EXECUTING... (foreach:0) enter (foreach:0) ENTER scope 2 at pp_hot.c:1535 Entering block 0, type BLOCK => (foreach:0) nextstate => ______________________________________ (foreach:3) nextstate => (foreach:3) pushmark => * (foreach:3) gv(main::ARGV) => * GV() --> while() の時と同じ(省略) ______________________________________ (foreach:3) readline => * PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) --> ファイルハンドルARGVから全て読み出し、一行毎にスタックに積む。 PV は文字列の意。(改行付き) ______________________________________ (foreach:3) gv(main::_) => * PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) GV() (foreach:3) enteriter (foreach:3) ENTER scope 3 at pp_ctl.c:1703 (foreach:3) ENTER scope 4 at pp_ctl.c:1734 Entering block 1, type LOOP => PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) (foreach:3) iter => PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) SV_YES (foreach:3) and => PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) --> リストから一つ取り出し$_ にセット。その後 $_をテスト(SV_YES --> true) ______________________________________
...続き。 (foreach:3) pushmark => PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) * (foreach:3) gvsv(main::_) => PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) * PV("1\n"\0) (foreach:3) print => PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) SV_YES --> $_の値を取得し、printする。成功したためSV_YESを返す。 ______________________________________ (foreach:3) unstack => PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) (foreach:3) nextstate => PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) --> 次の繰り返しのためのクリーンアップ (-->ループ繰り返し) ______________________________________ #< .....以上を全ての要素に対して繰り返す..... ># (foreach:3) iter => PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) PV("\n"\0) PV("aaa\n"\0) SV_NO (foreach:3) and => PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) PV("\n"\0) PV("aaa\n"\0) SV_NO (foreach:3) leaveloop Leaving block 1, type LOOP (foreach:3) LEAVE scope 4 at pp_ctl.c:1821 (foreach:3) LEAVE scope 3 at pp_ctl.c:1822 => PVNV(""\0) -->もう要素が残っていないためSV_NO(文字列"")が返されループ終了 ______________________________________ (foreach:3) leave Leaving block 0, type BLOCK (foreach:0) LEAVE scope 2 at pp_hot.c:1657 (foreach:0) LEAVE scope 1 at perl.c:394
=> スタックの内容 です。 .......それにしても長すぎた。申し訳ない。
486 :
:2001/06/21(木) 06:31 ID:???
487 :
:2001/06/21(木) 06:32 ID:???
488 :
:2001/06/21(木) 06:32 ID:???
489 :
名無しさん@お腹いっぱい。 :2001/06/21(木) 06:46 ID:PPJE7E4o
初心質問で申し訳ない。 @aに配列が保存されており、 &subxx($xx,$xx,\@a); #ってな具合でサブルーチンにリファレンスで渡したあと、 sub subxx{ $a = $#$_[2]; } こういう風に、要素数を読みとろうとすると、なぜかエラーがでます。 どうすればいいんっしょ。 ちなみに、いったん別の変数へぶちこむと、正常に動くんですけどねえ。
490 :
初心者 :2001/06/21(木) 06:49 ID:???
>foreach(<>) --> ファイルを一括して読み、インデックスを回す。 なるほど。 >480-484を見ると >(foreach:3) readline >=> * PV("1\n"\0) PV("2\n"\0) PV("3\n"\0) 全部読んじゃうのね。・・・知らなんだよ〜ありがとう。 #うちのperlは-Dオプションが効かないよ・・・
>>489 $a = $#{$_[2]}
>要素数を読みとろうとすると
要素数じゃなくてインデックスの最大値だよ。
要素数は
$count = scalar @{$_[2]}
>>gunzipさん ども、ありがとうございました。無事できたっす。 いや、しかし、perl面白いですなあ。かなりはまりそうです。
493 :
名無しさん@お腹いっぱい。 :2001/06/21(木) 13:41 ID:2DG5zPDk
ディレクトリが無ければ作る、というときに -d 'hoge' でチェックしたりしないでいきなり mkdir 'hoge' ... すると、何か問題があるでしょうか? -d より効率が悪いとか、ディレクトリ上書きしちゃうシステムがあるとか…。 よろしくおねがいします。
494 :
ねこ丸 :2001/06/21(木) 14:40 ID:???
↑シェルで試したらエラーが出た。 mkdir: cannot make directory `try': File exists
495 :
ななし :2001/06/21(木) 20:45 ID:???
ちょっと難題を抱えてしまったので質問よろしいでしょうか? I saw a pan & pen. と言う文字列があります。これをHTMLの実体参照で変換した後は、 I saw a pan & pen. になりますが(文章の内容については突っ込まないこと)、この変換した後の文字列をsubstrのように文字を切り取りたいのです。 ちょっと分かりにくいので、先頭から10文字を切り取る動作の結果を例としてあげます。 0123456789 欲しい答え I saw a pa → I saw a pa いざプログラムを組んでみるとちんぷんかんぷんです。どなたかご教授を!
496 :
名無しさん@お腹いっぱい。 :2001/06/21(木) 20:47 ID:Q1GJ073g
>>493 Linux、FreeBSD、Win95、Win2000は、いきなりmkdirで問題なし。
上書きすると
>>494 みたいなエラーになり元のディレクトリは不変。
効率は、気にするほど違いないでしょ。どっちかいったら-dのほうが遅い?
497 :
S :2001/06/21(木) 21:32 ID:???
>>495 あの、下の例文の意味がよくわからないのですが、 実体参照を
一文字としてsubstrしたいということですか?
手遊びに作ってみましたが、ちがったら無視して下さい。
# 開始位置は最初からのみ
# $str : 切り取り対象 $n : 何文字切り取るか
sub html_substr{
my( $str, $n ) = @_;
{
my $count = 0;
do{ last if $count++ >= $n }
while $str =~ /?\d{1,4};|&[A-Za-z]{1,7};|./gs;
}
substr $str, 0, pos($str);
}
うーん。遅そう。
498 :
S :2001/06/21(木) 21:33 ID:???
ありゃ。なんか?になってる…。 while $str =~ / の次は、 & と # です。
499 :
465 :2001/06/21(木) 21:38 ID:???
レスを下さった方々、ありがとうございます。勉強になります。 ですが、_gunzipさんのコードは私には高度過ぎてわかりませんでした・・・。 わざわざ書いてくださったのにすみません。
500 :
ななし :2001/06/21(木) 21:57 ID:???
>>497 あ〜いけね〜、
実体参照が変換されるのを忘れていた
I saw a pan & pen.のI saw a paです。鬱陀氏脳
501 :
ななし :2001/06/21(木) 22:23 ID:???
>>497 先ほどは失礼いたしました。
私の質問の意図はSさんの通りです。
で、プログラムのほうは一見それでうまくいくかと思いきや、$nが$strの文字数より大きくなるとnullが帰ってくるようです。
ここからは私のほうで考えてみます。
502 :
名無しさん@お腹いっぱい。 :2001/06/22(金) 06:49 ID:zgX1GrJQ
UTF-8をsjisに変換する、または、utf-8でファイルに書きこみたい のですが、どうすればいいのでしょうか。
Jcode
Jcode.pmを使う
被った、、、と今更気付く。
506 :
??? :2001/06/22(金) 12:57 ID:ajkueiy.
http://perl.gizo.net/download/imode/ezimode_cgi.txt ↑(ソースです)のi-mode掲示板をつけました。
どうしても、EZ−Webからだと文字化けがおこります。
しかも、「タイトル(=dai)」(フォームサブルーチンより)
の部分だけが…。
EZからだと、書き込み方式が違う(UTF−8??)
てのだけ、突き止めましたが、
それって↓
&jcode'convert(*dai,"sjis");
で対応するんですよね?でも、ダメです。
万策尽きてしまいました。
ぜひ、知識人の方々のお力を…。
お願いいたします。
(それとも、送信メソッドをJ−skyのためにGET
にしたんですが、そのせいでしょうか?)
508 :
名無しさん@お腹いっぱい。 :2001/06/22(金) 19:13 ID:le9nN3lE
すみません。Perlとは直接関係がないのですがよろしくお願いします。 画像ファイルにアクセス制限をかけるために、いちどプログラムにて 画像ファイルを読み込み、それを動的にクライアントへ返しているの ですが、そのときに'Content-type: image/gif'だけでは、IEでだけ 表示されないのです。NN4.7ではOKでした。 1.Content-typeにおいて他に指定する必要のあるものがある 2.他のヘッダーとして指定されていないものがある。 このどちらでしょうか?それともまったく関係のないことなのでしょうか?
509 :
名無しさん@お腹いっぱい。 :2001/06/22(金) 19:38 ID:le9nN3lE
ひとつ思ったのですが、ファイルの拡張子はやはりgifやjpgのように、 なっていないとだめなのでしょうか? いくらContent-typeで指定したところでブラウザが拡張子にて判断して しまうなら仕方のないことですね。 (Servletなのでクラス名に"."を含めることができません)
511 :
名無しさん@お腹いっぱい。 :2001/06/23(土) 11:46 ID:DIfS2zfo
gethostbyaddr()でホスト名を取得しようとしているのですが うまくいきません。(IPアドレスが表示されます) 他のCGIではgethostbyaddr()でホスト名が取得できているので サーバがgethostbyaddr()が使えないということではないと思うんですが… どのような原因が考えられるでしょうか?
513 :
名無しさん@お腹いっぱい。 :2001/06/23(土) 12:58 ID:/dnaAWAM
>508 サーバーは何? サーバーが何かヘッダーを追加してて、そのヘッダーがIEの場合だけ 理解されているとかじゃない? あと、content-typeの改行コードを、CRLFにしてみるとか、 perlならbinmodeになっているかどうかとか。 それと、おっしゃるように拡張子が、クライアント側で関連付けられていて それが優先されているとか。IEならありそう。
>511 ↓でだめか? my($host) = &nslook($ENV{'REMOTE_ADDR'}) || '???'; sub nslook{ my($x) = shift; ($x =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/) ? ((gethostbyaddr(pack('C4',$1,$2,$3,$4),2))[0] || $x) : $x; }
sub nslook{ my($x) = shift; ($x =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/) ? ((gethostbyaddr(pack('C4',$1,$2,$3,$4),2))[0] || $x) : 0; } ちょっと修正
516 :
CGI串 :2001/06/23(土) 16:00 ID:???
517 :
511 :2001/06/23(土) 17:32 ID:zX58xGlk
>>514 =515
やってみましたがダメです。
何も表示されません…
518 :
あああ :2001/06/23(土) 17:41 ID:uDMh12hc
簡単な質問ですが、 $a =~ /^aaa/; で$a の先頭に“aaa"があるかを確認できますが、 $st = "aaa"; $a =~ /^$st/; とやってもうまく動きません。 $a の先頭に $st が含まれているのかを確認する方法ってありま すか?
>>518 if(index("$a","$st") == 0){ #$aの中にて$stが0バイト目に存在したら
$ok = 1;
}
>>518 うそ?うまく動かない?そのスクリプト見せて?
実際のスクリプトでは $st の中に正規表現のメタキャラクタが入ってると思われ
>>521 多分そうだよね。
$a=~/\$Q$st$E/;
にしたらうまくいくはず。
ってゆーか自分は昔これ知らないで手動でエスケープしてたなー。ここに
来て勉強になったことのひとつ。
あれれ、めちゃくちゃだ。 $a=~/^\Q$st\E/; だね。
524 :
名無しさん@お腹いっぱい。 :2001/06/23(土) 22:20 ID:uDMh12hc
「うそ?」って、正常に動作するのか?
525 :
あああ :2001/06/23(土) 22:22 ID:uDMh12hc
>>523 試してみます。
\Q \E ってなに? って調べればわかるかな。
526 :
あああ :2001/06/23(土) 22:32 ID:uDMh12hc
>>523 とりあえず、ダメでした。
ちょっと別途試験プログラム作ってから、もう一度組み込みしてみます。
>>526 とにかくソースの一部を出せばすぐに解決するような気がするのだが。(保証はせんが)
528 :
飛ばんな :2001/06/23(土) 23:14 ID:JvcuVhUo
はじめまして チェックBOXに関してお聞きしたいんですけど 皆さんチェックBOXどのように使ってますか? 複数のチェックBOXにおいて渡す側でリストをつくりたい場合 私はチェックBOXの名前を配列にしてしまって受け取ったほうで キーとリストを入れ替えるっていうなんか邪道なことやってるんですが なんかほかにいい方法あるでしょうか?
>526 perlのバージョンは大丈夫か?
↑ え?関係あるの?
0/1/2のどれかがそれぞれ入っている$a,$b,$cのうち、 1つだけが"1"を含んでいることを確かめるにはどうしたら 良いのでしょうか。 どうしてもif文を大量に組み合わせたものしか考えられないのですが もっと頭の良いプログラムにできないものかと思いまして。
532 :
名無しさん@お腹いっぱい。 :2001/06/25(月) 03:40 ID:5VbEnasM
>>531 その程度のサイズなら、3×3×3=27個の要素のテーブルを作るかな。
@table = (0, 1, 1, 1, 0, ・・・以下略);
$hantei = $table[$a * 9 + $b * 3 + $c];
@tableのデータは手作業で作るのが早いと思う・・・。
533 :
S :2001/06/25(月) 04:38 ID:???
if( ( "$a$b$c" =~ tr/1// ) == 1 ) なんていう、Perl批判の引き合いに出されそうな方法も。
>>531 いろいろ。
--------------------------------------------
if( (($a == 1) + ($b == 1) + ($c == 1)) == 1 ){
# 処理
}
--------------------------------------------
@array = (); #作業用配列(ハッシュでも可)
$array[$_]++ for $a, $b, $c;
if( $array[1] == 1 ){
# 処理
}
--------------------------------------------
#逝かれたコード(真似しないこと)
print "ok" if ($a ^ $b ^ $c) & !($a & $b & $c)
>($a ^ $b ^ $c) & !($a & $b & $c) こんなのよく思いつくねえ (´ー`)y−~~
どれが1を含んでいるか分からなくていいなら、これで十分じゃ? if(($a+$b+$c)==1){ 処理; }
1がふたつ、0がひとつの時ダメですな。
ちがった。2,1,0とかのときにダメ。
539 :
531 :2001/06/25(月) 16:31 ID:CR99XO02
なるほど、大変参考になります。早速、いろいろ試してみようと思います。 ちなみに自分が出していた結論は変数に2が入っていたらそれを2倍して、 $a+$b+$cが1or5or9になっていたら処理を行う、というものでした。 (組み合わせが 1/4/4 1/4/0 1/0/4 1/0/0 のパターンを識別する) (かな〜り死んでますね。) うーん・・自分のプログラミング能力に自信が無い(こんなプログラムしか書けない) のですが、プログラミング能力を伸ばすにはやはり手を動かして ひたすらプログラムを書いた方が良いのでしょうか?
>>539 他人の書き方を参考にするのも勉強。
例えばここで出された答えの意味を全部理解できてる?
理解できてなければどうしてそうなるかを勉強する。
理解できるようになったら「こういうやり方もあるんだ」と覚えておく。
もちろんその時に自分で書いてみるのが一番勉強になると思う。
>>539 要領が掴めていないのにたくさん書いてもよくわからんものができあがるだけ。
まずは人の書いたソースをどうやって動いているか分かるようになるまで読んでみては?
面倒くさい 自分のソースを添削してもらったほうば楽
543 :
名無しさん@お腹いっぱい。 :2001/06/26(火) 15:14 ID:ai8VquTY
ファイルのリネームって、事前にファイルをオープンする必要ありますか? rename < 現在のファイル名 > , < 変更後のファイル名 > ; なぜかうまくいかないのです
>>543 renameするのにopenの必要は無い。
まず$!を見ること。
Windowsなら$^Eもチェック。
>>543 「なぜかうまくいかない」というのは状況説明としては最低レベル。
エラーが出るならエラーメッセージを書く。
>543 権限無しだろどーせ
547 :
ななしでお願いします :2001/06/26(火) 17:37 ID:MIeivAlo
UNIXのおファイルについて質問です。 例えば、一つのディレクトリに10000のおファイルをぶち込むのと、 100のディレクトリに、100のおファイルをぶちこむのでは、 どちらがいいのでしょう。 UNIXのおファイルシステムは、線形検索との事ですが、 やっぱり入れすぎはよくないのでしょうか。
548 :
名無しさん@お腹いっぱい。 :2001/06/26(火) 18:18 ID:Ml2Xpmsg
>>547 そのとおり。ディレクトリ検索はファイル数に比例して遅くなる。
単純計算で、1万ファイル×1ディレクトリ内のファイルアクセスは、
100ファイル×100ディレクトリの数十倍の平均時間を要する。
549 :
547 :2001/06/27(水) 00:11 ID:???
>548 どーもです。 安心した℃です。
551 :
名無しさん@お腹いっぱい。 :2001/06/27(水) 01:20 ID:FKg3tYUg
下記はやっぱりb案の方が利口でしょうか? @a = ("11-22-33","22-33-44","55-66-77","88-99-00","22-44-55"); #a案 foreach(0..$#a) { (@split) = split(/\-/,$a[$_]); if($split[0] eq '88'){ print $a[$_]."\n"; } } #b案 for(@a){ (@split) = split(/\-/); if($split[0] eq '88'){ print $_."\n"; } }
#c案 foreach (@a){ print "$_\n" if (split '-')[0] eq '88'; }
553 :
S :2001/06/27(水) 01:35 ID:???
d案 foreach( @a ){ print $_, "\n" if /^88-/ }
e案 print "$_\n" for(grep /^88\-/, @a); そろそろ限界か?
555 :
名無しさん@お腹いっぱい。 :2001/06/27(水) 02:04 ID:IVYsrfFE
>>551 a案とb案の比較なら当然bがベターだろ。a案は逝ってよし。
556 :
551 :2001/06/27(水) 02:05 ID:???
早速色々ありがとう。多分、こんな感じで色々出してくれるとおもいました。 速度的にはどれでしょうか?自分で測れってならいいですけど。
557 :
名無しさん@お腹いっぱい。 :2001/06/27(水) 02:19 ID:IVYsrfFE
>>556 自分でベンチマーク実行すれ。
で、結果はここに公開してね。
558 :
551 :2001/06/27(水) 02:22 ID:???
そういえば表示ではなく代入でした。 for(@a){ (@split) = split(/\-/); if($split[0] eq '88'){ $x = $_; } } こんな感じ? foreach(@a){ if ((split '-')[0] eq '88'){ $x = $_; } } こんな感じ? foreach(@a){ if (/^88-/){ $x=$_; } }
Benchmark: timing 10000000 iterations of x1, x2, x3, x4... x1: 13 wallclock secs (13.05 usr + 0.00 sys = 13.05 CPU) @ 766342.25/s (n=10000000) x2: 12 wallclock secs (12.96 usr + 0.00 sys = 12.96 CPU) @ 771724.03/s (n=10000000) x3: 13 wallclock secs (12.97 usr + 0.00 sys = 12.97 CPU) @ 771128.93/s (n=10000000) x4: 25 wallclock secs (25.47 usr + 0.00 sys = 25.47 CPU) @ 392649.60/s (n=10000000) x1=b, x2=c, x3=d, x4=e, print は $x = $_ に変えた。 自明な結論: 細かいことを気にするな。
560 :
551 :2001/06/27(水) 02:31 ID:???
単純に(times)[0]で1万回繰り返した場合を測ってみました。 558の上から、AVG .90sec、AVG .60sec、AVG .25sec です。 次は、一応データをランダムにして測ってみます。
561 :
551 :2001/06/27(水) 02:33 ID:???
スクリプトのベンチなんてあるのか・・・
562 :
551 :2001/06/27(水) 02:38 ID:???
参照データ88の部分を毎回ランダムにしたら、 AVG .99sec、AVG .60sec、AVG .60secでした。
563 :
551 :2001/06/27(水) 02:42 ID:???
$x = $_ for(grep /^88\-/, @a); に決定。もう師脳。
564 :
551 :2001/06/27(水) 02:51 ID:???
良く考えたらケースバイケースだな。配列の大きさにもよるな。納得。
>>561 Perlのベンチマークなら
use Benchmark;
を使うのが定番。便利だよ。
>>559 の人もこれ使ったんでしょ。
まあやってる内容はtimesで測るのとあまり変わらないけどな。
foreach (@a) { print $_ if substr($_, 0, index($_, '-')) eq '88'; } ってのも一応あるんだな コピペじゃないので間違ってたらすまん
567 :
:2001/06/27(水) 10:21 ID:38kJ5CJw
サーバA サーバB index.html upload.cgi edit.cgi tmp/ 上のようにサーバAの index.html 内のフォームから サーバBの upload.cgi を呼び出してファイルを tmp/ ディレクトリ以下に保存するようにしたあと、 Location: でサーバAの edit.cgi を呼び出して index.html を書き換えると言うのはありですか? サーバAはディスク容量は限られているが広告なし、 サーバBはディスク容量無制限だが広告あり、という 状況です。
568 :
名無しさん@お腹いっぱい。 :2001/06/27(水) 11:40 ID:POUsw9kM
>>567 サーバーAからsocket 使っちゃダメなの?
…ってレンタルだから多分無理なんでしょうな。
Socket使えないサーバなんてあるの?(大爆笑)
配送です。それがなにか?
アホ一丁お届けに上がりました〜
Socket使えないサーバなんてあるの?
話の腰折って悪いけど、少し疑問が。 print "hoge"; って1行ずつ出力していくのと、 print <<"EOM"; hoge EOM ってまとめて出力していくのはどう違うんだろう。 下の書き方のほうが楽なのに、世の中の多くのスクリプトでは 1行ずつ出力する方式を選んでるってのに疑問が。 やっぱ実行速度とか違うのかな?
>>574 実行速度はそれとわかるほど変わったりしないと思う。
個人的には下のやりかたのほうがよく使ってるよ。
>>569 ,
>>573 例えばトクトクみたいなところでは別サーバーのデータを読み込むような
スクリプトは禁止されてるよ。
577 :
名無しさん@お腹いっぱい。 :2001/06/28(木) 14:22 ID:C.rSbvu.
ファイルをコピーする関数ってありますか? cp copyでさがしたのですが無いような・・
探し方が悪い。 #! perl use File::Copy; copy("./hogehoge.txt", "./copyhoge.txt");
トクトクはSocket使えるが・・・(微笑
580 :
名無しさん@お腹いっぱい。 :2001/06/28(木) 15:53 ID:DvKLUY5M
いきなりすいません フォームに書き込んだ文字をログファイルに記録すると言う 単純なものを作りたいのですが ↓のようにやってうまくいきません。どこが間違ってるのでしょうか? #!/usr/local/bin/perl #ファイルの読み込み open(IN, "<./a.dat"); $domo = <IN>; close(IN); #ファイルへの書き込み open(OUT, ">./a.dat"); print OUT $domo; close(OUT); $domo = $form{'koumoku'}; # サーバ出力 print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head><title>ファイルの読み込み</title></head> <body> <form action="a.cgi" method="POST"> 項目 <input type=text name=koumoku size=30> <input type=submit value="項目を追加"> </form> </body> </html> END
>>580 一から勉強しなおせ。
間違ってるなんてもんじゃない。
>>580 明らかに流れがおかしいよ。
$domoに何が入ってるのか、よく考えながら見直してみ。
583 :
582 :2001/06/28(木) 16:21 ID:???
それ以前に、デコードもないな…(ワラ >581 とかぶったし。
>>579 Socketは使えるけど規約で禁止されてるの。
>・その他、コマンド発行を行うCGI
>他サーバーへのアクセスおよび攻撃を目的とするため禁止
>・proxy.cgi 系のCGI もしくはそれを含むパッケージ
>・whois.cgi 系のCGI もしくはそれを含むパッケージ
>・flood.cgi 系のCGI もしくはそれを含むパッケージ
>・sendmail.cgi 系のCGI もしくはそれを含むパッケージ
>・その他、他サーバーへのアクセスを行うCGI
>上記CGIを設置の場合は一切の警告なしにアカウント削除を行います。
>>580 よぉく見てみよう。
データを読み込んでからデータを書き換える前に書き込みをしていないかい?
これじゃあ読み込んだデータをそのまま何の手も加えずに書き込み直す事になるよ?
585 :
579 :2001/06/28(木) 16:31 ID:???
586 :
580 :2001/06/28(木) 16:43 ID:DvKLUY5M
ちょっと書き直してみましたがやっぱりだめです。 ドキュンな質問ですいません・・・ #!/usr/local/bin/perl # サーバ出力 print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head><title>ファイルの読み込み</title></head> <body> <form action="a.cgi" method="POST"> 項目 <input type=text name=item size=30> <input type=submit value="項目を追加"> </form> </body></html> END $domo = $form{'item'}; #ファイルへの書き込み open(OUT, ">./a.dat"); print OUT $domo; close(OUT);
「間違ってるなんてもんじゃない」 とあるのに「ちょっと書き直した」だけで動くと思うなよ(藁
>>580 =
>>586 >>2 のリンクからお勉強サイトに行って勉強してきなさい。
基礎の基礎がなってない。
ここにいる人間だって数字を知らない人間に足し算を教えることは
できないんだよ。
数字から順に教える人間もいないと思うし。
まずは自分で勉強する。
その場は
>>2 に用意されている。
589 :
580 :2001/06/28(木) 16:53 ID:DvKLUY5M
カウンターは作れたのに・・・・
CGI 自体のしくみがわかってないから
>>2 で Perl を学べてもどうしようもないような気がする。
「サーバ出力」「ファイルの読み込み」が謎すぎ
みんな、ネタにマジレスすんなYO!
そーいやヒアドキュメントってあんま多くまとめて出力するとエラー出たような。 勘違いかな?
本当はみんなやり方が分からないんだよw
こういうの見ると思うんだけど、 初心者はデコードとか自力でやんないで 素直にCGI.pm使ったほうが幸せなんじゃないかね。 $domo = $form{'item'} ↓ use CGI; $domo = CGI::new()->param('item');
>>593 激しく同意!
中途半端なレス不要
最後まで丁寧に教えるか放置推奨
基礎がなっちゃいないやつにコード渡してハイサヨナラってのが良いってか? といって放置しちゃいつまでたっても厨房のままだから、勉強の方法を教えてるんじゃないか。
↑ それが中途半端なお節介って言うんだよ
懇切丁寧に指導してほしいんだったら2ちゃんねる以外で聞けば?
↑ 放置すればいいだろ? お前の理想の2chはここには無い!
今度は特定厨房かよ(嘲笑)
つーかMZ-2000使いは時代遅れだろ
ロクなアドバイスができない連中に限って煽り叩きには積極的なんだよなぁ
いや、俺には支障無いけど基本的には
>>595 や
>>599 に賛成である
ここは初心者コーナー。無知な人間こそ積極的に参加するべきである
604 :
名無しさん@お腹いっぱい。 :2001/06/29(金) 00:01 ID:dTFZ7jKs
今数当てゲームを作ってます。3ケタの数字を生成し、それぞれの桁の数字に ダブりがないかをチェックしたいのですが、いろいろやったのですがどうも うまくいきません。 なにかよいスクリプトがありましたら、教えていただけるとうれしいです。 ちなみに、こんな感じで生成しています。 srand; for (0..$place-1) { $rand[$_] = int(rand(9))+1; } # $place = ケタ数
>それぞれの桁の数字にダブりがないかをチェックしたいのですが 999 とかはNGで、566 とか 583 とかはOKってこと?
606 :
604 :2001/06/29(金) 00:25 ID:dTFZ7jKs
>>605 説明不足ですいません。
999,566はNG、583はOKです。
昔、女神転生っていうゲームであったコードブレイカーっていうゲーム
なんですよー。だれも知らないだろうけど。
my $num; my $nums; srand; for (0 .. $place - 1) { while (1) { $num = int(rand(9)) + 1 if ($nums !~ /$num/) { $nums .= "\0$num"; last; } } } my @rand = split(/\0/,substr($nums,1)); なんか汚い・・
>>606 @map{@rand} = ();
if(keys %map == @rand){
# ok
}
609 :
名無しさん@お腹いっぱい。 :2001/06/29(金) 00:35 ID:wJE5mVUE
>608 解説きぼん
>>604 ヒットアンドブローで探せばいろいろ見つかるかも
>>609 #--------------------------------------------------------
# ハッシュ%mapをスライスで一気に初期化
#--------------------------------------------------------
# @rand = (7,5,9,1,0) の時、(重複無し)
# $map{'7'} = $map{'5'} = $map{'9'} = $map{'1'} = $map{'0'} = undef
# %map のキー数 = 5, @rand の要素数 = 5
#--------------------------------------------------------
# @rand = (8,8,4,3,2) の時、(重複在り)
# $map{'8'} = $map{'4'} = $map{'3'} = $map{'2'} = undef
# %map のキー数 = 4, @rand の要素数 = 5
#--------------------------------------------------------
@map{ @rand } = ();
# ハッシュ%map のキー数と元の配列の要素数が等しければ、重複は無い。
if(keys %map == @rand){
# ok
}
うーん。綺麗に書くのは難しい…。
Perlらしいからいいか (´ー`)y-┛~~
1 while( (join("", sort(split //, $n = int( rand(999) )))) =~ /(\d)\1/ );
print $n;
私も
>>608 のスクリプトの解説きぼんぬ。
614 :
604 :2001/06/29(金) 01:27 ID:???
615 :
名無しさん@お腹いっぱい。 :2001/06/29(金) 02:19 ID:fQQ8ciRQ
大文字でHOGEと入力すると"Hello, HOGE"と返り、小文字、もしくは別の単語を 入力すると"Who are you?"、数字を入力すると"Type the letters"となるように したいのですが、どうしてもうまく行きません。 elsif ( $input != /\w/)だとうまく行きます。しかし elsif ( $input == /\W/)やelsif ( $input == /\d/) だと全く意図しない結果が出てしまいます。 具体的には elsif ( $input == /\W/)やelsif ( $input == /\d/) 数字を入力すると"Who are you?" HOGE以外の文字だと"Type the letters" なぜこうなってしまうのか教えてください。また、elsif ( $input == //)の 形で、//のところに/dを入れて意図した結果を得るのはどうすれば良いのでし ょうか? #!/usr/bin/perl -w $test = "HOGE"; print "What is your name?: "; chomp ( $input = <STDIN> ); if ( "$input" eq "$test" ) { print "Hello,$input\n"; } elsif ( $input == /\d/ ) { print "type the letter\n"; } else { print "Who are you?\n"; } __END__
616 :
名無しさん@マジ教えてください :2001/06/29(金) 02:26 ID:GZ8oljgs
PERLで、ファイルを作って、そこに書きこむことってできますか? echoでリダイレクトするみたいに、、 やり方教えてください。
>>615 正規表現の表記方法って知ってる?
elsif ( $input !~ /\w/)
elsif ( $input =~ /\W/)
elsif ( $input =~ /\d/)
>>616 system('echo >foo.dat Hello');
or
open OUT, '>foo.dat';
print OUT 'Hello';
close OUT;
>>616 >>618 さんの後者のやり方の場合
ディレクトリのパーミッションを変え忘れないようにね。
620 :
名無しさん@マジ教えてください :2001/06/29(金) 03:22 ID:GZ8oljgs
ありがとうございます。 これからやってみます。
621 :
615 :2001/06/29(金) 03:25 ID:fQQ8ciRQ
>>617 やっと意味が分かりました。
すんません。
622 :
616 :2001/06/29(金) 03:51 ID:GZ8oljgs
なぜかできないです。 ファイルを固定の名前にしても作成されませんし、書き込みもされません。 最終的には、配列の名前をくみ合わせた名前でファイルを作成して そこに別の配列の内容を書き込みたいんですが、可能なのでしょうか?
パーミッション
624 :
616 :2001/06/29(金) 03:54 ID:GZ8oljgs
具体的には、 $FORM{'namae'}_$zikan.txtみたいなファイルを作り、そこに $NyuryokuNaiyoを書きこむということをしたいと考えています。 どうやったらいいんでしょうか?
625 :
616 :2001/06/29(金) 03:55 ID:GZ8oljgs
サーバはWINDOWSなんですが、、、汁、、どうしたら、、
エラーメッセージくらい書けよ厨房
つーか、その程度の知識でCGIスクリプトを書こうとするなよ。危険すぎる。
628 :
616 :2001/06/29(金) 04:20 ID:GZ8oljgs
>>626 >>627 エラーがでないんです。CGIの一部で、CSVにFORMの内容を時系列で(当たり前ですか)書き出すようにつくって、
そのバックアップ用に各々FORMの内容を保存しようと考えたんです。
で、理由はわかりませんが、ブラウザで見る限りエラーは表示されません。
また、WINDOWSでパーミッションを変更する方法を知りません。今、探してるんですが。
FTPでは777になっているんですが、WINDOWSでは無理ということだったのでしょうか、、
629 :
名無しさん@お腹いっぱい。 :2001/06/29(金) 04:48 ID:w2xN.oIE
WindowsというとWebサーバはIIS? IISがわかる奴ここは少ないからなあ。おれも知らない。 とりあえずエラー補足用に use CGI::Carp qw(fatalsToBrowser); をスクリプトの最初に入れて、 open(OUT, '>foo.dat') or die "$!"; とでもしてエラーメッセージ出してみたら。
>>629 ローカルでデーモンとか使ってる可能性も。
>>616 =
>>629 Win鯖って事はパスミスじゃないか?
相対パスじゃなくて絶対パスで試してみたら?
あと、""の中で使うなら、\を\\にするのを忘れないようにな。
open OUT, ">c:\\inetpub/wwwroot/user/cgi-bin/$FORM{'namae'}_$zikan.txt";
print OUT "$NyuryokuNaiyo";
close OUT;
632 :
名無しさん@お腹いっぱい。 :2001/06/29(金) 12:24 ID:gTGq9vOI
もっとも効率よく(早くじゃなくて、メモリー、CPUをできるだけつかわずに) ファイルを読み込むにはどうしたらいいでしょうか。 open(READ,'/my/file'); push(@line,$_) while (<READ>); close(READ); としてますが・・・
>>632 open(READ,'/my/file');
@line = <READ>;
close(READ);
>>632 ファイル内容の書き換えがないなら
open(READ,'/my/file');
while (<READ>){
処理
}
close(READ);
の方がメモリは食わないと思う
「、、、汁、、」が気になってしょうがない
636 :
名無しさん@お腹いっぱい。 :2001/06/29(金) 14:47 ID:6bTr92VU
確実なロックがしたいんですが、どういったものがあるんでしょうか。 (flock以外しりません 特徴なども教えてもらえるとありがたいです。
ごめんなさい確実なファイルロックシステムは存在しません
そうなのですか・・・ では、flockが使えない場合、何を使用すればいいのでしょうか? 見極め方も教えてもらえると非常にありがたいです。
639 :
名無しさん@お腹いっぱい。 :2001/06/29(金) 17:12 ID:6dQwBEa6
time()を使って、いつからだったかからの秒数が取れますよね。 逆に例えば2001年,6月,29日,18時,30分,15秒みたいなモノから time()を使った様な秒数って取れるのですか? 7月1日以降はコレを表示って感じのものをやりたいんです。
http://tako.2ch.net/test/read.cgi?bbs=perl&key=984388283 380 名前:JAPU 投稿日:2001/04/30(月) 21:19
NAME
Time::Local - efficiently compute time from local and GMT time
SYNOPSIS
$time = timelocal($sec,$min,$hours,$mday,$mon,$year);
$time = timegm($sec,$min,$hours,$mday,$mon,$year);
# 使うときは、use Time::Local; するように。
JAPUさんいつもありがとうございます。
641 :
ピーちゃん :2001/06/29(金) 17:33 ID:okzsTr02
はじめまして。 変数名を変数で制御する方法を、どなたかお教え下さいますでしょうか。 お願いします。
643 :
なり :2001/06/29(金) 19:27 ID:???
SSI方式のカウンタを作ってます。 例えば200まで来たら数値を0に戻すというようなことがしたいのですが。 $countfile = "./count.log"; というファイルにカウンタ値を格納していっているのですが count.logの中身を0に戻すやり方を教えてください。
use IO::File; IO::File->new('>./count.log')->print(0);
645 :
なり :2001/06/29(金) 20:13 ID:???
ありがとうございます。 ただ自分はほんとに初心者向けの本しか持ってなく use IO::File; については解説がなくよくわかりませんでした。すいません。 200以上って場合は200という数値は どこに記入すればよいのでしょうか。
use IO::File; IO::File->new('>./count.log')->print(200);
647 :
名無しさん@お腹いっぱい。 :2001/06/29(金) 20:53 ID:T5IdSdfg
上級者になると簡単な事でもモジュールを使っているような気がするのですが、 大きな利点はなんでしょうか? モジュールを使うことによっての、悪い点はないのでしょうか? ご教授ください。 open(FILE,">$countfile"} flock(FILEOUT,2); print(FILE '0'); close(FILE);
>>647 簡単な事だからこそ標準モジュールで
てっとりばやく済まそうってことでしょ。
初心者の人もIOモジュールの使い方ぐらいは
早めに覚えとくといいっすよ。
>>647 モジュールは無関係だが、目をふさぎたくなるような酷いコードだな。
openの末尾はタイポとしても、酷さは変わらないぞ。
650 :
なり :2001/06/29(金) 23:32 ID:???
すいません。やっぱりできませんでした。 明日本屋でも行って調べてみます。
open(FILE,"+>$countfile"); ここは読み書き両方にしたほうがいいよ。flockの意味がない。
652 :
647 :2001/06/30(土) 01:12 ID:???
>648 マジレスありがとう。モジュールを使うと遅くなるとかは関係有りませんか? >649 651 つっこみありがとう。わざとでした。スマン。
モジュールを使うと遅くなるってのは確かにある。 オブジェクト指向なモジュールは特にそう。 だが、簡単なものなら速度より簡潔さを重視するし、 そうでない場合も自分で書くより正確なことが多いので多用するね。 ただし、IO::*モジュールは簡単な一発もの以外では使わない。俺はね。
654 :
名無しさん@お腹いっぱい。 :2001/06/30(土) 03:46 ID:piXvKdHw
Intel, APi522e.exeがインストールできないんですが どこがいけないんでしょうか?
>>654 「インストールできないんですが」で原因わかるわけねーだろ!
だいたいActivePerl-522て何だっけ? 古すぎてわからんよ。。。
とりあえず最新版入れろ。
656 :
名無しさん@お腹いっぱい。 :2001/06/30(土) 04:13 ID:piXvKdHw
最新版もはいらん。 システムレジストリがどうのってでてるんだが。
>どうのって それを書くのが一番。
658 :
名無しさん@お腹いっぱい。 :2001/06/30(土) 04:23 ID:piXvKdHw
アンインストレーションストリングへ書き込むことができない。 あなたはシステムレジストリでHキーローカルマシーンへ書き込む パーミッションをもっていない。 とかいてあるらしい。
659 :
名無しさん@お腹いっぱい。 :2001/06/30(土) 04:46 ID:coQpTjsk
>>658 Win2000やWinNTで、Administrator以外の一般ユーザでログインした状態で
インストールしたときと出てきそうなエラーメッセージだな。
660 :
名無しさん@お腹いっぱい。 :2001/06/30(土) 05:16 ID:9uBIGUjk
Administratorでログインしてるんだがな・・・。 どうすりゃいいのよ?
661 :
名無しさん@お腹いっぱい :2001/06/30(土) 05:34 ID:G8StaOtQ
HTTP_REFERER等を条件と比較して 別々のページに振り分けるものを作ろうとしているのですが・・・ 困っています。 条件に一致するならPRINTで@のHTML部分を出力して 一致しないならAのHTML部分を出力するように記述していますが 一致しない場合のHTMLが404になってしまいます。 何がいけないのでしょうか? Perl厨房で申し訳ありません・・・
>>661 何故かって?
それはファイルが存在しないから。
#機種依存文字を使うのやめれ。
663 :
:名無しさん@お腹いっぱい :2001/06/30(土) 09:51 ID:G/0pMLQw
>>662 レスどうも。
エラーコードの意味はわかるのですが
なぜ404になってしまうのかが解決できません。
現状ではindex.cgiというスクリプト中に
ページ1とページ2のHTML記述をして出力させるようにしているのですが
両ページの記述方法は同じなのになぜ
後者の方の場合だけ出力されないのでしょうか?
よろしくお願いします
664 :
昆布茶 :2001/06/30(土) 10:37 ID:???
↑スクリプトを公開すべし。
665 :
名無しさん@お腹いっぱい :2001/06/30(土) 11:17 ID:G/0pMLQw
>>665 ざっと見た感じだけど、
# if ($ENV{'HTTP_REFERER'} eq $_){
こういうところで、改行コードを除外してないから
flagが1にならないんじゃないか?
それでflagが0でも1でもないから何も表示されないとか。
末尾を
#HTML出力部分
if($flag == 0){
print "$accept";
}elsif(flag == 1){
print "$deny";
}else{
print "$error";
}
とかにしてみるのがよさげ。
てか、perl -c やってる? $flag の $が抜けてるよ。
668 :
667 :2001/06/30(土) 11:55 ID:???
ゴメソ。 チェック抜けるんだね…鬱…
669 :
666 :2001/06/30(土) 11:58 ID:???
>>667 そんなミスもあったのか。
ってコピペした場所にもあるじゃん!
チェック漏れスマソ。
教えてください iモードの絵文字に悩まされてます、絵文字を除去するにはどうすれば いいのでしょうか?
余り今時間無いんで眺めて見ただけだけど。 サーバに上げて見たけど動くんですよね。こっからどうしたいのかな? 強制的にリファ送ったけど認識するし。 >スクリプト以外のことでの誹謗中傷 若し機種依存文字の件だったら662さんは間違った事は言ってないかと。 Script書く上で文字コード・機種依存文字の問題はかなり難しい件であり、 各所でそのネタは重視されています。MLにも入って見れば、ウザイ ぐらいそれ系のネタは飛び交ってます。 いっぱしのScript書きを目指すならその辺の認識は重要かと私は思うのですが? その類のネタは知りたかったらすぐ見つかるので検索して勉強する事を お勧めしますよ。 実は今書きたかったのはこっち(笑)。 私もどっちかというと趣味Script書きなんでへぼなんですわ。
>666 なるほど、ぱっと見で気づかんあほの私もなんだか。 PHPに嵌り切ってるからPerl忘れてるって言い訳しても通じなさそう。 暑い中逝って来ます…。
673 :
661 :2001/06/30(土) 13:00 ID:???
なんとか前進できました。 あとここからは自分で勉強して解決しようと思います。 ご意見のほう参考になりました。 レスくれた方々どうもありがとうございました。
>>674 お恥ずかしい限りです、ありがとうございました。
>>654 -660
おれもMSI形式のActivePerlがインストールできなかったことがある。
ASPackage形式のやつだとインストールできた。
いやあんときはWin2kじゃなくてWin98使ってたんだっけかな?
ローカルマシン(ダイヤルアップ接続)から ファックス送信するモジュールとかあります?
678 :
654 :2001/06/30(土) 15:31 ID:9uBIGUjk
2000なんすけど。
679 :
ピーちゃん :2001/06/30(土) 16:26 ID:VUBp7HbU
はじめまして。 変数名を変数で制御する方法をどなたかお教え下さいますでしょうか。
>>678 うちも Win2Kで、APi522e.exeで入れたけど
特に詰まった覚えはないよ。
ちなみにその他の関係しそうな環境。
Apache1.3.14 + PHP4.0.5
何か他のがわるさしてるとか?
>>679 別スレで同じ事言ってなかったか?
レスが付いていた気がするが。
682 :
681 :2001/06/30(土) 16:36 ID:???
>>641 -642
違った、このスレだ。(ワラ
どっちにしろ、何度も聞くなよ。
683 :
ピーちゃん :2001/06/30(土) 16:37 ID:VUBp7HbU
681さんへ。 詳しいことはここで聞いてくださいと言われましたので。
684 :
ピーちゃん :2001/06/30(土) 16:39 ID:VUBp7HbU
もう投稿していましたね。 答えてくださった方もいましたね。 申し訳ありません。
685 :
名無しさん@お腹いっぱい。 :2001/06/30(土) 17:09 ID:6E6G/3mk
>>676 自分もMSI形式がインストール出来ない事がありました。
2〜3日後に再ダウンロードしたら無事にインストール出来ましたけど。
大きなファイルの時、こういう事って結構ある様な気が・・・。
686 :
678 :2001/06/30(土) 17:55 ID:9uBIGUjk
680 とりあえずオーエス再インストールするよ。
687 :
名無しさん@お腹いっぱい。 :2001/06/30(土) 19:39 ID:thezcssc
Jade.pmの使い方、日本語で解説してあるところありませんか? jcode.plと違う、Jade.pmの書き方を使いたいのですが。
689 :
名無しさん@お腹いっぱい。 :2001/06/30(土) 20:31 ID:thezcssc
>>687 Jcode.pmの使い方、日本語で解説してあるところありませんか?
jcode.plと違う、Jcode.pmの書き方を使いたいのですが。
スペル間違ってました。
基本形: my $jstr = Jcode->new("string"); print $jstr->xxx; # xxx = sjis, euc, jis, utf8 print Jcode->new("string")->xxx; print jcode("string")->xxx; だが俺は専らconvertしか使わない。 print Jcode::convert("string", "sjis");
実際のところ、conver()tだけ使えれば十分だと思うがな。
>>684 具体的にどんなことが知りたいの?
ちょっと抽象的すぎてよく分からない。
695 :
名無しさん@お腹いっぱい。 :2001/06/30(土) 22:57 ID:FLPQLr3k
リアル・プロデューサーは変換と転送を同時に行えることが できるのでしょうか? 手元にパソコンが3台もあるわけがなく、確認しようがないんですので、 スマソ。
696 :
ヽ(´ー`)ノ :2001/07/01(日) 01:25 ID:4azTXvJ2
----------------サポートは作者に頼みましょう---------------- --------使い方が判らないものは使わないようにしましょう--------
*.pm ファイルの使い方が和歌欄所〜!
700 :
名無しさん@お腹いっぱい。 :2001/07/01(日) 14:00 ID:jQM8Nz7E
厨房質問ですみません。 ディレクトリ内のファイル一覧を表示するのに #!usr/local/bin/perl print "Content-type: text/html\n\n"; print <<"HEAD"; <html><head><title>ichiran</title> </head><body> HEAD opendir(DIR,"./"); @list=readdir(DIR); close(DIR); @list=sort(@list); foreach(@list){ print "$_<br>\n"; } print "</body></html>"; exit; という風に書いてローカルで動かしたところ、ちゃんと動いたので サーバにアップロードして動かしてみたところエラーになって しまいます。原因はなんなんでしょう?くだらない質問かもしれ ませんがご教授願います。 ローカル:Win、ANHTTPd、Active Perl アップ先:hypermart.net
701 :
' :2001/07/01(日) 14:28 ID:???
'
>>700 #!/usr/local/bin/perl
703 :
700 :2001/07/01(日) 20:46 ID:???
>>702 あちゃ〜凡ミス・・。
鬱だ。逝ってきまス
あ、それとありがと。
Content-type: image/gif のようにpngファイルを出力する事は可能ですか? Content-type: image/png ?
>>704 可能だろ。
っつか、一度試行すればわかるだろうが。
706 :
JAPU :2001/07/02(月) 07:49 ID:???
たびたび申し訳ないっす iモードの絵文字をHTMLで表示するのはわかったんだけどメールで 表示する場合ってどうすればいいんでしょう?
送信? 受信? メーラーは?
709 :
名無しさん@お腹いっぱい。 :2001/07/02(月) 20:50 ID:wG0apBZw
WAKWAKざんまいでLWPをインストールしてる人いますか? ディレクトリ構造を教えてください
perl 始めて三日目、現在言葉狩りの勉強をやってるんですが、 ちょっと解らないところがあるのです。 $kinsi='うひ'; @kinsiword = ( '死', '殺', ); sub kinsi { foreach (@kinsiword) { $com =~ /$_/gi; $com =~ s/$_/$kinsi/gi; } } コレで送られてきたメッセージ内 ($com) の文字は上手く置換できるのですが、 @kinsiword = ( '', ); とすると、表示がおかしくなります。 例えば、$com が あ なら、 うひb、ひ�うひ という風に。 空の文字が配列内にあっても何も起こらないようにするにはどうしたら良いのでしょうか。
perl 始めて三日目、現在言葉狩りの勉強をやってるんですが、 ちょっと解らないところがあるのです。 $kinsi='うひ'; @kinsiword = ( '死', '殺', ); sub kinsi { foreach (@kinsiword) { $com =~ /$_/gi; $com =~ s/$_/$kinsi/gi; } } コレで送られてきたメッセージ内 ($com) の文字は上手く置換できるのですが、 @kinsiword = ( '', ); とすると、表示がおかしくなります。 例えば、$com が あ なら、 うひb、ひ�うひ という風に。 空の文字が配列内にあっても何も起こらないようにするにはどうしたら良いのでしょうか。
712 :
見習い君 :2001/07/02(月) 21:17 ID:???
@kinsiword = ();にする。又は if ($kinsiword[0]) { &kinsi; } てな感じに呼ぶ。
えっと、実は @kinsiword = ( '死', '殺', '', '', ); のような形にも対応させたいのです。 見習い君氏の方法では、やはり同じ結果になるのですよ。
すみません、いきなり自己解決しました。 sub kinsi { if ($kinsiword[0]) { foreach (@kinsiword) { if ($_){ $com =~ /$_/gi; $com =~ s/$_/$kinsi/gi; } } } } お騒がせして申し訳ない。
すみません、いきなり自己解決しました。 sub kinsi { if ($kinsiword[0]) { foreach (@kinsiword) { if ($_){ $com =~ /$_/gi; $com =~ s/$_/$kinsi/gi; } } } } お騒がせして申し訳ない。
先程から二重投稿ばかりでこちらも申し訳ない…
717 :
名無しさん@お腹いっぱい。 :2001/07/03(火) 00:10 ID:iSdl1db6
Perlって、スクリプトだから、ソースの内容を見られちゃいますよね。 コンパイルなどしてバイナリファイル化(もしくは簡単に読めない化) する良い方法をご存知の方はいらっしゃいますか? ちょっと調べてperlccっていうのを見つけたのですが、マニュアルによると、 実験レベルで製品などには使用しないようにと注意書きがあって使用を 躊躇しています。 実はお客さんに、Perlのスクリプトが入ったRedHatベースのLINUXマシンを 提供するのですが、中のPerlスクリプトは、簡単には解析してほしくない 事情があります。 最初からCなどでCGIを作ればよかったのですが、今となっては、 その時間もなく。。。らら〜、先見性のなさに、困っています。
perlccでコンパイル/バイトコードコンパイルするしかないと思うが。 「素人には分からない」ってのなら幾つか方法はあるがな。
719 :
717 :2001/07/03(火) 00:45 ID:iSdl1db6
>718 解析するの気力を失わせるだけでも、やる意義はあります。 よろしければ、「素人には分からない」方法のヒントを教えてくださーい。
つか、隠したいとこだけCにしちゃえばいいじゃん。
#!/usr/bin/perl # 簡易エンコード/デコードツール hperl use strict; my($encode, $decode, $hperl); while(@ARGV and $ARGV[0] =~ s/^-//){ foreach (shift){ /e/ and $encode++, last; /d/ and $decode++, last; /h/ and ($hperl = shift), last; } } if($encode){ print "#!$hperl\n" if $hperl; while (<ARGV>){ tr[a-zA-MN-Z0-9* _\t<>{}'"\n$:?][N-ZA-Mn-za-m5-90-4 *\t_}{><"'$\n?:]; print; } }elsif($decode){ while (<ARGV>){ $. == 1 and /^#!.*hperl$/ and next; tr[N-ZA-Mn-za-m5-90-4 *\t_}{><"'$\n?:][a-zA-MN-Z0-9* _\t<>{}'"\n$:?]; print; } }else{ open PERL, "|$^X -"; while (<ARGV>){ $. == 1 and /^#!.*hperl$/ and next; tr[N-ZA-Mn-za-m5-90-4 *\t_}{><"'$\n?:][a-zA-MN-Z0-9* _\t<>{}'"\n$:?]; print PERL; } close PERL; } __END__ $ hperl -e foo.pl >foo.hpl # エンコード $ hperl -d foo.hpl >foo.pl # デコード $ hperl foo.hpl # エンコードしたスクリプトを実行(但しスクリプト名はあてにしないこと) $ hperl -h /foo/bar/hperl -e foo.pl >foo # -h のあとにhperlのPATHを書いておく $ foo # 実行可能スクリプト(CGIとしての動作も可能?) これで生のスクリプトは読めない。
722 :
709 :2001/07/03(火) 10:08 ID:XVjOTMAw
補足します
WAKWAK(
http://www.wakwak.ne.jp )では
CGIスクリプトや自作モジュールの設置場所を/cgi-bin/直下に限定しています
×/cgi-bin/my_module/hoge.pm
○/cgi-bin/hoge.pm
LWPモジュール群(libwww-perl-5.53_94)を展開すると
/cgi-bin/以下にサブディレクトリが作成されるのでWAKWAKでは動作しないのです
require '/cgi-bin/my_module/hoge.pm';
や
BEGIN {unshift(@INC,'/cgi-bin/my_module/');}
use hoge.pm;
では使えませんでした
ディレクトリ構造を無視して全ファイルを/cgi-bin/に移動しようと思っても
同名ファイルが存在するので上手くいきません
どうすればよいでしょうか?
んー、管理者に言ってLWPをインストールしてもらうとか。 あと、かりに BEGIN {unshift(@INC,'/cgi-bin/my_module/');} がうまくいってても、 use hoge.pm; じゃ無理。 use hoge; ね。
ここ見てたらLWPをインストールしてください
use Module.pm;という発想に驚いた。
っつーかrequire '/cgi-bin...' ってなんだよ。 ルート直下のcgi-bin使ってんのか?
require './omaemona.txt'
ネタか? require './omaemona.txt' require '/omaemona.txt' require 'omaemona.txt' cgi-bin以下にあるスクリプト限定なら同じだろ? まー意地悪な設定ならエラー扱いされるけど
以下のような置換が上手く出来ません。 行の先頭に中黒が付いてたらリストとみなして、 <p>ほげ</p><p>・リスト1<br>・リスト2<br>・リスト3<br></p><p>ほげ・ほげ<br>・りすと4</p> <p>ほげ</p><ul><li>リスト1</li><li>リスト2</li><li>リスト3</li></ul><p>ほげ・ほげ</p><ul><li>リスト4</li></ul> というようなことをしたいのです。 どうにか良い方法は無いでしょうか。
>>730 4行目を6行目の様にしたいってことです。
732 :
238 :2001/07/03(火) 22:37 ID:???
あとできれば最新20件みたいなのも
733 :
732 :2001/07/03(火) 22:38 ID:???
誤爆でした。ごめんなさい。
>>730 あー、さらに追記です。
・リスト3<br></p> のような <br></p> や <p><br> などは段落置換処理を行なって出ないようにしてます。
#ちなみに <br> が複数続くことも無いです。
735 :
見習い君 :2001/07/04(水) 00:27 ID:???
>>730 元ファイルの構成がイマイチ判らないんだけど…
こんな感じかなぁ。。恥かしい処理だ。。
foreach $line (@lines) {
$line =~ s/^・(.*)/<ul><li>$1<\/li><\/ul>/;
$new .= "$line\n";
}
$new =~ s/<\/li>(<\/ul>\n<ul>)?<li>/<\/li>\n<li>/g;
print <<"EOE";
Content-type: text/html
$new
EOE
exit;
@linesにファイル入れてね。
s/\//;よりs{/}{};のほうがいいと思われ。
間違い。 s/\//;→s/\///;
739 :
見習い君 :2001/07/04(水) 09:37 ID:???
あ、なるほど。ご指摘ありがとう。見習いますれす。 foreach $line (@lines) { $line =~ s{^・(.*)}{<ul>\n<li>$1</li>\n</ul>}; $new .= "$line\n"; } $new =~ s{</li>\n(</ul>\n<ul>)\n<li>}{</li>\n<li>}g; こんな感じになるんかな?
740 :
見習い君 :2001/07/04(水) 09:40 ID:???
>>738 重いからあとでね。てか何がダメだったか書いてくれ。
>>740 @lines にファイルを入れるということで、
@lines = $com; #com はデータ (タイトルや投稿者、メッセージなど)
としました。
742 :
見習い君 :2001/07/04(水) 17:20 ID:???
(´□`)・・・ 行の先頭に「・」がくるって言ったくせに・・・(;;)
744 :
見習い君 :2001/07/04(水) 17:57 ID:???
sub paragraphの最後にこの2行をつっこみ。 $com =~ s{>・([^<].*?)<}{><ul><li>$1</li></ul><}g; $com =~ s{</ul><br><ul>}{}g; 時間かかっちゃった(-▽-;
>>744 完璧です、素晴らしい。
ありがとうございました、今度はこれを解析して学習してみようと思います。
#実はどういう処理してるか解らない(汗
746 :
見習い君 :2001/07/04(水) 21:36 ID:???
ん、ドット消し忘れた。
前から思ってたんだが… s///o; の o って何だろう? g と i は解るが、o は未だに解らない…
>>747 パターンを1回だけコンパイルする
と青ラクダ本に書いてある
>>747 foreach(1 .. 9){
$test = "123456789";
$test =~ s/$_/a/og;
print $test ."\n";
}
こういうことを試してみれば、どういう事かわかると思う。
処理時間の取得ってどうやるんだっけ… やり方が見つからないんでここで質問。 ちなみにスクリプトの実行から終了までの時間を取れれば。 #ベンチマークやるんで
実行速度の比較をするだけなら times 関数とか。
time perl hogehoge.pl それとも use Benchmark かしら
おー、times 使ったら一応比較は出来たよ、さんくす。 use Benchmark は…どうやって使うのか解らない(汗 use Benchmark; (コード) その後、結果を出力する方法が解らないっす。
#!/usr/bin/perl use Benchmark; #1 $t1 = new Benchmark; code; $t2 = new Benchmark; print "the code took:", $t2->timediff($t1)->timestr, "\n"; #2 $count = 10000; timethese( $count, { foo => sub{ code1 }, bar => sub{ code2 }, }); __END__
755 :
707 :2001/07/05(木) 17:37 ID:???
え〜、あれから調べてみたんですが i−modeからFROMタグを使ってsendmailでiーmodeなり PCにメールを送る際に文字化けが起こるので絵文字を他の文字に変換したりは していたんですが、i−modeからFORMタグを使ってi−modeに送る 場合はなんとか絵文字が送れないかと思ったのです。 ざっと文献やネットを見回していると「無理だ」とかかれてましたね。。。 でも今話題の出会い系サイトでいくつかのサイトでは送れるんですよね、なんで だろう?
756 :
JAPU :2001/07/05(木) 18:24 ID:???
>>753 そういう場合はドキュメントを見るのが正解。
man Benchmark
or
perldoc Benchmark
757 :
名無しさん@お腹いっぱい。 :2001/07/05(木) 19:02 ID:WznWMXto
デバッガの x (変数) コマンドみたいに、リファレンス、配列、ハッシュなどを たどって綺麗に表示してくれるパッケージ等はありますか?
760 :
名無しさん@お腹いっぱい :2001/07/05(木) 20:16 ID:4qZ7uZOM
perlでフォームメールを作ったのですが、そのメールの送信まではうまくいきます。 そこにそのメールの内容をログとしてファイルに記載したいのですが、 どうすればよいのでしょうか?
761 :
ど素人 :2001/07/05(木) 20:35 ID:???
これって どこかまちがってますか? 22時間かかってもわかりません どなたかキツイ指摘を・・・ 環境変数のスクリプトです #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<html>\n\n"; print "<title>Proxy checkr</title>\n; print '<body bgcolor="black" text="dimgray" link="dimgray" alink="dimgray" vlink="orangered">'\n $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; $red = '<font color="silver">'; $endf = '</font>'; if ($host eq "") { $host = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $addr } print "<br><br>\n; print "$host\n" ; if ($host =~ /(proxy|prox|squid|cache|www|dns|ns|gateway|gatekeeper|gate|^gw|^fw|firewall)/i){ print "$red<- テスト $endf <br>\n"; $pflag = 1; } else { print "<- テスト<br>\n"; $pflag = 0; } $via = $ENV{'HTTP_VIA}; if( $via != "") { print "$red HTTP_VIA テスト -> $via $endf<br>\n; print "テスト<br>\n"; $via_flag =1; } else { print "テスト<br.\n; $via_flag = 0; } $client = $ENV{'HTTP_CLINT_IP'}; if( $client != "" ) { print "$red CLENTテスト-> $clint $endf<br>\n; } else { if ($via_flag == 1) {print "テスト"<br>\n";} else { if ( $pflag == 1 ) {print "テスト<br>\n"; } else { print "テスト?<br>\n"; } } print "\n</body>\n"; print "</html>\n\n"; exit;
762 :
名無しさん@お腹いっぱい。 :2001/07/05(木) 20:41 ID:FPnmy2lY
print '<body 〜 vlink="orangered">'\n ↑なにこれ?
763 :
757 :2001/07/05(木) 20:58 ID:???
>>761 つーか、クォーテーションの囲い損ねが沢山…
キツイ指摘する気力も起こらんわ。
しかし
>>761 見たいな奴は何見て勉強してるんだろうな。
Perl5対応のマトモな本 or スクリプトなら
普通q/qq/qxクォートやヒアドキュメントが載ってると思うのだが。
…糞本や糞スクリプトが出回っているってことか(鬱)
まぁなんだ。
とりあえず
>>761 は注意力をもうちょっと上げてくれ。
767 :
名無しさん@お腹いっぱい。 :2001/07/05(木) 22:14 ID:2FhZLyb6
エラーログ 見てみ
>>765 他人のスクリプトをコピペして使ってるんだろ?
本なんか読んでないに決まってるじゃないか。
・・・昔の俺がそうだったんだよ。
769 :
ど素人 :2001/07/06(金) 00:33 ID:???
みなさん レスありがとうございました もっと 注意力をあげてきます 動かせるようになったら報告します 本も色々読んだ方がいいのですか よい本と糞本の区別もつかないもので・・ ありがとうございました
772 :
ど素人 :2001/07/06(金) 00:59 ID:???
>>770 ありがとうございました
たすかります
>>771 はい
Active Perlでやってます
773 :
ど素人 :2001/07/06(金) 02:22 ID:???
うごかね〜〜〜〜〜〜 だいたい 俺みたいなスーパー初心者が 「ちょ〜っといぢってみようかな〜」なんて 色気だしたのが間違いでした フリーシージーアイのパス変更のみで 満足するべきでした 折角レスもらったのにすみません 一から出直してきます m(_ _)m
774 :
名無し :2001/07/06(金) 03:31 ID:YsXZOyrU
サブルーチンについて勉強しています。 一つでは書き込めないため、三つに分けさせて頂きます。 ごめんなさい。 775のスクリプトで return $result_x, $result_y; この一行があると無いとでは結果が全く違います。 ここで問題にしたいのは$calc_value[0]と$calc_value[1]に入る値です。 この一行があってもなくても、いつでも $calc_value[0] = $argument1(つまり10) $calc_value[1] = $argument2(つまり1) というわけではないのでしょうか? また、776にある my ($result_x, $result_y, $argument1, $argument2); ($argument1,$argument2) = @_; この二行はそれぞれこのスクリプトの中でどういう役割を果たしているのでしょうか? 宜しくお願いします
775 :
名無し :2001/07/06(金) 03:31 ID:YsXZOyrU
#!/usr/bin/perl -w $argument1 = '10'; $argument2 = '1'; @calc_value = &return_value($argument1,$argument2); print "$calc_value[0]\n"; print "$calc_value[1]\n"; sub return_value { $result_x = $argument1 + $argument2; $result_y = $argument1 + $result_x; print "----サブルーチン始----\n"; print "\$result_x = $result_x\n"; print "\$result_y = $result_y\n"; print "\$argument1 = $argument1\n"; print "\$argument2 = $argument2\n"; print "----サブルーチン終----\n"; return $result_x, $result_y; }
776 :
名無し :2001/07/06(金) 03:32 ID:YsXZOyrU
#!/usr/bin/perl -w $argument1 = '10'; $argument2 = '1'; @calc_value = &return_value($argument1,$argument2); print "$calc_value[0]\n"; print "$calc_value[1]\n"; sub return_value { my ($result_x, $result_y, $argument1, $argument2); ($argument1,$argument2) = @_; $result_x = $argument1 + $argument2; $result_y = $argument1 + $result_x; return $result_x, $result_y; }
↑ 悪い。 use strict;が無いってだけで目が読むのを拒否しやがった。
>>774 -776
# 775
> $calc_value[0] = $argument1(つまり10)
> $calc_value[1] = $argument2(つまり1)
> というわけではないのでしょうか?
まず、returnしている変数が$result_x,$result_yなのでお望みの結果にはなりません。
常に10,1でいいなら
return($argument1, $argument2);
としてやればいいでしょうね。
# ただ、こんなことやってもこのサブルーチンの存在している意味がないですけど。
ちなみに、サブルーチンに明示的にreturnを指定していない場合は
一番最後に評価された値が戻ります。
@calc_value = (1,undef); という結果になるかと。
# 776
まず、レキシカル変数について勉強しましょう。
グローバル特殊配列@_には、サブルーチンに引き渡された変数が格納されています。
> my ($result_x, $result_y, $argument1, $argument2);
> ($argument1,$argument2) = @_;
まず、4つの変数をレキシカルスコープ宣言した後に、
変数を代入しているわけです。
# 説明下手ですいません。
779 :
名無しさん@お腹いっぱい。 :2001/07/06(金) 05:30 ID:YsXZOyrU
>>778 すみません。775の説明はよく理解したのですが、776の説明がよく理解できません。
@_ = ($argument1, $argument2);
ではなく、逆になっているのが良く分かりません。
また($argument1,$argument2) = @_; をサブルーチンの中に置くのと外に置くのと
では意味が変わるのでしょうか?
()や位置関係が絡むとややこしくって・・・。
お願いします。
780 :
名無しさん@お腹いっぱい。 :2001/07/06(金) 07:56 ID:ex2YDxP.
引数わたし>779
781 :
778 :2001/07/06(金) 09:48 ID:???
>>779 仮に、$str1に$str2を入れたい場合、どうします?
$str1 = $str2; とするでしょう?
同じように、$argument1,$argument2に@_を入れてるんですよ。
サブルーチン内では$argument1,$argument2共にレキシカル変数になっているので
もはや10,1という値は入っていません。それを代入してやってるというか。
@_は場所によって、適宜引数が格納されているので、意味は変わるというのが正解でしょうか。
>>779 一度、本屋さんに置いてある全てのPerl本の「サブルーチン」を
説明している部分を立ち読みすると良いと思いますよ。
783 :
名無しさん@お腹いっぱい。 :2001/07/06(金) 15:44 ID:RNx.m3EU
>>781 なるほど!
自分で色々試してやっと理解しました。
ありがとうございました。
でも参考書の一冊も手元にないのも限界かな・・・。
785 :
名無しさん@お腹いっぱい。 :2001/07/06(金) 18:05 ID:YlE0Cv3o
786 :
783 :2001/07/06(金) 22:54 ID:GVXvZTOc
>>787 gmtime(time() + 9*60*60);
>>787 タイムゾーンと時間取得の関数について勉強してください。
# $ENV{TZ}, localtime(), gmtime() あたり
791 :
VEDA :2001/07/07(土) 21:22 ID:???
すいません・・
http://cgi18.plala.or.jp/downward/ このCGIで改造途中いきづまってしまいました。
サポートへはきけないのでだれかおしえてくださーいぃ
ここのスクリプトの表示部分のhtml.cgiに「$id」があります。
ちなみに$idの例をあらわすと
1-1とか1-2とかスレッドの番号です
この$idをveda.cgiの860行あたりにある
sub make_partial_message{
の部分で$idのショットカットをつかいたいんです。
どうすればつかえることができますか?
自分のめちゃくちゃな発想では
my $thread = shift;
ここを変えるとおもうのですが・・
どなたかどうかおしえてくださいぃ〜
今日の昼からずっと考えてトライしまくって無理でした・・
目が痛いです。だれかおしえて〜〜〜〜!
792 :
787 :2001/07/07(土) 21:29 ID:???
すべてのtimeをtime +15*60*60にかえたら動きました。 みなさんありがとうございました。
794 :
VEDA :2001/07/07(土) 22:25 ID:???
お そっちいってみます
795 :
DAZZ :2001/07/08(日) 11:11 ID:6Jyxvsmw
URLの関係で、CGI使えないトコにあるフレームセットから、 SSIを呼び出しています。 こういった場合、アクセスログ解析で、 refererを取得する事はできないんでしょうか? やはり、直接htmlやcgiを指定しないと無理ですか? どなたかご存じでしたら、教えてください。
↑ これいい加減FAQだよな。
document.write( "<img src='accesslog.cgi?referer=" + document.referer + "'>" );
>>795 過去ログに<em>90%同じ</em>質問があり、回答もされています。
読みましたか?
800 :
DAZZ :2001/07/08(日) 16:32 ID:CHSNDL26
みなさま、ありとうございました。 refererとフレームで検索かけつつ見たつもりでしたが、 見逃してしまったようです。 もう一度探してみます。 すいません。
801 :
名無しさん@お腹いっぱい :2001/07/08(日) 20:01 ID:hb0UPetQ
>>802 さん、
>>803 さん、即答有難う御座います、頭が破裂しそうです
が教えていただいた内容が理解出来る様に精進いたしますです。
あー情けなや、やっぱり芯でしまいたいです。。。
805 :
:2001/07/09(月) 02:22 ID:fbWvSC9U
ランダム性について質問させてください。 例えば、100のパターンの分岐をさせたい場合、 -方法1- srand(); $randam = int(rand(100)); if ($randam == 1){ $doreka = "1.txt"; }elsif ($randam == 2){ $doreka = "2.txt"; }elsif ($randam == 3){ $doreka = "3.txt"; ・・・・・・以下elseまでずっと続く・・・。 -方法2- パターンを20個つづの5グループに分けて、 最初にグループを選んで、次にグループの中で パターンを選ぶ・・・ この場合、均等にばらけさせるのは方法2のほうなのでしょうか? また、他にもっと効率よくばらけさせる方法はあるでしょうか?
>>805 方法1で充分だと思うけど。
ただしifで分けるんじゃなくて、
$dareka = "$random.txt"; とでもしてやれば。
あと、Perl5以降はsrand要りません。
807 :
S :2001/07/09(月) 03:12 ID:???
@doreka_array = qw( 1.txt 2.txt 3.txt ... 100.txt ); $doreka = $doreka_array[int rand @doreka_array]; みたいなのがいちばん簡単なのではないでしょうか。 $MAX = 100; $doreka = (int(rand $MAX)+1). ".txt"; も、使えるかも。 均等さは1も2も同じだと思います。もともとrandは引数が大きくなれぱ ランダムじゃなくなりますし、気にすることはないでしょう。
809 :
名無しさん@お腹いっぱい。 :2001/07/09(月) 10:26 ID:8Wkoq3g6
昔、偏りのある乱数を出すスクリプト書いたとき 807と同じ方法を使ったよ。 んでも805の場合は 出力する値が数字.txtとなってて一体感があるから $num = int( rand((100) ) + 1; #1-100までのランダムな数字がはいる $dareka = "$num.txt"; でいいんじゃないかな?
810 :
名無しさん@お腹いっぱい。 :2001/07/09(月) 14:49 ID:8Wkoq3g6
perlでメモリの使用量を見るにはどうしたらいいんでしょうか?
$ENV{'HTTP_REFERER'} これでREFERERが取れないことが凄く多いんだけど何故でしょうか? 明らかにbookmarkやコピペじゃない場合でも取得できないんですが。 ログ見てると取れる時間帯と取れない時間帯がありそうな気がするんですが。 鯖の状態によって取れたり取れなかったりするもんでしょうか?
proxy が削っていることもある。
813 :
811 :2001/07/09(月) 16:34 ID:???
串刺してなくても取得出来ないことが多いんですよね。 取得できないからといって困るわけではないんですが。
814 :
名無しさん@お腹いっぱい。 :2001/07/09(月) 17:18 ID:8K4xE7OM
チャットにURLを打たせてメッセージの前に「□」をつけてリンクを張ろうとしているのですが
URLとメールアドレスを打っていないとどちらともにリンクを張らず
かたほうにあるとそちらにリンクを張るようにしたいのですが
if ($in{'email'} eq "" & $in{'url'} eq "") { $name = "$pointer □ <b>$in{'name'}</b>"; }
if ($in{'email'} eq "" & $in{'url'} ne "") { $name = "$pointer <a href=\"
http://$in{ 'url'}\" target='_blank'>□</a> <b>$in{'name'}</b>"; }
if ($in{'email'} ne "" & $in{'url'} eq "") { $name = "<a href=\"mailto:$in{'email'}\">$pointer</a> □ <b>$in{'name'}</b>"; }
↑のようにしてもうまくいきません。
わかる方がいればよろしくお願いします。
>>810 Windowsでは無意味ですが、
環境変数PERL_DEBUG_MSTATSに1か2をセットしてperlを起動するとメモリ統計を表示できます。
Windowsの場合はどうすればいいのかは分かりませんね。
>>814 "&"ではなく"&&" または"and"を使うと幸せになれます。
ついでにif-elsif-elseを使うと更に幸せになれます。
817 :
816 :2001/07/09(月) 17:49 ID:???
かぶった…
818 :
名無しさん@お腹いっぱい。 :2001/07/09(月) 18:53 ID:zlMbWq72
>>814 andにしてみたのですがどうもうまくいきません。
if ($in{'email'} ne "" & $in{'url'} eq "")...はうまくいくのですが
それ以外がどうもだめです。
なにか問題があるのでしょうか?
if-elsif-elseの使い方がいまいちわかりません。
よろしくお願いします。
>>814 =818
試しましたが、&&でもandでも問題ないですけど。
まぁオペランドの違いによって優先順位ありますけどね。
つーか、両方とも値が入っていた時の処理してないから問題あるんでないの?
$in{email}と$in{url}の両方に値があったらどうすんのさ。
このままだと何も出ないじゃん。
>if-elsif-else
本でも買って一から勉強したほうがいいと思いますが。
>if ($in{'email'} ne "" & $in{'url'} eq "")...はうまくいくのですが &の意味も分からず何を仰っているのですか?(笑) もしかしてあなたM女史ですか?(笑)
ネタに一票
>>814 if ($in{'email'} eq "" && $in{'url'} eq "") { $name = qq($pointer □ <b>$in{'name'}</b>); }
elsif ($in{'email'} eq "" && $in{'url'} ne "") { $name = qq($pointer <a href="
http://$in{ 'url'}" target='_blank'>□</a> <b>$in{'name'}</b>); }
elsif ($in{'email'} ne "" && $in{'url'} eq "") { $name = qq(<a href="mailto:$in{'email'}">$pointer</a> □ <b>$in{'name'}</b>); }
else{両方入っていた場合の処理;}
ホラよ。
わかったら帰れ。
基本を覚えてくるまで帰ってこないでくれよ。
if-elsif-else で疑問に思ったんだけど、 if ( 条件1 || 条件2 || 条件3 || 条件4 ) { 処理 } if ( 条件1 ) { 処理 } elsif ( 条件2 ) { 処理 } elsif ( 条件3 ) { 処理 } elsif ( 条件4 ) { 処理 } else { } っていうのはどちらが良いんだろう。
{ 処理 } に修正をするときに、1 回修正すればいいってのと、4 回修正 する必要があるってんじゃ、手間が全然違うだろ?
ふむ、前者の方で良いのか…さんくす。
ちなみに
>>823 の処理っていうのは全部エラー処理だったり。
2ch用ブラウザってどれが一番つかいやすいの? いっぱいあるけどみんなはなにつかってるんだろ? 今からつかってみようとおもうんだけどサ! あと2ch用ブラウザは2ch型ならどれでも対応してるんですか?
830 :
名無しさん@お腹いっぱい。 :2001/07/09(月) 23:00 ID:75iCECGw
まだ発展途上みたいだけど、ちょっと期待。
831 :
名無しさん@お腹いっぱい。 :2001/07/10(火) 00:21 ID:lYKZ.3Dg
ファイルハンドルについて勉強しています。 Booksというファイルに任意の文章を書き付けておき、それを行で表示するとい うものなのですが、++$testだけでなぜ一行ずつ加算されていくのか良く分かり ません。『++』が一つずつ数を増やしていくためのものだというのは分かってい るのですが、このスクリプトにおいて数を増やすポイントをどのように認識して いるのか分かりません。 行頭で必ず行数が一つ増えて表示されるわけですが、『++$test』がどのポイン トで一行増やすという認識をしているのでしょうか? うーん。質問の仕方がマズいかな・・・。 このスクリプトにおいて、『++$test』はなぜ『行数を一つずつ増やせ』という 命令だと解釈できたのでしょうか?『$test』については行数を代入せよと指定し ているわけでもないのに・・・。 自分で作っておきながら混乱してしまいました。 #!/usr/bin/perl -w $file = "./Books"; open IN, "<$file"; while ( $contents = <IN> ) { chop ($contents); print ++$test, "行: ", $contents, "\n"; } close IN;
ひとつのCGI(imgを呼ぶ方式)で 複数のページのアクセスログをとっているのですが、 どのページを見たログかを知るためには どのような環境変数を使えばいいのでしょうか?
>>831 ファイルハンドルと関係ないが?
ただ単にプラス1する演算子。
ちなみに
++$count
$count++
は、ちょっと振る舞いが違う。
>>831 $testはただ単に行数の表示のみ。
$testは何も指定していない。
whileループで順に行を読み込んでいる。
837 :
831 :2001/07/10(火) 15:42 ID:kZaiDUJU
>>834 >>835 何となく分かって来ました。
書き付けたファイルの全体を読んでいるのではなく、
行ごとに読み込んでいるんですね?
ありがとうございました。
838 :
名無しさん@お腹いっぱい。 :2001/07/10(火) 15:43 ID:SGYXQF82
D&Dで渡したファイルのファイル名を第一引数として 処理できるようにってなんかうまい事できないでしょうか? ActivePerlに関連付けた.plファイルだとD&D自体受け付けない・・
なんでD&Dが必要なんだ? とりあえず$0は知ってるのかしら。
840 :
838 :2001/07/10(火) 17:04 ID:SGYXQF82
ローカルで動かす場合です。 Webとは関係ないですけど他に聞く場所見当たらなかったもんで・・ 例えばフォルダをD&Dで渡すとそのフォルダのtreeを表示する。みたいな感じのが作りたいんです。 perl c:\myperl\tree.pl %1 pause みたいなBATファイル作ってそれにD&Dってやるとうまくいくんですが 直でperlに渡せないもんかなと・・
841 :
838 :2001/07/10(火) 17:10 ID:SGYXQF82
直でperlに→直でtree.plに です。
>>840 -841
このスレの上の方で書かれていたSOSを試してみたら?
あれでCOMファイルにすればD&Dできるとおもうよ。
SOSはいいよ。マジで。
844 :
838 :2001/07/10(火) 17:56 ID:SGYXQF82
おお、これD&Dにも対応してたんですね。すご・・ や、一度落としてたんですが「BAT2COMみたいなやつか」と思って コマンドラインで使わない限り必要ないと思って使ってませんでした。 うまくいきました。ありがとうございました。
845 :
805 :2001/07/10(火) 23:20 ID:???
うをっ D&Dってドラッグ&ドロップなんだな? ある意味で新鮮な文字列に感じたぞ
847 :
名無しさん@お腹いっぱい。 :2001/07/11(水) 15:42 ID:9cey.Kcg
<job id="test"> <script language=PerlScript> use Win32::OLE; Win32::OLE->new('WScript.Shell')->Popup('Argument: '. $WScript->Arguments(0),2); </script> </job> これをhoge.wsfファイルにして、何かをD&Dしてみそ。
>>847 それってPerlをインストールしてなくても有効?
dame!
850 :
848 :2001/07/11(水) 18:32 ID:???
駄目か…がっくし。 XPにActivePerl標準搭載してくんねぇかなー。
>>848 別に、今の環境に普通にActivePerl入れればいいだけでは?
852 :
848 :2001/07/11(水) 20:58 ID:???
いや勿論マイPCには入れてるけどさ、 知人らに送るときPerlのインストールを強制させるとなると…ね。
N$はPerl使うならVBスクリプト使えって言いそうだ…
854 :
名無しさん@お腹いっぱい。 :2001/07/11(水) 21:54 ID:tfiGyRpE
JScriptにしとけ。
(―_―)ソウダネ・・・
856 :
名無しさん@お腹いっぱい。 :2001/07/12(木) 10:08 ID:L16.sTWQ
WSHのperlscriptちょっと興味あるんだけど リファレンスみたいのWeb上でない? 探したけど見つからなかった・・
857 :
名無しさん@お腹いっぱい。 :2001/07/12(木) 11:14 ID:Dza9cSXY
わしも知りたい。 現状だとMicrosoftのWSHドキュメントから類推するしかないから。
858 :
名無しさん@お腹いっぱい。 :2001/07/12(木) 11:55 ID:Dza9cSXY
WSH with PerlScriptだと、日本語が入っていると、 それがコメントとかでも、エラーを誘発することがあるよ。
859 :
名無しさん@お腹いっぱい。 :2001/07/13(金) 14:45 ID:7/Tjfp6w
861 :
名無しさん@お腹いっぱい。 :2001/07/13(金) 17:24 ID:7/Tjfp6w
色々な方法があるんですね。 WSHからだと、IEを作成して外からdocument.body.innerHTMLを書き換える 方法があるんだけど、HTAだと直に自分自身をいじれるから面白そうですね。 Drag&Dropはできないみたいですね。
HTAってなんすか?>>_gunzipさん
864 :
863 :2001/07/13(金) 18:38 ID:???
っと、HTML Application ですね。失礼
865 :
http://N72ch-01p110.ppp11.odn.ad.jp :2001/07/13(金) 20:57 ID:V4/V4Mao
while (<>) { } を使わないで同じ処理をできる方法教えてください・・・・
for(;<>;){}
>>865 perl -n SCRIPT INFILE
コマンドラインのみ。
各プロバイダのサーバに、perl のどのバージョンが入っているかを 一覧したようなものはどこかにありませんか?
ところで、何で perl スクリプトの拡張子が cgi なんでしょ。
>>869 perlでやる物って言ったらcgiスクリプトくらいしかないからじゃないの?
ネット上でやるものは・・・・
後知らん。
つかperlの拡張子ってplじゃなかったっけ。
拡張子は、人間がわかりやすいようにつけるものなので(少なくともUNIXでは)、 あまりどれにするかどうかは意味がないものと思われ。 拡張子が.cgiでも.plでも.hogeでも、あるいはなくても、最初の1行目の 特殊コメント #!/usr/bin/perl がファイル識別の印なのですから。 もっとも、.htaccessのようにファイルの識別に拡張子を使っている例はある のが難しいところ。 magicというのもあったなぁ。
>>869 Perlスクリプトの拡張子が.cgiなんじゃなくて、CGIの拡張子が.cgi。
.cgi というファイルにアクセスがあったら、WWWサーバがCGIとみなして
それを「実行」させる。
その後は872の言う通り、最初の行が #!/usr/bin/perl なら Perl によって実行されるし、
#!/bin/sh でシェルスクリプトなのかもしれないし、
#!/usr/bin/ruby で Ruby が使われるかもしれないし
あるいはスクリプトじゃなくてCでコンパイルされたバイナリでも、C++でも、
実行可能なファイルで、結果として適切なContent-Typeを返せば何でも良い。
あー、なるほど。 確かに拡張子なんて余り意味無いですからね…いや無いって言ったらアレなんですが。 何はともあれサンクスです。
875 :
名無しさん@頭いっぱい。 :2001/07/18(水) 16:10 ID:p4.NpWMw
AccessのデータをWebで扱えるようにしたいので VBScriptでAspファイルを書いています。 ここでVBScriptとHTMLを分割して、VBを独立させてしまいたいのですが まずどうすればよろしいでしょうか?
↑ 何故「Perl」スレに書くのか不思議だ…。
877 :
名無しさん@お腹いっぱい :2001/07/18(水) 19:13 ID:gsEdjJ4E
今から保存するファイル名と同じファイルがなかったら指定ディレクトリにそのファイル名で保存して、 あったら保存を止めて、そのファイルを表示するというのをしたいのですがどうしたら言いのでしょうか。
878 :
名無しさん@お腹いっぱい :2001/07/18(水) 19:23 ID:f5fW.spo
>>877 ちょっと修正しますです。
今から保存するファイル名と同じファイルがなかったら指定ディレクトリにそのファイル名で保存して、 表示。
あったら保存を止めて、そのファイルを表示するというのをしたいのですがどうしたら言いのでしょうか。
-f "filename"
880 :
sage :2001/07/18(水) 20:52 ID:???
-e "filename"
881 :
878 :2001/07/18(水) 23:58 ID:???
CGI質問スレに書いたほうがよかったですかね?
883 :
名無しさん@お腹いっぱい :2001/07/19(木) 04:28 ID:DofrXLhM
リファレンスとデリファレンスについて勉強しているのですが、参考になるスク リプトを元に勉強しているわけではなく、参考書を読みながらどういう機能なの か探っているだけなのでいまいち理解できないでいます。 これはどういう時に使えば良いものなのか、どういう時に使うものなのか教えて ください。
10の倍数ってどう表すの?
10n
% 10 == 0
10n n=整数 小学生でもわかるやん
889 :
名無しさん@お腹いっぱい。 :2001/07/19(木) 19:01 ID:pJLvWZos
∈10Z
>>883 俺はプログラミングPerlを読みつつ色々スクリプトを書いて理解した。
使い方は覚えれば自然と使うようになると思うぞ。
891 :
名無しさん@お腹いっぱい。 :2001/07/19(木) 22:32 ID:QQ.KsOwc
>>883 使うべき時が来れば、って答えになってないか。
でも自分はそんな感じだったんだよね。
ちなみに自分は実際に使うまで理解できませんでした。
掲示板のセキュリティーで気をつけないといけないこと ってなに? なんかこの前IP表示するとこでIPにタグ使われて 荒らされてたんだけど これは凡ミスなんかな
>>894 open MAIL "| sendmail -f $maddr";
とかかな。sendmailのオプションは忘れたんで違うかも。
897 :
わ、 :2001/07/20(金) 03:36 ID:O.8zSDuM
age
>>898 その前に、俺には894の言ってる意味がわからん。
IPにタグって何よ?
>>899 サクセスの掲示板荒らしのときも使われてた。
IP取得に$ENV{X_FORWORD_FOR}(だっけ?)かなんかを見てる掲示板の場合、
ローカルプロクシとかでそこになんか突っ込んどく。
それを表示するから、掲示板閲覧者からするとIPにタグが入ってるように見える。
・・・・って感じだったはず。そっち方面には詳しくないんで適当。
訂正は歓迎するけど煽らないでね。
>>898 $ENV{X_FORWORD_FOR}をそのまま使ってると汚染された文字列という
ことで警告が出るという意味では。
902 :
898 :2001/07/20(金) 16:25 ID:???
>>899 丁寧な説明感謝。
素で意味がわからなかったもので。
それを踏まえた上で。
基本的に、私は外部からの入力は全部チェックしてます。
$ENV{HTTP_X_FORWARDED_FOR}であれば、
$ENV{HTTP_X_FORWARDED_FOR} =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)\D*/
and
print "$1.$2.$3.$4";
くらいですかね。
いっそ表示しなければ良いのでは。。。。 もしものときにログにさえ残しておけばいいんだし。
>>903 同意
この話題とは直接関系無いが、IPなんて表示させても何の意味も無いと思うのだが…
>>903 同意。IPは表示させないでログるだけでIDを表示すると良いと思われ。
「ここはIP取ってるんだぞ」って感じの脅しにもならない脅しに使う。 これで嫌がって荒らさないでくれるといいなぁくらいじゃない?
-f "filename" -e "filename" ってどういう違いがあるんですか?
908 :
名無しさん@お腹いっぱい。 :2001/07/21(土) 05:02 ID:dTwqWpWY
以下のスクリプトを実行すると、次のようなエラーが出ます。 Use of uninitialized value at ./perl001.pl line 36, <STDIN> chunk 1. スクリプトは機能するのですが、この表示が気になるので、どこか悪いところが あるのかご指摘ください。 #!/usr/bin/perl -w %list = ( "kamata" => "Ohta", "yoyogi" => "Shibuya", "sugamo" => "Toshima"); print "名前を入力してください: "; $name = <STDIN>; chomp($name); $orig_name = "$name"; $name =~ s/\W.*//; $name =~ tr/[A-Z]/[a-z]/; if ( $name =~ /^mona/i ) { print "OK\n"; } else { print "Input your password: "; $secretword = $list{$name}; if ( $secretword eq "" ) { $secretword = "guest"; } $word = <STDIN>; chomp($word); while ( $word ne "$secretword" ) { print "It's wrong. Input again: "; $word = <STDIN>; chomp($word); } }
>>907 -e ファイルかディレクトリが存在
-f ファイルが存在
「ファイル演算子」で検索かければ他にも(もっと詳しい)説明があるはず
910 :
名無しさん@お腹いっぱい。 :2001/07/21(土) 08:08 ID:04l8oGkY
本当に下らない事訊いて申し訳ないんですが、 @dayname = ('月','火','水','木','金','土','日'); この1行を入れるとエラーになってしまいます。 何がいけないんでしょうか? ネタじゃないです。マジなんです。素で。。 環境はWin + ANHTTPD + ActivePerlです。 ホントすいません。
>>910 (,');のどれかが全角になっているのに100カノッサ
俺は1000カノッサ
セミコロンが全角に全部
914 :
910 :2001/07/21(土) 15:49 ID:P71/r1DM
>>911 -913
んなこたぁない
っていうかそういう記述ミス以外になんか理由ないですかね。
何回も手動で書き直したり、他のファイルで試したりもしたんです。
ダブルクオートにしたりしてもだめでした。
もし何かこの書き方以外でミスしにくい書き方があるならどうか教えてください。
つまらない質問なのは申し訳ないです。
その行を削除した場合エラーは? $dayname = ('日','月','火','水','木','金','土') [$wday]; これは?
916 :
910 :2001/07/21(土) 16:04 ID:P71/r1DM
>>915 回答ありがとうございます。
この行を削除した場合何もエラーは起きず、問題なく作動します。
っていうかスクリプト自体はもうほぼ完成してるんですが、
なぜかこれだけが引っかかって困っております。
ホントいまさらな感じなんですが…
教えていただいたやり方を試してみます。
ありがとうございました。
917 :
910 :2001/07/21(土) 16:05 ID:P71/r1DM
っと思ったんですけど あくまで配列に入れたいんですよね。 このやり方だと配列には入りませんよね? とりあえずやってみます。
>>914 > @dayname = ('月','火','水','木','金','土','日');
の最後のセミコロンが全角になってるから
> んなこたぁない
が全然信用できないんだけど。
ま、それはともかく、とりあえず use strict; と -w かな。
@dayname = qw(mon tue wed thu fri sat sun);
にしてみるとか。
あと、どんなエラーメッセージが出るのか教えてくれないと、見当違いな指摘しか出せないかも。
ぐうううああああああああああぁああああぁあぁ!!!!!!!
・
・
・
・
>>915 様
ありがとうございました。
>>918 ありがとうございます。
自分は生きる価値もない男だと悟ったので逝ってきます。
;
ああ、いまさら。。。。。。
>>919 ま…初心者には極めて良くあることだし。
とりあえず先輩が「怪しい」と言った事は*徹底的に*確認してみようね♥
921 :
910 :2001/07/21(土) 16:21 ID:???
はい。すいませんでした。反省しました。 もう生意気な口利きません。 精進します。
922 :
:2001/07/21(土) 21:15 ID:kAjGF5YA
そぼくな疑問なんですが、無料サーバーに置くスクリプト って、どのくらいのサイズまでOKなんでしょうか? 2000とか3000行のファイルを置いても動作するのでしょうか?
数千行でも軽ければかまわんだろうし、 数行でも負荷が高ければ禁止だろうよ。
>>922 そんなもんここで聞いてどうする。その鯖屋に聞けや
PerlでもWindowsプログラミングは出来ますか?
そろそろ新スレ。
950まではいいんじゃない?
929 :
:2001/07/23(月) 10:23 ID:???
930 :
名無しさん@お腹いっぱい。 :2001/07/23(月) 15:58 ID:ONcVkwDw
単にnantoka.pdfを、<a href="nantoka.pdf">nantoka.pdf</a>としてリンクさせると、 たいてい、ブラウザ自身が(プラグインで)そのまま表示されますが、 fuu.cgi?nantoka.pdfという形式のリンクにして、cgiで何か工夫すれば、 pdfをダウンロードできたとおもいます。 その、「cgiで何か工夫」のやり方を、とんと忘れてしまいました。 教えていただけませんでしょうか?
Content-typeを変える。 拡張子を変える。 ネスケとIEじゃ動作が違うよ。
932 :
931 :2001/07/23(月) 17:03 ID:???
933 :
名無しさん@お腹いっぱい。 :2001/07/23(月) 17:05 ID:e2J6vTUk
すみません、くだらない質問なのですがよろしくお願いします。 Netfirmの相対パスの書き方がわかりません…。 最初からwwwというディレクトリとcgi-binというディレクトリに分かれてますが、 cgi-binからwwwディレクトリの呼び出しがうまくいかないんです。 下図なのですが、 A.cgiから見て0〜9.gifへのパスを、 B.cgiから見てhoge.gifへのパスを、 C.cgiから見てindex.htmlへのパスをそれぞれ教えてください。 |----/www/ | | | +--index.html | | | +--/image/ | | | +--/gif/ | | | | | +--0〜9.gif | +--hoge.gif | |----/cgi-bin/ | +--/hoge/ | | | +--A.cgi | +--A.log | +--/hoge2/ | | | +--B.cgi | +--B.log | +--C.cgi +--C.log
935 :
933 :2001/07/23(月) 18:05 ID:???
>>934 そこをなんとかお願いします…
プログラム板の方には鼻くそものでしょうがどうか。
>933
Perlの話題では無いと思われ。
結局htmlファイルとして見せるのだからcgi-binの仮想パスを
http:// ※/cgi-bin/とすると、相対パスは、
「../image/gif/0.gif」のようになる。
それともbinモードでgifを直接出力しているんなら
話はちがうけどね(w
>>936 はい、すみません。perlに行き着く前の話です。
でもここでしか聞けないのです、すみません。
A.cgiはカウンタなのですが、どうしても画像が表示されないんです。
DDDでNetfirmのカウンタの設置がなんたらとありましたが、
うまくいった方はいるのでしょうか。
何だ? 絶対パスを書けない訳でもあるのか? A.cgi->0-9.gif 相対パス ./../../www/image/gif/0-9.gif 絶対パス /home/foo/www/image/gif/0-9.gif あとは自分で考えろ
939 :
名無しさん@お腹いっぱい。 :2001/07/24(火) 00:07 ID:3WzxCf.o
use strictしますと 「Global symbol "$no" requires explicit package name at hoge.cgi line 5.」 というのがいっぱい出て、 Execution of nikki.cgi aborted due to compilation errors. になります。 execution...はわかるのですが、Global symbol...というのはなんなのでしょうか?
>>939 補足:変数をmy宣言すればエラーはなくなります。
すいません、教えて下さい。 @a=( ['山田太郎','男','19780101'], ['田中花子','女','19901122'], ['鈴木一郎','男','19850613'], ); 配列 @a に名前、性別、生年月日が入っている場合、 若い順に'田中花子'、'鈴木一郎'、'山田太郎'となるように 並べ替えるには、どうすればよいのでしょうか? 配列の配列をどうやってsortすればいいか判りません。
@b = sort{ $a->[2] <=> $b->[2] } @a;
944 :
942 :2001/07/24(火) 23:33 ID:???
945 :
名無しさん@お腹いっぱい。 :2001/07/25(水) 06:01 ID:Sh3McWYI
hoge と foo ってどんな意味なんすかね?
foo {間投} くそっ!、ふん!{名} 狛犬{こまいぬ}、唐獅子{からしし} hoge は ほげ です。
947 :
946 :2001/07/25(水) 06:10 ID:???
ほかに、 bah 【発音】bα':、【レベル】7{間投} ばかばかしい!、ばかな!、フフン!、ヘン!、ベーだ とか blah 【発音】blα':、【レベル】6{形} 退屈な、つまらない、毒にも薬にもならない{名} ばかげたこと、ナンセンス とか fugaとかahoとかunkoとかも使います。
948 :
:2001/07/25(水) 09:08 ID:???
@pair{0} と言う配列の3番目の要素を取り出したいんですが @pair{0}[3] とかするとエラーになってしまうんです。 むずかしいぃ・・・
>>948 すさまじいネタだな。
でも考えすぎ。
もっと単純っぽいのにすればいいのに。
>>948 そいつはちょいと複雑だな
%pair = (0 => [0, 1, 2, 3]);
$value = (@pair{(0)})[0]->[3];
print "$value\n";
尤も俺ならもっと単純な方法を取るがね。
$value = $pair{0}[3];
print "$value\n";
いや、これでもいいんだな。 $value = @pair{(0)}->[3];
952 :
948 :2001/07/25(水) 10:11 ID:???
皆さん即答有難うございます、ネタですかぁ、、、シオシオ(;´Д`) 実は突然慣れない事をまかされてしまって、必死こいてる次第です。 本を買ってきて勉強しますです。。。WEBと漏れの頭じゃ効率悪すぎ やりたいのはたったこれだけの事なのですが リスト1(要素数は不定) "mother","40yo","aidaho" "father","45yo","newyork" "dog","1yo","hawaii" (以下こんな感じで200行程続く) リスト2 "aidaho","40yo","mother" "newyork","45yo","father" "hawaii","1yo","dog" 用は並べ替えたいだけなのです、 はは・・・・ 本屋さんに逝って、本買って何故ネタなのか頑張って考えます、 回答有難う御座いました。
953 :
948 :2001/07/25(水) 10:15 ID:???
それで、フォームから受け取ったデータを改行で割って配列に入れて その要素の一つづつをもう一回配列に入れようと思ったのです。 って何言ってるか解らなくなって来た 頭いたい・・・
>>950 あなたには、新スレ作成の権利と義務が与えられました。速やかに
このスレのPart.6を作成して下さい(藁
955 :
949 :2001/07/25(水) 15:57 ID:???
>>948 ネタじゃなかったのか、スマソ。
んじゃマジレスしておく。参考になればどうぞ。
my @a = qw(mother 40 aidaho);
my @b = qw(father 45 newyork);
my @c = qw(dog 1 hawai);
my %pair = (0 => [\@a, \@b, \@c]);
print @{$pair{0}->[0]}->[0]; # mother
print @{$pair{0}->[0]}->[1]; # 40
print @{$pair{0}->[0]}->[2]; # aidaho
print @{$pair{0}->[1]}->[0]; # father
print @{$pair{0}->[1]}->[1]; # 45
print @{$pair{0}->[1]}->[2]; # newyork
print @{$pair{0}->[2]}->[0]; # dog
print @{$pair{0}->[2]}->[1]; # 1
print @{$pair{0}->[2]}->[2]; # hawai
>>950 よろしく(藁
956 :
名無しさん@お腹いっぱい。 :2001/07/25(水) 16:41 ID:LDIFpqRg
[(種類)(tab)(名前)]というフォーマットのデータを 種類と名前で分けて、それぞれ変数に入れたいのですが うまくいきません。 neko giko ・・・というデータを使ってやってみました。 $data = "neko giko"; $data = s/(\S+) (\S+)/$syurui,$namae/; print "$syurui\n"; print "$namae\n"; exit; 結果は何も表示されません。どなたかおしえてください。
957 :
956 :2001/07/25(水) 16:44 ID:LDIFpqRg
956です。 [(種類)(tab)(名前)]というフォーマットのデータを・・・ ↑の部分わかり難いですが[(種類)(TAB)(名前)]という表示です。
>>956 $data = "neko giko";
($syurui, $namae) = split /\t/, $data;
959 :
956 :2001/07/25(水) 21:55 ID:KeUxvh6I
>>957 さん、ありがとうございました。
\tを\sにしたら、うまく動きました。
自分にお礼か。
新スレ係は誰かな〜
963 :
956 :2001/07/25(水) 23:53 ID:???
しまった・・・。申しわけないっす。
>>958 さん、ありがとうございました。
964 :
名無しさん@お腹いっぱい。 :2001/07/26(木) 00:11 ID:HJVdQqzU
>>946 -947
なるほど。これでスッキリしました。
サンクス
966 :
950 :2001/08/06(月) 02:11 ID:???
む、折角新スレ係に任命されたのにあのあと暫く繋がなかったからな…。 惜しいことをしてしまったかな(藁
アターマいいね
$msg(全角半角が入り混じった文字) をsubstrなどで途中で区切って ...を最後につけるにはどうすればいい? ふつうに $msg2 = substr($msg,0,20); などとすれば 全角を途中できることになる場合があるので むりなので。。。
念のため −−−−−−−−−−−−−−終了−−−−−−−−−−−−−−
>>968 sub cut_string {
$_ = shift;
my($num) = shift;
my($opt) = shift;
m/(^(?:[\x00-\x7f]|[\xa1-\xfe][\xa1-\xfe]|\x8e[\xa1-\xfe]|\x8f[\xa1-\xfe][\xa1-\xfe]){$num})/
? $1 . ($opt ? '...' : '')
: $_;
}
ただし、EUCに限る。
ああ
976 :
. :01/09/17 22:47 ID:???
.
977 :
.. :01/09/17 22:48 ID:???
..
978 :
... :01/09/17 22:50 ID:???
...
....
.....
......
.......
........
.........
なんだ?密かに1000を狙おうってのか?
995 :
:01/09/18 19:38 ID:???
5
996 :
:01/09/18 19:39 ID:???
4
997 :
:01/09/18 19:39 ID:???
3
998 :
:01/09/18 19:39 ID:???
2
999 :
:01/09/18 19:39 ID:???
1
1000 :
:01/09/18 19:40 ID:tsbbU4Ew
1000!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。