1 :
名無しさん@お腹いっぱい。 :
02/02/24 22:18 ID:zOj6Yq/3
>>1 スレたてご苦労様です。
perlでつくられたCGIを改造しようとしています。
2MB(2-3000件)程度のデータを読み込んで、名簿を表示するデータベースCGIです。1件1行のSCVになっています。
鯖への負荷を少なくするために、このCGIのメモリ負荷を調べたいのですが、どのような方法があるでしょうか?
ローカル環境はANHTTPD+win2000+activperlでperl歴2ヶ月ほどの厨です。
>このCGIのメモリ負荷 ?
>>6 ……すみません、「メモリ使用量」です。
SCVじゃなくてCSVだし……。
鬱死
9 :
名無しさん@お腹いっぱい。 :02/02/25 00:27 ID:R6P89Fly
12 :
名無しさん@お腹いっぱい。 :02/02/25 13:12 ID:NWj5gfpZ
あるホームページから、フォームアクションでCGIを起動し、 そん結果を、別の新しい窓に表示するようにするには、 何をどうすれば良いですか。
>12 はあ?
14 :
名無しさん@お腹いっぱい。 :02/02/25 13:23 ID:l+IIkoIf
>12 質問する場所を間違えました。すみません。
age
16 :
出来の悪い子 :02/02/25 17:41 ID:KjItHBP9
前スレの出来の悪い子です ヒントありがとう まだちゃんと動作していないが出来が悪いなりに頑張ってみるわ ありがとうございます。
>16 がんばれ〜
場違いかもしれませんが perlでcgiを作るための解説をおこなっているwebサイトを探しております。 どこが、ここはすごくいい。と思うサイトがあれば教えてください。 自分の環境はwin98です。 あと、初心者ですのでできれば初心者用にかかれた解説のほうがいいです。
俺は、 とほほのperl入門-> どこか忘れたけどモジュールの使い方のページ-> perlmanj と読み進めた。とほほはCGIについての解説もあるしおすすめ
>>19 とほほですか。ありがとうございます。読んで見ます!
>>20 どうもです〜
とてもじゃないが初心者が質問する雰囲気じゃないな
23 :
名無しさん@お腹いっぱい。 :02/02/26 15:57 ID:6ZaEzTsa
24 :
名無しさん@お腹いっぱい。 :02/02/26 16:18 ID:oAR1gQdG
質問です。 CGIからファイルのパーミッションを変更することってできますか? 具体的には644のファイルを666に変更したいんですが…。 やっぱり無理でしょうか。何か抜け道はないものか。
>24 chmod();
26 :
名無しさん@お腹いっぱい。 :02/02/26 16:26 ID:oAR1gQdG
とほほの掲示板意外とレベル高いよね
2chの連中は煽りは達者だがレベ
とほほ:厨房質問に手とり足とり答えてやる 2ch:厨房質問に煽りで返す これじゃ>27や>28が逆上するのも仕方ないな。 まぁおまえらはとほほで質問してなさいってこった。
>24 そもそも君に権限がないファイルはパーミッション変えられない。 また、SuEXECじゃないスクリプトはnobodyなんかで動いているから、 最初から書き込み権限がないファイルは変えられない。 そもそも、これはWebProgな質問ではないような気もするがそれは黙認。 もんだいは、/etc や /var あたりにおいたしようとしてないか? ってことか?
31 :
名無しさん@お腹いっぱい。 :02/02/26 18:22 ID:ntDTlW+c
>>24 パーミッションを変更する予定のファイル、ディレクトリを、CGIが実行
されるときの権限(nobodyとか)にしておけばオッケーだよー。
32 :
26 :02/02/26 20:50 ID:oAR1gQdG
房ですいません。
>>30 オイタしようってんじゃなくて、
Webエディタみたいなものを構築してるんです。
アプされたファイルを書き換えれる奴。
666のファイルは難なく書き換えできるんですが、
デフォルトの644はもちろんダメ。
全部FTPで666に設定するのは何かと不便だし、
CGI側から変更できる方法はないかなぁ、と。
>>31 これはもちろんFTPで事前に変更しておく、ってことですよね?
(nobodyやら何やら、その辺にはほとんど知識ないんで調べてきます…。)
>>31 setGIDとかな。
ディレクトリに実行権限与えるのは・・・無意味か。
>>32 FTPクライアントにケチつけるなら自分で作ればよかろう。
HTTPの次くらいに簡単だ。
>34 まぁ一番簡単なのが、ネット使うのやめちゃう事だね。
36 :
26 :02/02/26 22:01 ID:oAR1gQdG
>>36 意味分からんけど、ビット立てるだけならFTPでもTELNETでも
CGIからでも出来るだろchmod4*** FTPクライアントのカスタムコマンド
とか調べれ
後suidperlは若干挙動が違うんで(セキュリティ絡み -Tスイッチ)調べる様にな
38 :
名無しさん@お腹いっぱい。 :02/02/27 07:25 ID:DxoLEIHk
たぶんとんでもない大ポカか勘違いだと思うんですが、 一晩延々悩み続けてるので、誰かサクッと蒙を開いてくれると嬉しいです。 これ、ディレクトリ階層動いた途端にopenに失敗するんですけど なんででしょう? use File::Find; finddepth(\&wanted, '.'); exit; sub wanted { my $name = $File::Find::name; print $name, "\n"; open(IN, $name) or die; close(IN); # open(IN, "./test/hoge.h") or die; # これは動く # close(IN); } % tree.pl ./tree.pl ./test/hoge.h Died at tree.pl line 10.
39 :
わかりません :02/02/27 11:33 ID:/Q61BdR8
if($i_photo_chk eq 'url'){ @photo_urls=("$i_photo_url1","$i_photo_url2","$i_photo_url3"); foreach(@photo_urls){ if($_ ne ''){ if($_ =~ /^http.*jpg$/){ $i_comment = "$i_comment<br><IMG src=\"$_\">"; }else{ &print_error("写真URLの入力が正しくありません。注意&解説を参照して確かめてください。<br>Macintosh環境でも拡張子(.jpg)をつけて下さい。"); } すみません。 ↑ここらへんで拡張子JPGだけしか選べなくなってるのを、gifも選べるようにしてあげたいんですが、 どうしたらいいですか?つまり、JPGとGIFを認めてあげたいんですが・・・。 エラーばっかりでわけわかめです。 誰か教えて下さい。お願いします。
41 :
わかりません :02/02/27 12:00 ID:/Q61BdR8
逝ってきます!
42 :
名無しさん@お腹いっぱい。 :02/02/27 12:47 ID:Sg/A5twO
お忙しい中すみません。
http://www.e-words.ne.jp/ にあるような、先頭文字での見出し(A B C D ・・・)による
検索ってどのようにするのでしょうか?
もしかしてログファイルに先頭の文字をひとつずつ
手動入力しなくてはならないのでしょうか・・・
>>42 $sata =~ /^$sentou/;
>>38 お、私も一瞬悩みました。
で、カレントディレクトリが変更されてるんじゃないかと思って、
perldoc File::Find してみたら、その通りだそうです。
You are chdir()'d to $File::Find::dir when the function is called.
だってー。
45 :
38 :02/02/27 17:02 ID:???
>>44 ああああ、やっぱり大ポカだった(笑)。
open(IN, $_) or die;
に変えたらサクッと動きました。ありがとー! 一生恩に来ます。
46 :
42 :02/02/27 17:43 ID:Sg/A5twO
43さんありがとうございました。 やはり手動入力が一番速いのかな、、、
47 :
:02/02/27 23:55 ID:KPo4U5H6
すみません。 JAVAスクリプト、JAVAをOFFにしてアクセスした人に、 「JAVAをONにしてください」と表示して、 アクセスさせないためのス8クリプトを、教えてください。 よろしくおねがいします。
>>47 <NOSCRIPT>Java on plz</NOSCRIPT>
49 :
47 :02/02/28 00:04 ID:Xg1/i20o
ありがとう! ええと、 JAVA SCRIPTの場合はどうなるのでしょうか? ありがとうございます。 それと、 「JAVA、(スクリプト)をONにしてください」 と表示させたいのですが、どうしたらよいでしょうか? 掲示板にその機能を追加するには、サブルーチンにすればよいのでしょうか? どうもありがとうございます!
>>49 あんた、CGI組んだこと無いだろ。
もしかしたらHTML書いたこと無いだろ。
51 :
:02/02/28 00:12 ID:Xg1/i20o
49さん、レンタルしか使った事が無いのです。 htmlで、それを表示させるように書いたあと、 そのあと、JAVA OFF で相手を飛ばした時にどうしたらよいのでしょうか・・。
>>51 CGIわかってない奴には説明が出来ない。
意地悪ではなく必然的に。
53 :
名無しさん@お腹いっぱい。 :02/02/28 00:18 ID:Xg1/i20o
わかりました・・。 それでは最後に、コンパイルの遣り方を教えてください・・。 JAVAのソフトをダウンロードして設置する事は、 「JAVAを理解していないけど、CGI、PERLは完全に理解している」 人には可能でしょうか? コンパイルは、コンパイラを使うだけなので、 JAVAを解っていなくても出来るでしょうか? (PERLとかを理解していればです。) よろしくご回答お願いします。 レス感謝であります。
55 :
エフェドリンながヰ :02/02/28 00:21 ID:lx9+LUUJ
56 :
名無しさん@お腹いっぱい。 :02/02/28 00:23 ID:Xg1/i20o
つまり、 JAVAアプレットのソフトを設置するのに、 「コンパイル」という作業があった時に、 JAVAを理解していない人(但しPERLなどは理解している)に、 設置は可能でしょうか?ということです。; 宜しくお願いします。
57 :
手まん :02/02/28 00:25 ID:micBAvGr
レンタルサバとかでさ、 使えるモジュール調べるにはどうしたらいい? 一覧とかだせんかね?
素人の「つまり」ほど要点がまとまっていないものはない
60 :
手まん :02/02/28 00:27 ID:micBAvGr
>>56 いくらなんでも、そのくらい出来るべ、
アップレットだろ、変わったクラス使ってないだろ、
サーブレットになると、色々めんどいけどな、
61 :
名無しさん@お腹いっぱい。 :02/02/28 00:27 ID:Xg1/i20o
すみません。 JAVAアプレットのプログラムをコンパイルして設置する時、 JAVAアプレットを理解していない人に設置は可能なのでしょうか? よろしくおねがいします。
62 :
手まん :02/02/28 00:29 ID:micBAvGr
>>61 だいジョブ、できる、できる、
問題無い、
駄目だったら、漏れがやってやる、
金取るけど、
時給1万だけどな
>>61 =日本語を理解出来ていませんが私は手紙を出せるでしょうか?
64 :
:02/02/28 00:30 ID:Xg1/i20o
ありがとうございます。 ついでに、掲示板のソースから、 JAVAアプレットの仕掛けがあることを解らないように隠すには、 どうしたらよいのでしょうか? 宜しくお願いします。
65 :
名無しさん@お腹いっぱい。 :02/02/28 00:31 ID:Xg1/i20o
>63さん 手紙は、日本語じゃなくても出せますよね・・説明お願いします。 自給1万ですか・・。 全部込みで5000円ならどうでしょう。
ネタは止めて欲しいなあ。つまんないし。
>>64 前来たIPアドレス抜き野郎か。
みんな放置。さんざん荒らしやがって。
なんかレベルの低いのが混ざってると思ったらあいつだったか。
>>49 http://sound.jp/jun88/java/myjjava.html の「強制ジャンプ」がいんじゃない?JavaスクリプトがONの人だけ、
どっかのページにジャンプできる。
Offの人は、そのページに取り残されたまま。
次に、JavaがONの人だけ飛ばしたい場合は、
強制ジャンプするアプレットを貼っとけばいんじゃない?
JavaがOffの人は、そのページに取り残される。
組み合わせるってーと、Javaスクリプトで強制ジャンプするアプレットの
タグを出力すればいんじゃないでしょうか。
70 :
68 :02/02/28 00:36 ID:???
>>67 あうぅ一歩遅かった。マジレスしちゃったよー・・・
ちなみに、前スレどのへんですか?
71 :
名無しさん@お腹いっぱい。 :02/02/28 00:39 ID:Xg1/i20o
ありがとうございました。
>57 @INCを順番に readdirで見ていくとか。 File::Findとかモジュール使えばもっと簡単にできるかも。
73 :
手まん :02/02/28 00:46 ID:micBAvGr
>>57 もよろしく頼むよ。
しっかしここ、すっげぇ〜イキヨイであがってくなぁ〜
まだまだPerlの需要ってあるみたいだなぁ〜
>>73 >イキヨイ
勢い。
>まだまだPerlの需要ってあるみたいだなぁ〜
その通り。
75 :
:02/02/28 01:23 ID:???
perlほど簡単で使い勝手のいい言語なら当分生き残るだろ。 正規表現の入門にもちょうど良いわい。
>>76 RE-C(正規表現C)が出たら迷わず乗り換えるw。
78 :
名無し :02/02/28 18:12 ID:SOksZdMX
掲示板を作りたいんだけど、ログファイルに 書き込むルーチンみたいなのが分からないので誰か教えてください。
80 :
名無し :02/02/28 18:17 ID:SOksZdMX
82 :
名無し :02/02/28 18:28 ID:SOksZdMX
・・・。 掲示板作りたいので 内容をログファイルに書き込む ルーチン教えてください。
ファイルを書き込みモードで開く ファイルにログを書き込む ファイルを閉じる
>>82 BBS Re-Designっていい本が出てる、読む。買って。
85 :
名無し :02/02/28 20:26 ID:SOksZdMX
本読まない奴プログラマとして大成しない。
>>87 ファイルを操作するにはどうしたらいいんですか?
ソースで教えてほしいのですが。
89 :
87 :02/02/28 20:33 ID:???
>>88 open(OUT,">logifle");print OUT $log;close(OUT);
てかんじだよー。
92 :
名無しさん@お腹いっぱい。 :02/03/01 00:20 ID:X6rC0lr1
ファイルをアップロードしたいんですが、 モジュールとかインストールしないで さくっと転送するにはどんな方法がありますか? どれも結構ややこしそうで挫折しかかってます…
>>92 formのほうに
<form enctype="multipart/form-data" method="POST" action="ほげ">
って書いて、CGIのほうは標準入力から読み込むだけだよ。
>92 FTP。 フォーム使ったアップロードならRFC読んで自分でデータ切り分けたりしないと いけないから,素直にモジュール使っちゃえば?
95 :
名無しさん@お腹いっぱい。 :02/03/01 00:55 ID:DUUG9VQm
perl5 でtie を使ってデータベースを構築したいのですが、tie の使い方が さっぱりわかりません。dbmopen だと(これも使ったことないんで よくわかりませんが) #%hash は定義済みとして dbmopen(%hash, "data_base", 0644); while (($key, $value) = each %hash) { $hash{"$key"} = $value; } close(%hash); こんな感じで外部ファイル化したいんですが、tie の場合、どういうふうに 書けばいいんでしょうか?
96 :
名無しさん@お腹いっぱい。 :02/03/01 03:45 ID:uLWuBwxz
use Fcntl ; use AnyDBM_File ; $db_flag = O_RDONLY ; tie ( %hash , 'AnyDBM_Files' , 'database' , $flags , 0644 ) ; while ( ( $key , $value ) = each ( %hash ) ) { push @array , "$key\t$value" ; } untie ( %hash ); こんな感じ。tieもdbmopenもほとんど変わらない。 使い方はgoogleででも検索したらいっぱい出てくると思う。 もし、tieでもうまく行かないのならそのコードが変。 特に$hash{"$key"} = $value; の部分が怪しい。 仮に書いただけにしても、意味のあるコード書くのが普通と思われ。
97 :
95 :02/03/01 09:30 ID:dR5S0Mwb
>>96 おかげ様でうまくいきました。実は質問する前に丸一日googleで色々
調べて見よう見まねでやってたんですが、use Fcntl;が抜けてたせいで
うまくいかなかったようです。
ありがとうございました。
・Perl依存症 世の中何でもPerlでやればいいと思ってしまう罠。 例えばエディタの置換機能を忘れていて s/<td><\/td>/<td>a<\/d>/g; してしまう罠。
99 :
92 :02/03/01 23:43 ID:X6rC0lr1
>>94 素直に使っちゃいたい、んですが、
モジュールのインストールが不可能なので無理です…。
現在、どっかのアップロード式BBSから切り出す方向で検討しています。
jcode.plみたいな引数渡したら勝手にやってくれる
ライブラリがあればいいんだけど、ないよなぁ…。
CGI.pmは標準モジュールだろ?インストールしなくていいよ。
101 :
92 :02/03/01 23:52 ID:???
>>100 CGI.pmでできたんだ…。
ありがとうございました。googleに逝ってきます…。
103 :
名無しさん@お腹いっぱい。 :02/03/02 00:21 ID:7JCmBc0W
文字列検索の構文で、オプションを2つ付けたいのですが たとえば ・文字列を複数行として扱う ・大文字、小文字を区別しないで検索 の場合 変数 =~ /文字列/i/m; でOKでしょうか?
105 :
名無しさん@お腹いっぱい。 :02/03/02 00:29 ID:7JCmBc0W
>104 さんく
106 :
nobodyさん :02/03/02 02:34 ID:Lu4QyfYX
perlでftpアクセスの自動化ってできる?サンプル探したり したけど、見つけられんかった。
108 :
nobodyさん :02/03/02 06:20 ID:LaOqrqUm
パスワードの設定の際メタ文字を使えなくしようとしています。 ただし『+』『-』『=』『!』『?』は使えるようにしたいです。 if ($password =~ /\W/) {}などとすると全部のメタ文字にマッチしてしまうの で、どうにかしたいのですが、良い方法が思い付きません。[^\+\=\-\!\?]辺り で試してるんですが、どうもうまく行かなくって・・・。
>>108 正規表現スレでも逝って勉強した方が良いよ。
でも、まぁ。
die if /[^-+=!?\w]/;
&test("aaa"); sub test { print $x; } ここで"aaa"を$xに入れるには $x = $_[0]; としないと駄目でしょうか? sub test($x : $_[0]){}のように変数名を指定したいのです
残念ながら、無理です。 > $x = $_[0] そのようにして下さい。お好みで $x = shift; 引数を保証したいならプロトタイプ。
112 :
110 :02/03/02 08:29 ID:???
有難うございます。 $x = $_[0]; でいくことにします。
再帰するサブでプロトタイプは使用できる?
>>110 ハッシュを使う
$hiki{'x'} = 'aaa';
&test(\%hiki);
sub test{
%hiki = %$_[0];
print $hiki{'x'};
}
116 :
名無し :02/03/02 14:46 ID:FrK2+WoO
>>115 同意。
114のやり方だと容量増えるだけだと思われ。
ハッシュ使うなら、漏れはこっちのが好みだ。 sub x { %arg = @_; print "$arg{a}\n"; print "$arg{b}\n"; } x(a => 10, b => 100);
>>118 はぁ?
まさかsubは呼び出しより前方に書かなきゃいけないとでも思ってる?
>>119 いや、厨房質問くさいんだけど、
再帰って
sub x
{
my($hh) = @_;
if($hh != 0)
{
return &x($hh - 1) * 2;
}
else
{
return 1;
}
じゃないの?}
121 :
川o・-・) :02/03/02 17:44 ID:BzlXRQCM
想像力を働かしてまとめると、、、
>>110 は「複数ある、それぞれが省略可能な引数を渡したいので、呼び出し元で名
前をつけたいんだが、どうすればいいわけ?」と聞きたいのだと思う。で、回
答は
>>114 と
>>117 で。
>>113 できます
>>114 どうせコピーするならリファレンスじゃなくていいんじゃない。
で、サブルーチン内で引数を書き換えないのなら、
コピーせずに$hiki->{x}でいいね。
>>115 110の問題を解決しているわけだが、、、
>>116 猫の額程度の容量を気にしてどうする、、、
>>117 保守的なコピーが必要ならこれで
>>118 「再帰」を勉強しましょう
>>119 プロトタイプ宣言の恩恵を受けるには呼び出しより前に書かなきゃね
>>120 正解
122 :
119 :02/03/02 18:59 ID:???
>>121 この文脈で前方つーたら前方参照の意味なんだが誤解してないかい?
123 :
92 :02/03/02 19:41 ID:???
>>102 イヤじゃないです。迷ってます。
CGI.pmはでかくて評判悪いので、
CGI_Lite.pmかcgi-lib.plを使おうと思ってるんですが、
どっちを使おうかなぁと…。
実際問題、この二つってどう違うんですか?
もちろん全然違うプログラムってのはわかってるんですが、
用途が似てるから…。
124 :
92 :02/03/02 19:43 ID:???
なるほど、再帰してるsubの中の呼び出しは&でプロトタイプチェック回避させるのか。
126 :
108 :02/03/02 20:14 ID:???
>>109 おお!できたできた!
ありがとうございます。
はい。正規表現スレッドに逝ってきます。
ファイルのヘッダーを見て拡張子を返すようにするにはどうすればいいのでしょうか? ファイルのどこにヘッダーがあるのかわからん。。
>>127 ファイルの先頭以外にヘッダがあることはあえない。
もし、先頭に無ければそれはヘッダとは呼ばない。
129 :
nobodyさん :02/03/02 21:06 ID:MILA+IA2
簡単な暗号化ルーチンってないすか? 単に生URL見せたく無いだけなんで、 簡単なロジックで、encode,decode出来ればいんすけど、 どでしょ?
131 :
115 :02/03/02 21:18 ID:???
>>120 他の言語みたく
void Hoge (int n) {}
って渡し方が出来るかってことじゃねーの?
だからハッシュでってのは見当違いかなと。
まぁいいけどさ。
132 :
115 :02/03/02 21:18 ID:???
133 :
120 :02/03/02 21:22 ID:???
>>129 1バイトずつ0xFFと排他的論理和をとる(bit反転)。
・・・ここでいいのかな? あぷろだでアップ時の残り時間を 表示させるのにはどうすればよいのでしょうか? スレ違いだったならごめんなさい
>>135 それはCGI側じゃなくてアップする方がやることでしょ。
>>135 適当なところに以下の文を追加
print scalar localtime;
これで分からなきゃCGI改造スレ行け。
その際はそのアップローダのソースをどこかに上げろよ。
138 :
137 :02/03/02 22:19 ID:???
って何か勘違いしてたらしい。 残り時間はサーバー側じゃ無理だわな。
なじぇ? アップ開始から完了までCGIプロセスは生き続けるし、サイズはわかってる から無理じゃないっしょ?
>>139 で、画面の更新はどうするの?meta refresh?
マルチフレームでリフレッシュとか、シングルフレームでもコネクションがタイムアウトしないようにだらだらと送ってやれば 表示できるじょ。
あっ もれも勘違いしてたかも。でもHTTP/1.1なクライアントならコマンドパイピング が効いて送り終わって無くても応答取ってるかも。 実験してみよう。
CSVファイルでカンマで区切った部分の左端から何個目だけを 表示させたいという場合はどのように記述すればいいのか教えてください。 例 a1,a2,a3,a4,a5,a6,a7,a8,a9, b1,b2,b3,b4,b5,b6,b7,b8,b9, とデータがある時に左から5列目、つまりa5とb5を取り出す。 よろしくお願いします。
>>143 splitを使え。
どうやって使うんですか、とか言わないでよ
145 :
129 :02/03/03 05:00 ID:IQ08Jes1
すまそ。 URLでパラメータで渡したいから、URLで使える文字だけにしたいんよね、 エスケープシーケンスだと長くなっちまうから、ちょっとねぇ〜
146 :
nobodyさん :02/03/03 05:20 ID:vLChsjTs
while (<FILE>) { push @array , (split /,/)[4] ; } print @array ; こんな感じかな?
ランダムな文字列を指定した数だけたくさん作るにはどうすれば出来ますか?
148 :
nobodyさん :02/03/03 07:54 ID:qCUfXnEh
ん? 指定した長さのランダムな文字列って事? 使用する文字列の範囲を教えて。
149 :
nobodyさん :02/03/03 08:09 ID:+mcyIDOm
すいませんが教えてください $str =~ s/$str1/$str2/; なのですが $str1,$str2 にも "/" "." などが入っているのが問題なのだと思うのですが うまくいきません(というか無限にループしているみたいになっています) $str =~ s/\Q$str1/\Q$str2/; というのを見つけたのですが、$strが"\"マークだらけになってしまいます どうしたらうまく置換できるのでしょうか?
>>129 IBM->HALや XYZ->ZABみたいに何文字かずらすとか。
>149
置き換え文字には\Qいらんと思われ。
151 :
143 :02/03/03 13:39 ID:K6uur/rZ
152 :
nobodyさん :02/03/03 14:11 ID:IQ08Jes1
perl -v とすると、
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "ja_JP.ujis",
LC_ALL = "ja_JP.ujis",
LC_MESSAGES = "ja_JP.ujis",
LC_CTYPE = "ja_JP.ujis",
LANG = "ja_JP.ujis"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
This is perl, v5.6.1 built for i586-linux
Copyright 1987-2001, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'. If you have access to the
Internet, point your browser at
http://www.perl.com/, the Perl Home Page.
って感じで、localeでしかられちゃうんだけど、どしたらええのかね、
ちなみに、環境変数は
export LANGUAGE=ja_JP.ujis
export LANG=ja_JP.ujis
export LC_CTYPE=ja_JP.ujis
export LC_ALL=ja_JP.ujis
export LC_MESSAGES=ja_JP.ujis
こんな感じにしてます
>>129 そういう単純な事をやっていると、そのうちひろみちゅに晒されるに500モナー
155 :
152 :02/03/03 14:21 ID:IQ08Jes1
すまそ、まし〜んは、 Linux(slackware)
156 :
暗号化だが :02/03/03 14:29 ID:IQ08Jes1
暗号化ってより、 漏れは、URLで使える文字に変えるってのが知りたい 極力、1バイト、一文字に抑えて、足りない分は、 !Aとかで、2文字にしていく、ハフマンのエンコード部なんか 参考になりそうだなぁ〜とか、思ったりしてた。 暗号化ってより、圧縮、変換の話か・・・
カナスゥィー
>>156 圧縮だって立派な暗号化だと思うが。持論だが。
>>158 長さが長くなるのくらいあきらめろ、って気がしてきた。
URLに使われる文字がABCDEFGHだけだとして、
tr/ABCDEFGH/DGFHCEAB/;
ってのはどうだ?
161 :
156 :02/03/03 15:59 ID:IQ08Jes1
結構需要あるような気がするんだけど、 必要に感じた事無い?
>>156 URI::Escape
なんか勘違いしてるか?
163 :
143=151 :02/03/03 16:42 ID:K6uur/rZ
たびたびすみません。 csvから情報を選び出すことは出来たのですが、 次はそのデータを比較して、条件に合ったときだけ取り込みたくて 以下のようにしたのですがうまくいきません。 アドバイスお願いします。 open(DATAFILE,"data.csv"); while (<DATAFILE>) { push @TMPDATA ,(split /,/)[0,5] ; if (@TMPDATA[0] < @TMPDATA[1]) { push @TIME ,(split /,/)[1]; } } それとスペースも入ってない空欄 1,2,,4,←こんな状態 の部分はどのように判別すればいいのですか? よろしくお願いします。
>>163 プッシュは配列の最後に要素を加えます。
165 :
163 :02/03/03 17:27 ID:K6uur/rZ
ありがとうございます。 参考にして push my @TMPDATA ,(split /,/)[0,5] ; としてみると、思い通りに動きました。 空欄の処理の仕方も何方かアドバイスお願いします。
166 :
nobodyさん :02/03/03 19:22 ID:zlwT/08t
デバッグモード(perl -cw)で「Syntax OK」なのにApacheで CGIを動かそうとしたらエラーになってしまいます。 原因は何が考えられますか? Win2K(SP2)+Apache1.3.24+Perl5.6.620です。
>>166 Perlへのパスが間違っている。
必要なヘッダを出力していない。
etc
>>168 入っていなかったらどうやってデバッグモードでSyntax OKという答えを得るのよ・・・
つか -cw は文法チェックするだけ。普通はデバッグモードとは言わん。 例えば、以下のコードはSynax OKだが実行した瞬間死ぬ。 #!/usr/bin/perl foo() __END__
173 :
nobodyさん :02/03/03 21:14 ID:/fm96Lfb
ActivePerlをインストールしたら、ダウンロードしてあったCGIスクリプト のplファイルが黄色いボールのアイコンになってしまいました。 この関連付けを解除する方法は無いですか?このままでも問題無し? あと、いずれはCGIスクリプト書けるようになりたいですが、まず最初の 段階ではActivePerlをインスコして参考書読みながらコマンド打っていくの がいいんでしょうか?サーバソフトとかまだ入れてないんですが・・
>>173 >インスコして
一生無理だ。あきらめろ。
175 :
166 :02/03/03 21:16 ID:zlwT/08t
>170 Apacheのログを見たら分かりました。 print "Content-type: text/html\n\n"を忘れてBad headerでした。 超初心者的ミス、鬱だ。
176 :
173 :02/03/03 21:24 ID:/fm96Lfb
>>174 そんな事言わずにお願いします。
>インストールして
訂正します。すみませんでした。
ちなみに参考書は「すぐわかるPerl 深沢千尋/著」を買ってきました。
>>176 その本は素晴らしいよ。
基本的にはコマンドプロンプトでPerl a.cgiとするのが王道。
俺は秀丸マクロで開発環境作ったけど。
179 :
163 :02/03/03 23:17 ID:K6uur/rZ
>>171 CSVデータの中に空欄があったら処理を実行せずにデータがあればそれから処理を実行したいんです。
180 :
163=179 :02/03/03 23:22 ID:K6uur/rZ
具体的には open(DATAFILE,"data.csv"); while (<DATAFILE>) { push my @TMPDATA ,(split /,/)[0,5] ; if (@TMPDATA[0] < @TMPDATA[1]) { push @TIME ,(split /,/)[1]; } } のifのところで@TMPDATA[0] 、@TMPDATA[1]のどちらかが空欄なら以下の処理をせずに終わりたいんです。
181 :
171 :02/03/03 23:32 ID:???
>>180 なるへそ。そしたら、if の条件に「どちらも空じゃなければ」を追加すれば
いんじゃないかな。
つーか誰か配列スライス使ってることとかつっこんでやれよ…
グローバル変数なのにmyを使っている人は何を考えているのでしょうか。 strict下ならvarsモジュールを使えばいいのに。 localとは違うからいいの?
184 :
95 :02/03/04 00:12 ID:KNDHr4No
またtie について質問させてください。 sub sub_routin { my (%data) = @_; use strict; use Fcntl; use SDBM_File; my %hash = (); my $data_base = 'data_base'; tie (%hash, 'SDBM_File', $data_base, O_CREAT|O_RDWR, 0666); #この命令自体はあまり意味は無いが、要はハッシュのハッシュを使いたい foreach my $number (1..100) { while ( my ($key, $value) = each (%data) ) { $hash{$number}->{$key} = $value; } } untie (%hash); } 上のように、tieからuntieの中でハッシュのハッシュを使おうとすると Can't use string ("HASH(0x1c37ddc)") as a HASH ref while "strict refs"(以下略) などと怒られてしまい、使えません。多次元構造のデータの外部化って無理なんですか?
185 :
183 :02/03/04 00:12 ID:???
無理です。 $hash{$number, $key} = $value にすれば?
>>183 漏れの場合はvarsを知らなかったので、myを
使ってる。「strict使ったら怒られたから、
myを付けたらOKだった」という感じだった。
varsを使った方がいいのかな。
>>187 グローバル変数なら素直にvars使った方が良いだろ。A
189 :
149 :02/03/04 02:25 ID:zvOvcxtF
>>150 遅くなりましたがレスありがとうございました
自分なりにいろいろやってみたのですが、全く別の問題だと分かりました
$string = 'Watashi ga Kaita. Watashi ga Keshita';
while ($string =~ /Watashi/igo) {
$value = 'Watashi(=Yamada)';
$string =~ s/Watashi/$value/i;
}
print "$string";
なのですが、無限にループ(?)しているような状態になります
表示したい文字列は
Watash(=Yamada)i ga Kaita. Watashi(=Yamada) ga Keshita
にしたいのです
この例の場合には置換で1行で出来るのですが、whileループの中で
いろいろと処理をさせたいのでこの様にしています
$value = 'Ore(=Yamada)';
$value = 'Yamada';
のようにすると無限ループのような状態にならずに
Ore(=Yamada) ga Kaita. Ore(=Yamada) ga Keshita
Yamada ga Kaita. Yamada ga Keshita
と変換されて表示されるのでパターンマッチに使った文字列から
始めない場合はうまくいくようなのですがその理由も良くわかりません
なんかそもそもアプローチ自体がおかしいような気がしてきてはいるのですが
ご教授いただけるとうれしいです
すいません >表示したい文字列は >Watash(=Yamada)i ga Kaita. Watashi(=Yamada) ga Keshita Watashi(=Yamada) ga Kaita. Watashi(=Yamada) ga Keshita です 申し訳ありません
すいません、ニュースっぽい系のcgi作ろうとしてるんですが 鯖に存在するファイルの読み書きは知ってるんですが ファイル自体を出力する処理方法ってありますか? (更新ごとに新しいファイルを出力するみたいな) よろしくお願いします。
>>191 ファイル名変えればいいんじゃ?
ユーザーにファイル名を入力させるのはやめといたほうがいい。
>>191 open(FILE,">new.dat");
>>191 ファイルを作成するディレクトリのパーミッションを666に。
195 :
194 :02/03/04 10:11 ID:???
>>189 Watashi ga Kita Watashi ga Kita
↓
Watashi(=Yamada) ga Kita Watashi(=Yamada) ga Kita
↓
Watashi(=Yamada)(=Yamada) ga Kita Watashi(=Yamada)(=Yamada) ga Kita
↓
Watashi(=Yamada)(=Yamada)(=Yamada) ga Kita Watashi(=Yamada)(=Yamada)(=Yamada) ga Kita
$string =~ /Watashi$s/igo
>>184 MLDBMを使えばそれ*らしき*操作は出来る。
ただし万能じゃないんで詳しい事はドキュメント読んでくれ。
>>196 訂正。
$string =~ /Watashi\s/igo
PerlでCプリプロセサの#defineと同等の機能はありますか?
perlrun の `Switches' より -P causes your script to be run through the C preprocessor before compilation by Perl. (Because both comments and cpp directives begin with the # character, you should avoid starting comments with any words recognized by the C preprocessor such as "if", "else", or "define".)
>>200 あの、、、#defineじゃなくて#defineと同等の機能があるかどうか聞いているんですけど・・・・
ないんですね。素直に変数を使います。
constant pragma は#defineに似ている
use constant NDEBUG => 1;
use constant STRING => "hello, world!\n";
if(defined &NDEBUG){
print STRING;
else{
# ..
}
それはそうと
>>201 は何故こんなに偉そうなんだ?
>>189 whileループの突入条件とそのループ内で同じ文字列のマッチングを行っているのが原因。
これでは文字列のどこまでマッチ作業を試行したのかわからなくなってしまうよ。
具体的にはwhileループ内のマッチ作業によってpos($string)がundefで上書きされてしまう。
$string = 'Watashi ga Kaita. Watashi ga Keshita';
while ($string =~ /Watashi/ig) { # ←◆g修飾詞によってpos($string)が設定される。
$value = 'Watashi(=Yamada)';
$string =~ s/Watashi/$value/io; # ←◆pos($string)がundefで上書きされる。(゚д゚)マズー
}
print "$string";
要するに$stringのマッチ開始位置が巻き戻ってしまう。
このため突入条件のマッチングはg修飾詞があっても常に$stringの先頭から行われてしまい、
$string内にWatashiという文字列がある限りwhileがループを続けてしまう。
>189がやりたい(であろうと漏れが考えた)事をむりやり書き下してみると、
# pos再設定とマッチ以後の文字列置換でむりやり解決
$string = 'Watashi ga Kaita. Watashi ga Keshita';
while ($string =~ /Watashi/ig) {
$value = 'Watashi(=Yamada)';
my $position = pos $string;
if (substr($string, $-[0]) =~ s/Watashi/$value/io) {
$position += length $value;
}
pos $string = $position;
}
print "$string\n";
こんな感じになるんだろうか。でもこんなスクリプトは見た事が無い。
アプローチというか何というか、たぶん他にもっと良い書き方があるのだと思う。
単純に解決したいならループ内で $string =~ s/Watashi(?!\(=Yamada\))/$value/io とか、
処理を挟むなら $string =~ s/Watashi/&process(...)/eg とか。
取り敢えず、普通whileの突入条件とそのループ内で同じ文字列のマッチングは行わない。
perlretutやperlop,perlfaq6などを読むと良いかもね。
つうか正直何をやりたいのか良くわからないから的外れかもしれない。そんときゃスマソ。
あ、むりやり解決のスクリプト間違っているわ。 $position += length($value) - length('Watashi'); だね。どーでもいいか。
&subname(); で飛ばす場合と、 &subname; で飛ばす場合は、どちらの方がメモリ消費が少ないのでしょうか? 自分は()を付けると、サブルーチン先の@_と、呼び出しもとの@_は別物と認識するので、 @_に代入するとその分メモリを消費するが、何も代入しない場合はどっちでも変わらないのでは? と考えるのですが
208 :
208 :02/03/05 22:03 ID:OFFg29v+
パスワード認証のプログラムが作りたくて、下記のようなものを作ったのですが、 いつも「エラー2」が出てしまいます。何でうまくいかないのかさっぱり分かりません。 どなたかお知恵を貸してください。 acountlist.dat はこんな感じになってます。 id01:pwd01:point01 id02:pwd02:point02 ... ------------------------------------------------------------ print "IDを入力してください\n"; $id = <STDIN>; chop($id); print "パスワードを入力してください\n"; $pwd = <STDIN>; chop($pwd); open(DATA,"<../xxxxxxx/acountlist.dat") or die; while($line = <DATA>){ chop($line); @acount = split(/:/,$line); if($id eq $acount[0]){ if ($pwd eq $acount[1]){ print "いらっしゃいませ $acount[0] さん\n"; print "現在あなたは $acount[2] ポイントお持ちです\n"; exit; }else{ print "エラー1"; exit; } }else{ print "エラー2\n"; exit; } } close(DATA); ------------------------------------------------------------
>>208 acountlist.dat (accountlist.datのスペルミスだとは思うけど)
の最初の行に書いてある人はOKだね。
>208 それじゃid01の人しか受け付けないよ.
211 :
208 :02/03/05 23:22 ID:???
209さん、210さんご教授ありがとうございました。 おかげさまでうまくいきました。
スタイルシートを挿入している部分にnext 2 tokensってエラーがでます。 どうせましょう
ランダムな数のうち、10の倍数だけを取り出す方法ってありますか? データベースから引っ張ってきた件数をGoogleみたいに 1 2 3 4 5 ・・ と自動的にリンクを貼りたいんですが。
>213 10〜100までの10の倍数の乱数を出したい場合。 1〜10の乱数を出して10倍する。
む? ひょっとして、乱数は関係ない? foreach(1 .. 100){ if($_%10==0){print qq(10の倍数);} } って事?
んー駄目だ 10の倍数とか関係なかった(ごめん) どうやったらデータベースから引っ張ってきたデータ件数を Googleみたいに 1 2 3 4 5 ・・ ってリンクできるんだろ perlじゃないのかな・・・
>217 $i=0; foreach(1 .. $n){ if($_%100==0){print qq(<a href=./hoge.cgi?start=$_>) . ++$i . qq(</a>);} } googleはこんな感じだろ。
いや、検索件数を数え終わってからという手もあるか。 $j = HIT数; for($j=0;$j<=$n/100;$j++){ print qq(<a href=./hoge.cgi?start=) . ($j*100) . qq(>$j</a>); } ちなみに>218でもこの方法でも0 1 2 3 となるから、実際には1を足すように。
悪い。 >219の最後の一行は忘れて。 頭寝てるかもしれないからもう沈むわ。 混乱させてスマン。
(まさか)for文とは・・・(気が付かなかった・・・鬱) の略ですm(_ _)m
226 :
nobodyさん :02/03/06 21:21 ID:qVNAtP8C
携帯用の参照制限はCGIで可能なのでしょうか? 教えて下さい。
半角カナの使用って何が問題なの? 正規表現に通したりすると落ちたりするんですか? あと2バイト文字でファイル名を作らせるのはまずいですか? URIエスケープすればどうだろう?
>>226 User-Agent 見て弾けばよかろう。
>228 ありがとう。 メールやネットニュースが対応してないので使わないクセを付けようということなのかな。 そういや,おれの通ってる大学のイタイ教師がメールのフッタに 「半角カナが世にはびころうとする風潮に断固反対する会 会員No.xx」とか書いてたのを思い出した。 どーでもイイが・・・
231 :
かなり初心者 :02/03/06 22:08 ID:+Uo+pWis
$messageの文字列の中のどこかに、『
>>3 』のような文字が入っていて、
それを<a href="3">
>>3 </a>のように置換するやり方ってどうやるので、
しょうか?(ちなみに、数字は可変します。)
お願いします。(コードでご説明下さい。)
>231 $message =~ s/>>([0-9]*)/<A HREF="$1">$1</A>/g;
>>231 s#>>(\d+)#<a href="$1">>>$1</a>#go;
goのoって何?「変数展開を一回行う」ってどういう意味?
238 :
かなり初心者 :02/03/06 22:27 ID:+Uo+pWis
レスありがとうございます。 数字なのですが、2桁の場合も考えられます。 その場合でも、ご提示頂いた物でOKなのでしょうか? お願いします。
>238 ローカルで試してみろよ。 できるから。
240 :
235 :02/03/06 22:33 ID:???
>>237 oを付けると、正規表現中に変数があっても、その正規表現の
コンパイルを最初の一度しか行いません。そのため、
2度目以降のマッチングの際にコンパイルしないぶん早くなります。
なので、通常正規表現中に変数を入れない場合はoをつけとく
方が有利です。
で、正規表現中に変数があって、それが変更される
にもかかわらずoを付けると、当然予期する結果が得られません。
241 :
かなり初心者 :02/03/06 22:34 ID:+Uo+pWis
ありがとうございました。 助かりました。(^_^;)
>>242 でも、漢字コードの判定に失敗しないので便利だよ。
>240 なるほど!ええこと聞いた!情報ありがとう。 >239 ほんまかいな・・・ foreach(1..100000){}で囲むのか?(笑
>243 meta で指定すれば問題ないやろ?
246 :
243 :02/03/06 22:43 ID:???
>247 ごめん,今気付いたんだが>237へのレスだと思ってた・・・ 変なこと言ってすまん・・・
249 :
247 :02/03/06 22:57 ID:???
251 :
nobodyさん :02/03/07 06:18 ID:WTUe3Qf1
こっちもage
252 :
nobodyさん :02/03/07 08:50 ID:hIR8dzV6
226です。User-Agentってなんですか???
>>253 ありがとうございます。
アクセス制限はこれで出来ますが、携帯でも参照制限(特定のページ)は
可能なんでしょうか?
>>255 ,256
意味わかりませんか?User-Agentってようは相手のブラウザを認識するのですよね?
私が聞きたいのはページ(htm,html,texなど)で作成したものに直リンクできない
ようにするための参照制限のことです。
今のところCGI関連のホームページで色々探してみましたが、不可能という答えしか
掲載されていませんでした・・・。
もし知っている方がいらっしゃいましたら教えて下さい。
>>258 だから、CGIでページを生成することにして、そのページへ
携帯電話からアクセスしてきたら弾けばいいじゃん。
htmlファイルへのアクセス制限は、CGIとは別問題で、
.htaccessでDoCoMoからのアクセスを拒否するだけだよ。
>>260 ありがとうございました。
>>259 もしかしたらいい案している人いるかもしれないから
聞いたんじゃん?
代用できる方法知ってるかもしれないし。
私CはわかるけどPerlはさっぱりわからんのじゃ!
初心者なんだから・・・
最も嫌われる初心者とは、 初心者である事を免罪符のように使う人物である。
>>261 初心者を盾にするな。
Cが使えるのならその技術で可能か不可能か位は判別出来るだろう。
しょせんiモードのページ作るヤツなんてドキュンばっかだな。(藁
>>264 i-modeのページも、あれでいて結構気を使うんだよ。
半角カナにしろだの、ここは絵文字にしろだの、クライアントが
うるさいんだよね・・・
>>261 は20代DQN女性な感じ。
いや、なんとなくだけど。
しかも当たったからと言って何もならないが。
268 :
:02/03/07 14:47 ID:q6SBx/iV
gdbmの詳しい説明があるホームページないですか? サンプルとか載ってるととっても助かります 教えて下さい。
初心者がCなんかわかるな。
全角英数使ってるところがプログラマっぽくないな。
なんであっても初心者はまず2chから学ぶべきではない。 よそで基礎知識を付けてからのほうがデマ吹き込まれなくていい。 あらゆる書籍、webサイトで調べてそれでもわからなかったときの 最後の手段が2ch
Cをやってて文字コード知らんのか・・・
277 :
271 :02/03/07 17:05 ID:???
アルファベットも半角ダメなら外人はどうやって書き込みすんだよ。
>272 そのとおりである! ・・・おれはよく甘えるがなー・・・ いやおれも分かる範囲ならできるだけ答えるよ。 でも>261は最初の質問の時点でスレ違いだったからなぁ・・・
>274 試しに自分のページを「エンコード:西ヨーロッパ言語」で見てみ。 それが毛唐ドモのPCに映る画面。
userAgentを知らないCマスター・・・(ワラ
Cが分かるってセクースの事ですね?
>>281 _ _
〃┏━━ 、
>− )
パタパタ | ノノソハ))) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(((\リリ ´ー` リ < 変なこと言うけどPerl/CGIの入門書。
((ニE/⌒ヾ∞"ヽ 上にも書いたけどCGIはある条件さえ満たせば言語は問われないんだ。
(こ) ∞ |こ) 無理してCでの入門書を探すより腐るほど出てる詳しいPerlでの本の方が参考になるよ。
く__∞,ノ 上にも書いたけどPerlはCとかなり似ているから結構読めるよ。
し' し'
暇だから簡単にまとめておくね。
POSTの場合、データは標準入力に入る。
GETの場合、データは環境変数QUERY_STRINGに入る。
リモートホストなどのステータスは環境変数に入る。
出力は標準出力に対して行う。
出力の前にprintf("CONTENT-TYPE: text/html\r\nr\r\n");を忘れないでね。
うぐぅ。あんまり祐一の役にたてなかった気がするよぉ。
<HTML> <HEAD> <SCRIPT LANGUAGE="JavaScript"> function WindowOpen(){ window.open("ここにページの名前.htm") } </SCRIPT> </HEAD> <BODY onunload="WindowOpen()"> </BODY> </HTML>
>>258 直リン避けたかったら、CGIでセッション管理しれ。
286 :
nobodyさん :02/03/08 04:19 ID:rUODFweb
質問です。 お絵描き掲示板を設置しようかと考えているのですが、 割り当てられた容量が5MBとやや少なめ(と、言われた)なのです。 お絵描き掲示板は負担がかかると聞いたのですが 出来るだけ負担を軽くするようにするにた例えばどのような工夫が必要でしょうか。 要領を得ない質問で申し訳無いですが、ご指南下さい。
>>286 小さなスペースみたいだから、画像サイズが(小さく)選べてjpegに対応してて、
画像圧縮率も変えられるようなのが良いんでない?
荒らし対策も考えると、しぃちゃんのPaintBBSアプレット使った奴がいいかも。
というか、ここは自分でコードを書く人の為のスレッドだよ…。
ダメだ。始業から70分たつけどまだ頭がぼんやりして動かない。 一行も書けないよ〜〜〜
289 :
nobodyさん :02/03/08 11:00 ID:wwEgc1iJ
Webサイト制作初心者用スレッド』から、ここへ行っては?とアドバイスを 頂いてやって来ました。 Apache 1.3.12 文字化け問題で、サーバの管理者にiso-8859-1を削って貰いました。 でも、依然としてMac+ネスケ4.xの環境で、cgiからの飛び先がhtmlだったり、 htmlとcgiの混合フレームの場合に化けます。 化けるのはいずれもhtml部分で、cgiは問題ありません。 そこで.htaccessに AddTypeを入れたところ、Mac+ネスケ環境では改善したのですが、 必ずWIN+ネスケ6.xにおいて激しく文字化け、リロードしても改善されない、という現象に陥ってしまいます。 cgi、html、いずれもshift_jisで書いて、保存してあります。 metaにはshift_jis指定をしています。 また化けhtmlに影響している、cgiに Content-Type: text/html; charset=Shift_JIS とcharestを追記すると、今度はサバエラになってしまいます。 勿論「;」や「"」には気をつけています<削除しないように スキルがないなりに、\や\nをつけたり色々やってはみました。 はー。何ででしょう? というか、一番不可解なのは、.htaccessに AddTypeを入れると、 どうしてネスケ6.x+WINで必ず文字化けしちゃうのか、分からないのです。 基礎知識がないので、この状態でいっぱいいっぱいです。 どなたかアドバイスをお願いいたします。
EUCにするとかしないとかは試したの?
292 :
289 :02/03/08 11:26 ID:wwEgc1iJ
コードというのは… print "Content-type: text/html\n\n"; print "<html><head><title>$main_title</title>\n"; print "<META content=\"text/html; charset=Shift_JIS\" http-equiv=Content-Type>\n"; print "<META content=text/css http-equiv=Content-Style-Type>\n"; &style; でしょうか? 一緒に来て頂いて有り難うございます(笑)<291 <291 EUCは試してみていません。<html 保存をEUCにして、metaも変更してみる、という意味ですよね? っつか、恥ずかしいのですが、eucで書いた事ないので、オノレに不安です。
print "Content-type: text/html\;charset=Shift_JIS\n\n";
294 :
289 :02/03/08 11:46 ID:wwEgc1iJ
<293 有り難うございます。 CGIは無事動きましたが、依然として最終飛び先のhtmlは化けてます…
>>292 タイトルの前にメタを置いたら変わるかな?
Web制作板初心者スレからついて来ちゃった てへっ
>>294 最終飛び先のHTMLはCGIが生成しているのではなくて、もろHTMLなの?
フレームを使っているという話だったから、frameset定義ファイルと
各フレームに入るページの文字コードをそろえておいた方が安全な気はする。
298 :
289 :02/03/08 14:33 ID:wwEgc1iJ
<296 有り難うございます!(笑) もろHTMLです。 cgiが生成しているのではありません。 メールフォームを送信し終わった後の飛び先のフツーのhtmlが化けます。 またフレームの方は上フレームがcgi、下がhtml(cgiが生成ではありません) こちらも文字コードはshift_jisにて一貫させております。 つまり具体的には二箇所化けているのです。 ぶっちゃけて言えば、チャットの入り口と、送信フォームの最後の飛び先です。 メタはタイトルの上に置いたり、色々したんですが、どーしても化けるんです〜。しくしく。
>>298 どんな化けかたしてます?
HTMLによるマークアップが反映されているけど文字が判別できないのか、
HTMLの跡形もなくテキストがだーっと続いてる状態なのか。
後者だとしたらバイナリでPUTしてもーたっつー可能性も考えたんだけど。
# 鳩丸見てきたけど、frame要素にtype属性とcharset属性は存在しないみたいっすねぃ。
300 :
289 :02/03/08 15:41 ID:wwEgc1iJ
ミァ竡 こんな感じです<ちなみに「戻る」です。 説明が後からになってしまって申し訳ありません。 サーバのapacheのバージョンが上がる前は普通に表示されていました。<チャットも送信フォームも 例の問題のapacheにバージョンアップした途端に駄目になったものです。 朝からずっと皆さんには色々とアドバイス頂いて恐縮です。 引き続きアドバイスお願いいたします。
301 :
286 :02/03/08 15:43 ID:???
>>287 スレ違いだったのですね・・・気づかずに失礼しました。
レスありがとうございます。とても参考になりました。
しぃちゃんのPaintBBSアプレットにしたいと思います。
>Web制作板初心者スレからついて来ちゃった てへっ きも
305 :
289 :02/03/08 16:42 ID:wwEgc1iJ
<302、303 その通りです。 Google等で検索結果は全部目を通し、その結果、ap_send_error_response() のiso-8859-1 を iso-2022-jpに変更を サーバ管理者にお願いしたのですが、Mac+ネスケで化けるために 自分で.htaccessを書き、そこにAddTypeを記述、アップすると、 Mac+ネスケでは改善しますが、WIN+ネスケ6で文字化け (.htaccessのあるディレクトリ全部)、という現象に陥って困っているのです。
print "Status: 301 Moved Permanently\n"; print "Content-Type: text/html\n"; print "Location: hoge \n\n"; これで試してもダメだった? Locationで化けるって事だよな? 飛び先とか漠然とした言い方をせず飛ばす手段を説明しる。
307 :
nobodyさん :02/03/08 16:55 ID:+6IU9s64
CVSファイル 001,a1,b1,c1 002,a2,b2,c2 003,a3,b3,c3 004,a4,b4,c4 005,a5,b5,c5 のようなデータからランダムに1行拾って書き出したいんですがどうすればいいのでしょうか
308 :
289 :02/03/08 17:02 ID:wwEgc1iJ
<306 有り難うございます。 で…この板の敷居が高いという言い訳になってしまうのですが… それはドコに入れれば良いのでしょう? CGIの中の print "Content-Typeの行のあたりにさっくり入れても大丈夫でしょうか? また飛ばし先のURL指定は、CGIそのものではなく、 set.plまたはcustom.cgiのような、設定ファイルに記入という方式なのです。 CGIを理解してない癖にゴチャゴチャとごめんなさい。
>308
質問を変える。
あんたが使ってるCGIとやらは、誰が組んだものだ?
無料配布されているものか?
自身で組んだものではなさそうだな。
無料配布のを使っているならこっちに行って配布先を明記の上で相談した方がいい。
スクリプト改造工房 Part4
ttp://pc.2ch.net/test/read.cgi/php/1012839651/ >1にあるように
>いらっしゃーい、Perlのコーディングで困ってる人のスレです。
ここはPerlの「コーディングで困ってる人」のスレなんだ。
たらい回しみたいになって悪いね。
もし、配布物でないのなら、あんたの使ってるCGIとやらを拡張子「.txt」にしてアップしてくれ。
ソースが見れないと具体的なことは言いにくい。
はっきり言ってしまうと、あんたの説明じゃ埒があかない。
CVSチェーン ローソン イレブン ミニストップ サンクス のようなチェーン店からランダムに1店舗拾って経営したいんですがどうすればいいのでしょうか
312 :
289 :02/03/08 17:37 ID:wwEgc1iJ
申し訳ありませんでした。<スレ違い 自分ではperlは書けない部外者がグズグズとごめんなさい。 使っているのは、無料配布されているCGI軍団です。 おっしゃる通りです。 教えて頂いた場所へ行ってみますね。 お騒がせいたしました。
313 :
nobodyさん :02/03/08 20:54 ID:d+W0Gg3j
XPでApacheは使えるんですか? 使えるならやり方を詳しく教えてください。 お願いします。
>313 >いらっしゃーい、Perlのコーディングで困ってる人のスレです。
>>314 313はXPでapacheを起動するperlスクリプトのコーディングで困ってるんだよ。
system("c:/progra~1/apache/httpd.exe");
318 :
ge :02/03/09 00:54 ID:oQUE7R44
perl + ANHTTPD でローカルで実験してます。 エラーがあった場合に、 'C:\Program Files\httpd\cgi-bin\test\test.cgi' script produced no output とでるだけでエラーが出ないのですが、 DOS から perl を打った時のようにエラー表示したいのですが、 どうしたらよいでしょうか。
320 :
ge :02/03/09 00:56 ID:oQUE7R44
use Strict とかで出来るんですかね?
CGI出力をチェックでいいんじゃない? anHTTPdは安定しないしすぐリソース喰うので好きじゃないが。
322 :
nobodyさん :02/03/09 01:38 ID:kV8ZYAMB
>エラーがあった場合に use CGI::Carp 'fatalsToBrowser'; ちかいもんはでるよ。
KCatch.pmとかもね。漏れの環境ではCGI::Carpよりも重かったけど。
>>318 なにも出力しないで終了しやがったってことだろ。
「出力こねーぞ!」ってエラー出してるだろ。
プログラムを見直せ。
AnHTTPDだと、[GI出力を検査]のチェックボックスにチェックがしてあれば、
Perlのエラーを表示してくれるだろ。
>324 PerlへのパスがPerl.dllになってるとエラー吐かないことあるよね。 Perl.exeだと吐くけど。
326 :
nobodyさん :02/03/09 09:38 ID:biqte+lk
327 :
nobodyさん :02/03/09 11:15 ID:fgv50gi6
#!/usr/bin/perl print "777777777777777" % "10" . "\n" ; これの答え、5になる奴いない? バージョン5.00503で、答え5になるやつが あったんだけど、誰か詳細しらん?
>>327 文字列に剰余算する奴もたいがいかと・・・。
329 :
nobodyさん :02/03/09 11:35 ID:fgv50gi6
>>328 わざとやってんだよ、
いいから、お前はすっこんでろな。
なんだこれ
>>327 =329
何熱くなってるんだかわからんが、もっとマターリ逝こうよ。
最近人少なくなってるんだからさ。
で、本題ね。
プログラミングやるんなら、16ビット・24ビット・32ビットの最大値くらいは
知っておくべき。
これヒントでもあり解答でもある。
>>335 signed unsignedで変わってきまーす!と無意味な揚げ足を取るテスト。
use POSIX q<limits_h>, q<float_h>;も参照されたし、ってか。
338 :
nobodyさん :02/03/09 14:07 ID:fgv50gi6
>>335 おまえ、恐ろしいしったかバカだなぁ〜
あのよ、数字が小さくてもなんだよ。
でな、Perlのバージョンが同じでも、ライブラリのバージョンの違いで、
結果が変わるわけな、
でな、漏れが聞きたかったのは、libcとか、glibcのバージョンの依存があるとかよ、
そおういう事聞きたかったのよ、
ほぉ〜、ビット最大値ねぇ〜、今年になってから変わったっけ?
>>338 > でな、漏れが聞きたかったのは、libcとか、glibcのバージョンの依存があるとかよ、
> そおういう事聞きたかったのよ
じゃあ最初からそう書けばいいのでは。
あなたのような性格の方はこの板よりマ板向けかと思われます。
>338 では初めからどうぞ。
341 :
nobodyさん :02/03/09 17:16 ID:7LzSOF3K
こんにちは、板違いでしたらすいません。 今、imode端末からcgi(perl)をたたくプログラムを作ろうと思ってるのですが UIDの取り方のアドバイスをいただきたいのです^^; NULLGWDOCOMOという文字を入れておけば、imodeサーバー側でユーザーIDに変換 してくれるとあったのですが formをいくつか配置してあるものに <form method="POST" action="test.cgi?uid=NULLGWDOCOMO"> とかけばよいのでしょうか? ためしにサーバーにあげてテストしたところuidの値をみたら そのまま文字列が入っていました。。 どなたかご教授いただけたらうれしいです。 よろしくお願いします。
<form method="GET" action="test.cgi?uid=NULLGWDOCOMO"> でどうでしょう
そだね、ドコモはPOSTサポートしてないね。
>>341 あのさぁ。それって秘密じゃないの?
その仕様って公開されてるんだっけ?
345 :
テストテスト :02/03/10 10:24 ID:FplTavEM
>>341 docomoに登録申請されて許可されているディレクトリ以下であれば
UIDなる物に変換されます。いよゆるMYMENUです。
勝手なサーバーにやっても変換されません。
ドコモはPOSTサポートしています。一部のウンコ機種だけ使えないだけ。
お願いします。 ハッシュに、いくつの連想配列が含まれているのかを知りたいのですが、 やり方がわかりません。 わからないので仕方なく、 foreach (keys %HASH) { ++$HASH; } のようなことをやっています。なにとぞお助け下さい・・・
>>346 メモリ食うかもしれないけど、
@tmp = %HASH;
$num = ($#tmp+1)/2;
$i = %hash / 2;
もうわかんねーっす!! 1、最適なRWIN値ってどー出すの!? 2、「同時に張るコネクション数」ってどーゆーこと!? お前ら、助けて下さい!
351 :
nobodyさん :02/03/10 12:40 ID:Pl5m+TdB
すみません,質問です。
自分も
>>346 のに興味あったので
%hash = (A=>1,B=>2,C=>3);
$i = %hash/2;
print $i,"\n";
print scalar %hash;
をやって試してみたんですが,
3
6
と予想したのに
1.5
3/8
が表示されました。
なんでこうなるんですか?
>>351 $i = %hash;
で、つじつまは合うなぁ。
汚いけど
print(%hash + 0);
とかは。
354 :
テストテスト :02/03/10 12:49 ID:FplTavEM
>>349 板違い。そんなものビギナーが気にする必要なし。
どこかのアアホサイト見てるんだけうが
HTTP 1.1でセッションを100個張るレジスト書き換え.regファイルとか
配布してるが、意味がないしスーパー迷惑なのでやめれ。
355 :
347 :02/03/10 12:51 ID:???
356 :
ドビ :02/03/10 12:52 ID:???
なるほど。「忘れろ」ってことだな? あと、板違いってことも気付いた。 ごめんな。
>>355 あ、そうか。キー一覧リストの大きさ数えればいいんだ。
コロンブスの卵ちっく。
358 :
351 :02/03/10 13:02 ID:???
>>358 %h = (1,2,3,4,5,6,7,8,9,10);
print scalar keys %h,"\n";
print scalar %h,"\n";
が
5
4/8
って返ってくるんだよね。エントリ=要素ではないのかな。
360 :
359 :02/03/10 13:14 ID:???
>>358 のリンク先にちゃんと書いてありました。逝ってきます。
361 :
346 :02/03/10 13:19 ID:???
>>355 ああ!大感謝です!
本当にありがとうございます。おかげさまでとても無駄な作業部分を消すことが出来ました。
362 :
nobodyさん :02/03/10 15:12 ID:GU0dbd6s
PerlでCGI作ってるんですが、実行している自分自身のファイル名を 調べることってできるんでしょうか。例えば、bbs.cgiっていうCGIの中で、 bbs.cgiっていう文字列を自動的に得たいのです。同じコードをあっちこっちで 使っていて、更新するときに中身の書き換えを不要にするためです。
363 :
341 :02/03/10 15:12 ID:Ew4WhUAi
みなさんありがとうございます。 そか、、NTTが許可したサーバーでだけ使えるんですね^^; アドバイスありがとうございました。
365 :
nobodyさん :02/03/10 15:21 ID:GU0dbd6s
>>364 お、それはヒントですか?調べてみます。ありがとうございます!
367 :
365 :02/03/10 15:28 ID:???
>>366 なんでだ??うそっぱちか?
>>$0 #perlスクリプトのコマンド名
コマンド名ってのがcgiファイル名ってことですね??言葉が難しいや。
368 :
366 :02/03/10 15:30 ID:???
369 :
365 :02/03/10 15:34 ID:???
ははは。失礼!調べたら本当にそのまんまでした! できたー!!すげー、一見汎用性あるっぽくてカコイイ!!
panic: utf8_length: unaligned end なんかエラーがでて文字列の長さが取得できないんですが…。
371 :
370 :02/03/10 15:40 ID:???
同じ文字列を使った単純なテストだと問題ないし。 何故…。
372 :
370 :02/03/10 15:44 ID:???
と思ったらuse utf8すると再現するっぽい。 #!perl use utf8; length '時'; __END__ しかし問題なのは実際のコードでは use utf8 などしていないということ(鬱
373 :
365 :02/03/10 15:56 ID:GU0dbd6s
CGIファイルの場所を調べることはできますか? なんていうんだろう、urlっていうのかパスっていうのか、よくわからないんですけど http〜〜〜cgi-bin/bbs/bbs.cgi みたいな感じのものを調べたいのです。
use utf8ってスクリプトの文字コードがutf8ってことだけど・・・ utf8で保存してる? >しかし問題なのは実際のコードでは use utf8 などしていないということ(鬱 何か他にモジュール使ってない?
>373
print '
http:// ' . $ENV{'HTTP_HOST'} . $ENV{'SCRIPT_NAME'};
で出るかな?
376 :
370 :02/03/10 16:08 ID:???
スクリプトの文字コードはEUC-JPです。 どうやらDBI+DBD::SQLiteでDBからフェッチした文字列がおかしい模様…。 でもJcode::getcode()で調べてもEUC-JPなので謎です。
>>373 CGI.pmの重さが気にならなければurlメソッド/関数で取得可能。
>>376 use utf8;を加えて、文字コードをutf8で保存してから実行するとどうなる?
>>370 Perlのバグじゃない?新しいのに入れ替えてみれば?
>>378 そうするとpanicは避けられるっぽいです。
ただそうすると大幅に書き換えなければいけないので出来れば避けたいです…。
# とりあえず完全に再現できるスクリプトを書き中…
381 :
365 :02/03/10 16:28 ID:GU0dbd6s
下痢下痢で遅れました..(鬱)。
>>375 、
>>378 ありがとうございます!$0みたいにずばりはないんですね。
ちょっと調べてみます。
382 :
370 :02/03/10 16:48 ID:???
再現できました。 これで "panic: utf8_length: unaligned end at test.pl line 20."です #perl -w use DBI; unlink 'test.db'; my $dbh = DBI->connect('dbi:SQLite:test.db'); $dbh->do(<<_SQL_); CREATE TABLE test( foo CHAR(100) ); INSERT INTO test VALUES('テストだよ'); _SQL_ my $sth = $dbh->prepare(<<_SQL_); SELECT * FROM test WHERE foo like '%'; _SQL_ $sth->execute(); $\ = "\n"; while($_ = $sth->fetchrow_arrayref()){ print length($_->[0]); } __END__
383 :
365 :02/03/10 16:54 ID:???
>>375 さんの方法でできました!ありがとうございます!
うーん、20行目の$_->[0]がutf8になってないってことでしょ? use Jcode; して、20行目を print length (jcode($_->[0])->utf8); にしてみるとどう?
385 :
370 :02/03/10 17:07 ID:???
ちなみにテストスクリプトの文字コードはEUC-JPです ->utf8()では問題無しですが、->euc()だとpanicです 察するに内部フラグがどうにかなってるっぽいんですが…。 # さっきのスクリプト後半 $\ = "\n"; print join ' ', unpack 'C*', ('テストだよ'); print length 'テストだよ'; while($_ = $sth->fetchrow_arrayref()){ print join ' ', unpack 'C*', ($_->[0]); print length $_->[0]; } __END__ 出力: 165 198 165 185 165 200 164 192 164 232 10 165 198 165 185 165 200 164 192 164 232 panic: utf8_length: unaligned end at test.pl line 23.
386 :
384 :02/03/10 17:23 ID:???
んー、内部で誰か(多分DBI)がuse utf8してるからlengthへの引数を utf8なやつだと解釈しようとして失敗してる(eucなんだから当然)からなわけで。 だからlengthに渡すものをutf8に変換しておこう、と言う改造をしてみたんだが。 納得いかないならこんなのとか。 { no utf8; $\ ="\n"; while ($_ = ....){ print length($_->[0]); } }
387 :
384 :02/03/10 17:34 ID:???
あれ?よく読んでなかった。 なんか勘違いした事書いたかも。スマソ。
388 :
370 :02/03/10 17:41 ID:???
>>386 申し訳ない、
>>384 が目に入ってませんでした。
それでOKです!
いろいろ試した結果、eval qq{"$_->[0]"}でも正常化できるみたいです。
でもno utf8じゃダメっぽいです…。
とりあえず、解決たので一安心です。
どうもありがとうございました。
>>346 ,355
今さらでスマンが、
keysやvaluesでいくと%HASHが巨大だった場合に危険じゃない?
どうせやるなら
++$num while (my ($key, $value) = each %HASH);
とか?めんどくさいけど。
>389 代入はいらないのじゃない?
>>389 スカラコンテキストで使うとそれぞれの数を返すっていうkeysやvaluesの機能でしょ.
内部でいちいち展開して数を数えるような,非効率的な事はやっていないと思うよ.
use Benchmark;
my $num = 0;
my %hash;
for (1 .. 1000000) { $hash{$_} = $_ }
timethese 1 => {
'++' => sub { ++$num while (my ($key, $value) = each %hash) },
keys => sub { $num = keys %hash }
};
# 結果
#
# Benchmark: timing 1 iterations of ++, keys...
# ++: 5 wallclock secs ( 4.79 usr + 0.00 sys = 4.79 CPU) @ 0.21/s (n=1)
# keys: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU)
◎ $num = keys %hash; ○ ++$num while each %hash; × ++$num foreach keys %hash;
393 :
nobodyさん :02/03/11 13:07 ID:ILIPqmP1
処理中に5秒間待たせるような処理に今は while文で只管ぐるぐる回して 5秒ぐらいで処理を抜けるような感じにしています。 でも、なんかもっとちゃんとした方法があると思うんですがどんな方法があるんでしょうか?。
395 :
393 :02/03/11 14:17 ID:???
>394 やはりこういうものがあったんですね(^^ ありがとうございました。 もっと勉強してきます・・・
perlでtime関数を使用し、SSDを発生させたいのですが、 スクリプトがわからないのでお教えいただけませんでしょうか? または参考URLをお願いします。
SSDが何かわからん俺は逝ってよし?
399 :
sage :02/03/12 03:05 ID:XpAJ+W0c
SSD…恥ずかしながら僕も初耳。
>397=400 基本はこれだけど, Perl5からは srandで種作らなくても自動で最適な種が作られるようになってる。 srand time; print rand 100;
>>400 rand 100
は何を表すのですか?
403 :
nobodyさん :02/03/12 04:52 ID:52qV3w5q
ちょっとでかめで、しっかりした実装されてる、 システム公開してるとこ、無いですかね、 しっかりした、ソース見て勉強したいんですけど、
404 :
nobodyさん :02/03/12 04:53 ID:52qV3w5q
>>402 0〜100未満のランダムな数がくるぞ
(少数含むから、気をつけれ!)
405 :
nobodyさん :02/03/12 06:34 ID:mNSx+HCB
いきなり質問申し訳ありません。 「更新」ボタンの無効化ってどうやるんですか?
>405 ・・・
>>405 こ、更新ボタンを無効化するの?何のために?お互い困るんじゃない?
>>405 それができるくらいのハッカーになりたいってことか?
あれだ、JavaScriptの"戻る"ボタンの無効の延長線じゃないか? それか、アプローダとかでリロードしないで欲しいとか。
まぁ、どちらにしてもPerlの仕事じゃないな。
411 :
370 :02/03/12 11:10 ID:???
(
>>370-388 )
ふと思いついてDevel::Peekでダンプしてみたところ
SV = PV(0x1c4a57c) at 0x1c2f258
REFCNT = 1
FLAGS = (POK,pPOK,UTF8)
PV = 0x1c8aff0 "\245\306\245\271\245\310\244\300\244\350"\0
CUR = 10
LEN = 11
やっぱりUTF8フラグが立っている模様。
これ、バグですよねぇ…。英語書ける方、誰か報告してくれないかな…。
412 :
405 :02/03/12 13:34 ID:eWSq/Ah6
説明不足でした。 submitでhtmlの情報をcgiに送る。 ↓ cgiがログファイルをいじる。 ↓ cgiが呼び出されて表示されたその画面で「更新」ボタンを押す。 ↓ もう一度ログファイルをいじる。 ↓ ログファイルが変になる。 ↓ (+д+)マズー! 具体例。 ログファイルの配列:@array=(0,1,2,3) 一度目push(@array,4);という命令を出す。→@array=(0,1,2,3,4)→ログファイルに書き込む リロードするともう一度push(@array,4)を実行する→@array=(0,1,2,3,4,4) →困る。どなたか対策を教えてください。
413 :
nobodyさん :02/03/12 13:46 ID:pCWuH9pI
すみません。 掲示板CGIの改造をしたいのですが、 チェックボックスを付けて、それがオフの場合投稿を弾いてメッセージを表示するにはどうしたらいいのでしょう?
>>412 前回の内容と比較すれば?
それとcgiに書き込んだあと、htmlファイルにリダイレクトさせるとか。
そうすれば更新ボタン押してもhtmlファイルをGETするだけでしょ。
415 :
405 :02/03/12 13:50 ID:eWSq/Ah6
>>414 ありがとうございます。
でも、すみません、リダイレクトって何ですか?
>>415 Locationヘッダを出力したり、HTMLのMETAタグで飛ばしたり。
>>413 > チェックボックスを付けて、それがオフの場合投稿を弾いてメッセージを表示する
INPUT TYPE=checkbox とか、
フォームデータのデコード とか、
検索かけてみて、それでも解らなければそこを聞くのが良いんでない?
と初心者の俺が口を挟んでみるテスト。
418 :
nobodyさん :02/03/12 14:25 ID:h6G3oh/x
>>417 アドバイスありがとうございます。
かすってるサイトを発見したので、掲示板に応用するため試行錯誤してみようと思います。
>>417 初心者のくせに的確だぜ。
このままではわしの地位が・・・。
大きくなる前に潰しておかねばの・・・ふぉっふぉっふぉ。
と、何かを企ててみるテスト。
420 :
nobodyさん :02/03/12 14:51 ID:h6G3oh/x
で、今やってみました。 コメント入力欄のあたりに <INPUT TYPE="checkbox" NAME="a" VALUE="b">書きこみをOKする<BR> って入れて、名前が入ってないとエラーを返す部分があったのでそこに if ($a eq "") { &error("オンにしてちょ。",'NOLOCK'); ってやってテストしてみたらオンでもオフでもエラーを返されてしまいました。 別にvalueがbの場合用の処理(?)を書かなくてはいけないのでしょうか? ちなみに上のは名前が入ってないとエラーを返す部分をちょっと変えただけです。
422 :
nobodyさん :02/03/12 14:57 ID:h6G3oh/x
>>422 自力で書こうとしてたしこっちで良かったんじゃないかなぁ。。
余計なこと言ったかも。スマソ。
>420 とりあえず、$aじゃなくて$FORM{'a'}とかじゃないのか?
425 :
nobodyさん :02/03/12 16:50 ID:+eqUJIVR
use Socket;を使ってサーバからhtmlを取得するものを作ったんですが、 HTTPリクエストを送って反応がなかった場合スクリプト自体が止まってしまいます リクエストを送って30秒間反応がない時には次の処理に行く といった処理をするにはどうすればよいのでしょうか?
427 :
425 :02/03/12 17:19 ID:???
こんな便利なものがあったんですね(^^; ありがとうございます。
flockの信頼性&利便性はどうなんでしょ? Perlメモのファイルロックなど自前のファイルロックもありますが, flockが使える環境ならできるだけflock使ったほうがいいんでしょうか?
>>428 サーバによる。
ファイルとかシンボリックリンクとかよりよっぽど。
>428 下手に自前でやるより信頼できると思われ。 WinNT環境だと,flock使ってもロックしないって話を聞いたことがあるような。ないような。
>>428 漏れも迷わずflock()使う。
プロセスが死ぬとロックが自動的に外れるところがおいしい。
ちなみに、Solarisでは、ライトオープンしないと排他ロックできないという
ことに気づくまで、結構悩んだ。(なんか他のOSだとリードオープンでも排他ロック
できちゃったりした記憶が・・・)
433 :
ぼくフェロー :02/03/12 20:11 ID:/5Jn0bAA
お尋ねしたいことがあります. $a='100' => 数値 $a='-10.0' => 数値 $a='1e+10' => 数値 $a='abc' => 数値ではない. のような判断をしたいのですが良い方法が分かりません. すなわち,ある変数 $a に文字列が入っているのですが, 数値を表すことができるか否か判別するよい方法はないでしょうか?
>433 マルチポストするくらいなら正規表現でも書いてろ。
435 :
ぼくフェロー :02/03/12 20:21 ID:/5Jn0bAA
ごめんなさい.
436 :
428 :02/03/12 20:44 ID:???
なるほど。 信頼性も自前<<flockなのか。 なら自前lockのメリットはプラットフォームの問題のみなのか。 素直にflock使うか・・・
>>433 あ、こんなところでもお会いしましたね。記念に。
$tmp = $a;
$tmp++;
print "$a is num\n" if $tmp == $a+1;
>>433 >数値を表すことができる
↑この仕様がわかりませんが、
if ($a =~ /^([+-]?\d*\.?\d*)([eE][+-]\d+)?$/ and $1 !~ /^[.+-]*$/)
みたいな感じかな?
数字が(Perlの変数で表せないほど)たくさん並んでもマッチするけど・・・
439 :
nobodyさん :02/03/12 21:40 ID:p/r//4Pi
flockが実装されてるか調べようと,以下のように書いてみたんですが これで正しく判定できますか? eval {flock DATA,1 or die $!}; print "flock使えません\n" if $@;
> NFSの実装によっては信頼できるロックをまったく持っていません ~~~~~~~~~~~~~~~~
442 :
nobodyさん :02/03/12 23:21 ID:p/r//4Pi
443 :
440 :02/03/13 00:06 ID:???
とあるソフトでflockが刺さる現象がユーザのところで年に数回発生してて、 lockdを再起動すると回復したりする。 (らしい) 直接の担当じゃないから、ほじってないんで… 謎
444 :
nobodyさん :02/03/13 00:06 ID:J00pd5X0
順位をつける明快なアルゴリズムってないですか? 例えば成績データとかで、 ishida,80 inoue,70 gotou,70 satou,65 shibata,90 suzuki,80 のような物があった時 1位,shibata,90点 2位,ishida,80点 2位,suzuki,80点 4位,inoue,70点 4位,gotou,70点 6位,satou,65点 と表示したいのです。 考えれば考える程複雑になっていくので…
そのリストの最大値求める。 同点を求める。ループ回して見つかった物を次々リストにプッシュすれば良かろう。 処理が終わったら処理後のデータを−1とする。 ↑を最大値が−1になるまで続ける。 とかね。ループだらけでシンプルじゃないな。 sortで並べて一つ上のデータとどう得点の場合は上と同じ順位を表示とか。
そんなに複雑かぁ? $score = 101; for($i = $j = 0; $i <= $#r; $i++){ if($r[$i]->[1] < $score){ $j = $i ; $score = $r[$i]->[1]; } $r[$i]->[2] = $j; }
447 :
パッチ :02/03/13 00:38 ID:???
$r[$i]->[2] = $j + 1;
>>446 さっきまでJavascript書いてたの。
で、
>>446 見たら死ぬほど読みにくいわ。
恐るべし。Perlw
>>444 $score{$name} に点数が入っていて、100点満点だとします。
while( ($n,$s) = each %score) { $inverse{sprintf("%03d $n",$s)} = undef; }
$rank = 0; $last_score = -1;
foreach(sort {$b-$a} keys %inverse ) {
/(\d+) (.+)/;
$rank++ if $1 != $last_score;
$last_score = $1;
printf("$rank位,$2,%d点\n",$1);
}
てのはどうでしょう。
450 :
449 :02/03/13 00:47 ID:???
>>449 最初の%inverseへの代入は無駄でした・・・
foreach (sort {$score{$b}-$score{$a}} keys %score) {...}
てすればいいのねー。
451 :
448 :02/03/13 01:08 ID:???
おまえらって、そのていどなんだぁー。
>444 ソートだとこんな感じかな 並べ替えて,前の点数と同じなら同位,違うなら上から数えた順位。 while(<DATA>){ chomp; ($name,$score) = split /,/; push @score, {name=>$name,score=>$score}; } my $allrank = 1; my($prevscore,$rank); foreach(sort {$a->{score} <= $b->{score}} @score) { $rank = $allrank if ($_->{score}!=$prevscore); print "$rank位,$_->{name},$_->{score}点\n"; $allrank++;$prevscore=$_->{score}; } __DATA__ ishida,80 inoue,70 gotou,70 satou,65 shibata,90 suzuki,80
私なら Schwartzian Transform @score = map { $_->[0] } sort { $b->[1] <=> $a->[1] or $a->[0] cmp $b->[0] } map { [$_, (split /,/)[1]] } <DATA>; 叩き台にでもなれば。
457 :
448 :02/03/13 01:48 ID:???
なに悩んでんだよー。このていどで。
foreach ( map { do{ $ninzu++; $rank = $ninzu if ($_->[1]!=$prevscore); $prevscore=$_->[1]; }; [$rank, $_->[0], $_->[1]] } sort { $b->[1] <=> $a->[1] or $a->[0] cmp $b->[0] } map { [split /,/] } <DATA> ) {print "$_->[0]位,$_->[1],$_->[2]\n"}
459 :
458 :02/03/13 02:15 ID:???
chomp忘れた。
$| = 1;って何をするものなんですか?
バッファリングの防止
463 :
444 :02/03/13 03:43 ID:MYvm6b7t
みなさん、本当にありがとうございます。 >446-448さん 簡潔すぎて・・意図する所がわからず 悩みに悩んだ結果がこれですけど、これでいいですか?? 参照はかなり苦手です。。しかも無名配列。。 でも、おかげさまでかなり勉強になりました。 結果はばっちりでした。 @data = <DATA> ; @tmp = map {(split /,/)[1]} @data; @data = @data[sort {$tmp[$b] <=> $tmp[$a]} 0 .. $#tmp]; foreach ( @data ) { chomp ; ($name,$score) = split /,/ ; push @r , [ $name , $score ] ; } $score = 101; for($i = $j = 0; $i <= $#r; $i++){ if($r[$i]->[1] < $score){ $j = $i ; $score = $r[$i]->[1]; } $r[$i]->[2] = $j + 1 ; } for ( $i = 0 ; $i <= $#r ; $i++ ) { print "$r[$i]->[2]位,$r[$i]->[0],$r[$i]->[1]点\n" ; } __DATA__ ishida,80 inoue,70 gotou,70 satou,65 shibata,90 suzuki,80 tanaka,80
464 :
444 :02/03/13 03:43 ID:MYvm6b7t
>449-450さん 結果が・・・ 1位,shibata,90点 2位,tanaka,80点 2位,ishida,80点 2位,suzuki,80点 3位,gotou,70点 3位,inoue,70点 4位,satou,65点 みたいになります。。 やはりループの回数数えないといけないんですね。 それと「100点満点だとして」というのが どこに影響してるのかよくわからないんです。。 >454さん 一番素直に理解できました。 ソートのとこの式がちょっとおかしかったですけど。 (sort {$b->{score} <=> $a->{score}} @score) ですよね。 ともかく、皆さん本当にありがとうございました。 全部理解してテストするのに2時間程かかりました。 もっと勉強せねば。。
465 :
nobodyさん :02/03/13 03:44 ID:XatxhEQY
ディレクトリ以下の全htmlファイルからリンクを探し出し、置換し,その
結果だけ表示したいんですけど、途中まで書いたんですけど、わからなくて…
$dir = '.';
opendir(DIR, $dir) or die;
@file = sort grep { /\d+\.html/i && -f "$dir/$_"} readdir(DIR);
closedir(DIR);
foreach(@file){
if( $_ =~ /<a href="
http:\/\//i ){
s/co\.jp/ne\.jp/g;
print;
}
}
>>455 >>458 みたいなのは、Perl臭さが漂いすぎて、大好き。
いや、単なる個人的意見ですが。
>>465 HTML::LinkExtor使うと簡単ですよ。
>>465 引数で指定されたディレクトリに移動して.をopendir
readdirを見ていき$_が
・ディレクトリなら再帰(引数は今見てる$_)
・HTMLファイルなら開いて痴漢してプリント
全部見終わったら..に移動
な関数を作る。でいいのでは?
465は自力でできそうな気がするのでわざとコードは書かない(w
>>465 foreach (@file) {
open FH, $_ or die $!;
while (<FH>) {
if (m{<a\s+href="(
http://[^ "]+\.co\.jp[^"]*)"}i) {
$1 =~ s/\.co\.jp/.ne.jp/g;
print "$1\n";
}
}
close FH;
}
--------------------
use IO::Dir;
use HTML::LinkExtor;
foreach (grep { /\.html$/i } IO::Dir->new(q/./)->read) {
my $parser = HTML::LinkExtor->new;
$parser->parse_file($_);
foreach my $elem ($parser->links) {
$elem->[0] eq q<a> or next;
while (@$elem) {
my ($attr, $value) = splice @$elem, 0, 2;
next unless $attr eq "href"
and $value =~ m{
http://.+\.co\.jp/?}i; $value =~ s/\.co\.jp/.ne.jp/g;
print $value, "\n";
}
}
}
双方とも動作確認無しですが。
470 :
470 :02/03/13 08:13 ID:DQ1JFad8
CSV形式の名簿を住所で都道府県別に表示したいんですが、
以下のようにソートすると当然、文字コード順で愛知(アイチ)、
愛媛(アイヒメ)……という順番になります。([18]が住所です)
-----------------------------------------------------------
# 都道府県別にソート
if($sort == 3){
@LINES = sort { (split(/\,/,$a))[18] cmp (split(/\,/,$b))[18] } @LINES;
}
-----------------------------------------------------------
これを都道府県コード順にソートするにはどうしたらよろしい
でしょうか?
http://www2.odn.ne.jp/sasabomb/tables/jisx0401.html もちろんCSVに都道府県コードは含まれていません。どなたか
ご教示よろしくおながいします。
>>470 47都道府県名をあなたが望む順番でリストに格納。
そのリストに従ってデータをソートするルーチンを書く。
愛媛も愛知も同じ愛である以上、一緒に並ぶのは当然。
472 :
ほい :02/03/13 09:55 ID:68BwgqOI
# 都道府県別にソート if($sort == 3){ $i = 0; undef(%pref); foreach $pref_name ('北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県', '茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県', '石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県', '京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県' ,'山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県' ,'大分県','宮崎県','鹿児島県','沖縄県') { $pref{$pref_name} = $i++; } @LINES = map {$_->[0]} sort {$pref{$a->[18]} <=> $pref{$b->[18]}} map {[$_, split /,/]} @LINES; }
473 :
nobodyさん :02/03/13 10:29 ID:auK7WJtB
こんにちは、フォームのデータってブラウザでリロードされた時にクリアされずに 残ってますよね。 掲示板作ってるんですが書きこみ後リロードすると二重投稿になっちゃうんですよ。 どうやって回避するんでしょうか?
>473 1:投稿内容を直前のものと比較して、一致したら書き込み拒否する。 2:書き込み後Locationで別のページ(そのBBSでも問題なし)に飛ばす。
475 :
473 :02/03/13 10:46 ID:auK7WJtB
>474 ありがとうございます。 1:は考えたんですがプログラム的にカッコよくないかと思ったので・・・ 2:でやってみます。 助かりました。
>475 ただし、2の場合、投稿ボタン2度押しには対応できないという事を忘れずに。 1ならそれも防いでくれるけどね。
477 :
473 :02/03/13 11:06 ID:???
>476 ええ!?そうなんですか?じゃあやっぱり1でやりますね。 どうせソースなんか僕しかみませんしね。 あ、でも、連続して削除する時のチェックボックスなんかは 間違いでなく一致しちゃうこともありますよね。 そこらへんの実践的なテクニックって皆さんどうやって習得されてるんでしょうか? Perlは独学の方も多いと思いますが・・・ (ちなみに僕は元COBOLプログラマです)
初心者です。 レンタル掲示板を自分でやろうとすると、 どうすればいいのでしょうか? プログラムは1個で、設定ファイルを顧客分つくるのでしょうか? また、自分が借りているティーカップでは、 アドレスの拡張子がhtml になっています。 これ、なんでhtml なんでしょうか? レンタルの仕組みと関係あるんでしょうか?
>478 もっと基本的なところから勉強しないと問題外。 具体的にはHTMLタグとかから。
レンタルしているところでも
中には
>>478 みたいなのがいるのかもしれないのか。。。
あな、おそろしや。。。
>>478 スクリプト買ってきた方がいいと思うよ。
そのレベルから、安定して動かせるスクリプト作れるまで結構かかると思う。
482 :
nobodyさん :02/03/13 15:16 ID:nYyCnnqM
484 :
482 :02/03/13 15:22 ID:???
>>483 うわ、直前に既出でしたか…。ドウモスミマセン…。(;´Д`)
485 :
482 :02/03/13 15:33 ID:???
>485 検索サイトって知ってる?
487 :
460 :02/03/13 16:14 ID:???
>461 >462 ありがとう。 「バッファリングの防止」というものは知っていたんですが具体的に何をするものかがさっぱりでして・・・。なるほど。 例えは悪いですが,普段はコンパイラが(print構文を)食べて,ある程度たまってからウンコ(出力)するんですね。 しかし$_ = 1;を指定しておくと食べながらウンコするわけか。 そうかそうか。
例えに
>>487 の人柄が表れているな。嗚呼嫌だ嫌だ…。
掲示板はあるとして、 それをレンタルする仕組みが知りたいんですが・・・ なんで、htmlかも知りたい。
>489
まずはcgiのソースを読んで意味が理解できるようになれ。
そうすれば両方の答えが自然に出てくる。
perlの書き方も知らない人間には教えられないって。
数字を知らない人間に算数を教える事は出来ないだろう?
>>1-10 くらいにはいいリンクも揃ってるんだしがんばって勉強してくれ。
で、なんでhtmlなの。
>491 HTMLソース見ろ。
ティーカップの掲示板は、 4桁の数字がIDになっています。 ということは、 そのID専用のスクリプトを ひとり1個ずつ サーバーに置いているということでしょうか?
春ですねぇ
そろそろいいだろ?
>>493 スレ違い。他でやってください。
レンタルのつくり方とか 書いてあるページとかあるのかな?
Perl でできるものなのかな?
>>464 あ、ごめん。たしかにそうなりますね(^^;;
あと100点満点どうこうは、
>>449 のsprintfで%03d(3桁)
にしてるためだったのですが、
>>450 で訂正したようにすると、
その制限は無くなりますです。
>>491 Hyper Text Markup Language だから、ふつー拡張子は .html だろ。
あんたは普段 .html じゃない拡張子でhtmlファイルを保存してんのか!?
>>496-497 Perlを勉強すればで、結構簡単にできますよ。
ちなみに「レンタル掲示板の作り方」は他スレでよろしく。
>>499 MS-DOSは8.3形式。
あらゆるOSとの互換性を考慮するなら拡張子をhtmとしても何ら問題ではない。
それか、あんた世の中にはWindowsしか動いてないとか?w
だから平気でファイル名に%20(スペース)入れるバカが出てくるんだな。
502 :
460 :02/03/13 21:05 ID:???
>499 おれもマジレスしようかと思ってたがやめといてよかった。 ヒマな厨房が無理やり揚げ足とりのワナを張ってる気がしたんだよ。
>>502 なる。
>>501 すまん、その通りだ。
世の中にはWindowsしか動いて無いと思っていたよ・・・
504 :
460 :02/03/13 21:46 ID:???
他スレにも「Main」と「main」でわめいて常連追い出した厨房いたね。 ただでさえ人の少ないWebProg板なのにJAPUや_GUNZIPなんかも揚げ足取られてどんどん出ていった・・・。
>>503 いやいや、そんな謙虚にならずに。こちらも結構賭でしたから、あの煽り。
506 :
あゆ :02/03/13 21:47 ID:???
507 :
503 :02/03/13 21:53 ID:???
>>501 あ、ごめん。間違って名前に%20(スペース)入れちまった・・・
今出先なので、ssh経由でw3mで書き込んでるので許してくれ。
509 :
470 :02/03/13 21:56 ID:???
>>471 すいません、難しくて理解できないんです。申し訳
ありませんが、もう少し易しくご教示いただければ
幸いです。よろしくお願いします。
>>472 ありがとうございます。その通りやってみましたが、
ソートされずにそのまま出力されてしまいました。
揚げ足取りをしていいのならこの文章を張っておこう > HTML文書の拡張子は通常 .html なのですが、Windows 3.1など古いシステムでは拡張子に3文字までしか使用できなかったため、 > Windows系では未だに .html の代わりに .htm と記述するケースが多いようです。 > HTML文書の擴張子は不定です。仕樣書のどこにも「HTML文書の擴張子は*.htm/*.htmlでなければならない」等とは書かれてゐません。例へば、cgiの吐出すHTML文書に擴張子は附いてゐません。それでもcgiの吐く文書は立派なHTML文書です。 > サーヴァからhttp應答ヘッダにContent-type:text/htmlを附けられて送信された文書は皆HTML文書です。 > 擴張子が*.htmlの文書を「HTML文書」と看做すのは、 > 擴張子で文書の種類を判斷するWindows(や、Windowsの使用に合はせて擴張子でも文書の種類を判斷するMac)だけです。
511 :
460 :02/03/13 22:02 ID:???
>507 ぷっ,その書き込みでおれが一番救われた(笑
どこぞでMainを指摘した厨房だが
>>504 Mainが誤りだと指摘されたのがそんなに悔しかったのか?
大文字小文字を識別する言語なら当然だろうが。
それとも、まさか指摘するべきじゃなかったと言いたいのか?
知 識 だ け で 大 人 げ な い 厨 房 の 宴 の 開 催 だ !
514 :
460 :02/03/13 22:09 ID:???
昔からこの板には空気が読めない厨房が存在するって書いただけ。 Mainとmainが黒と白以上に違うもんなのは十分承知。 ちなみに勘違いしてるようだが,おれは最近そのスレ見つけたんだよ。 書き込みすらしたことない。
>>513 厨房はそもそも大人じゃないやん(ビシッ)
で、結局のところ、 どういう仕組みなの? 細かいところはどーでもいいので、大きな部分が知りたい。
KENTのMBSProのお試し版の中身でも見りゃいいだろ もう出てくんなよ
>>517 ありがとう。
最初から素直に教えろよな。ヴォケ。
520 :
460 :02/03/13 22:50 ID:???
>518 ごめんよ。
ヽ(´ー`)ノ
サブルーチンについて教えて下さい。 通常、私は &hoge;のような形でサブルーチンを使っているのですが、 &hoge("section1","section2"); のような引数をかっこに入れた使い方を見たことがあります。 取り立ててその使い方がわからなくても使えてはいるのですが、 もしよろしければ、これの意味を教えて下さいませ。
>>522 引数て・・・ちゃんとお手持ちの参考書は読みましたか?
>>523 読んでいません。
普通、なにかの処理のなかで
&sub_routin 呼び出せば、そこまでのグローバル変数と$_がそのまま使えますので、
それ以上の使い方をしたことがないのです。
ですから、よく、というか、全く理解していないのが現状です。
人の作ったCGIを、自分の好みのデザインに変えるくらいの作業しかわからないのですが
このあたり、どういう意味なのか理解したいなとは思っています。
お願いします。
>>524 一度Perlの入門書を購入して読まれた方がいいです。
>>524 &sub_routine('hoge','pau');
で呼び出すと、
sub sub_routine {
($a,$b) = @_;
...
}
とすることで、$a,$bに引数を受け取れます。
グローバル変数で受け渡しすると、どの変数をどこで書き換えたか
管理するのがめんどうになってくるので、引数で渡したほうが
べんりですよ。あとからそのサブルーチンを使いまわすときも
効果大です。
perlは、他人のソースから学ぶのが非常に困難なトリッキーな
言語だと思いますので、入門書等の平易なソースを見ながら
勉強したほうが楽だと思います。
ちなみに私は、一度書いた自分のソースでさえ、あとから見ると
なにをやってるのか、その記述にどんな必然性があるのか、
わからなくなることがしょっちゅうです。
527 :
526 :02/03/14 00:51 ID:???
>>524 すまぬ。
($a,$b) = @_;
↓
local($a,$b) = @_;
に訂正です。
余計な疑問が沸かないように省略したら、逆にグローバル変数と
変わらなくなってしまった・・・アフォだオレ
$answer = &plus(5,10); # 5と10をサブルーチンplusに渡して、結果を$answerに返す print $answer; # 15 sub plus { my ($x,$y) = @_; # @_は&plus(ここ)にあったものを渡す 今回は@_ = [5,10] my $xy = $x + $y; return $xy; # 返す } 本読まないで言語習おうなんて甘いと思うけどね
$answer = &plus(5,10); print $answer; sub plus { return $_[0] + $_[1]; } 俺ならこうしちゃうけど、一度変数に格納した方がいいのかね?
530 :
:02/03/14 01:23 ID:???
Perl5の時代に、何故にlocal?
KENT信者だから。
@_ = [5,10] ってなんだよ(恥
>>529 あとから見るときの為に分かりやすい名前つけておいた方がいいとか読んだから
俺は変数に入れてるけど、使う人の好みだよね。
533 :
526 :02/03/14 02:07 ID:???
>>530 すまぬ。いつものくせで
local($a,$_) = @_;
とか書くもので。
みんな、関数の中で $_ つかうときどうしてるのー?
>>533 sub hoge
{
local $_;
...
}
先頭付近でlocal宣言してます。
>>524 つまり皆はグローバル変数だらけにしないって事だね。
>533 漏れの場合、 &hoge($_); sub hoge{ $temp = $_[0]; } とかにしちまう。
>>488 アヤシイ性格判断してる暇があったら、$| を $_ と書いちゃってることを
一言指摘してやりゃーいいのにさ。
ttp://www.futomi.com/ の解説ってどうなの?
クッキーの解説でも「パスが省略されると、アクセスしたリソース(HTML、CGI)のパスがセットされます。」とか本当にあってる?
とほほではそのスクリプトのフォルダ全部にパスかかるって書いてたと思うんだけど・・・
参考にしても大丈夫かな?
すいません、すごく初歩的な質問で恐縮なんですが、こういうときに 正規表現で前方一致させるにはどうしたらいいんでしょう? $i = 0; undef(%color); foreach $name ('田中', '鈴木', '佐藤') { $color{$name} = $i++; } 田中角栄でも真紀子でも0を、鈴木一郎でも宗男でも1を、という具合に 定義したいんです。よろしくお願いします。
540 :
533 :02/03/14 07:41 ID:???
>>537 やべ。実はこっそり
>>487 はうまいこと言うなぁと思ってていたので、
そこには気づかなかったよ・・・
>>539 意図を理解するまでちょっとかかったぞ・・・
(ここに
>>539 のソース)
$in = <>;
undef $result;
while( ($name,$col) = each %color) {
$result = $col,last if $in =~ /^$name/;
}
て感じでどうかね。
>>542 さん
すみません、私の説明不足でした。
1,foo,田中角栄,bar
2,foo,鈴木一郎,bar
3,foo,田中真紀子,bar
4,foo,佐藤三郎,bar
5,foo,佐藤栄作,bar
6,foo,鈴木宗男,bar
・
・
以下続く
というようなファイルがありまして、必ず田中、'鈴木、佐藤の順に
並べ替えるにはどうしたいいかと試行錯誤しておりまして、以下の
ようになっているんです。
$i = 0;
undef(%color);
foreach $name ('田中', '鈴木', '佐藤') {
$color{$name} = $i++;
}
@LINES = map {$_->[0]}
sort {$color{$a->[3]} <=> $color{$b->[3]}}
map {[$_, split /,/]} @LINES;
>>542 でいただいたソースを貼ってみましたがうまくいかないようです。
アドバイスいただければ幸いです。よろしくお願いします。
>>543 初心者なもんで粗野ですが、こんな感じでやってみました。
%name = ();
@lines = ();
$i = 0;
while ($line = <DATA>) {
push(@lines, $line);
$tmp = (split(/,/, $line))[2];
$name{$tmp} = $i;
++$i;
}
@permutation = qw(田中 鈴木 佐藤);
foreach $fam (@permutation){
foreach $full (keys %name) {
if (index($full, $fam) == 0) {
push(@result, $full);
}
}
}
foreach(0 .. $#result) {
print $lines[$name{$result[$_]}];
}
__END__
1,foo,田中角栄,bar
2,foo,鈴木一郎,bar
3,foo,田中真紀子,bar
4,foo,佐藤三郎,bar
5,foo,佐藤栄作,bar
6,foo,鈴木宗男,bar
545 :
543 :02/03/14 10:16 ID:???
>>544 さん
早速ありがとうございます。申し訳ありませんが、どうやって
>>543 に
移せばいいのでしょうか?私、perl二日目でしてよくわからないんです。
お手数をおかけして申し訳ありませんが、どうかよろしくお願いします。
「
>>543 に移す」の意味がわからないのですが・・・
結果を@LINESに入れるなら、
print $lines[$name{$result[$_]}];
を、
push(@LINES, $lines[$name{$result[$_]}]);
で大丈夫だと思いますが。
547 :
オ :02/03/14 10:36 ID:???
はじめまして、いまソケットのお勉強をしているのですが 期待した結果が得られません。ご指導のほど宜しくお願い致します。 WEBサーバー:AN HTTP Daemon ver1.38 1、DOSプロンプトから実行。 2、”localhostに接続できません。” 3、(ToT) アウゥー 以下からソースです・・・ use Socket; $hostname = 'localhost'; $port = getservbyname('http', 'tcp'); $proto = getprotobyname('tcp'); $iaddr = inet_aton($hostname) or die "$hostnameが見つかりません。\n"; $paddr = pack_sockaddr_in($port, $iaddr); $socket_addr = pack_sockaddr_in($port, $iaddr); socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "ソケットを生成できません。\n"; connect(SOCKET, $paddr) or die "$hostnameに接続できません。\n"; select(SOCKET); $|=1; select(STDOUT); print SOCKET "GET /index.html HTTP/1.0\r\n"; print SOCKET "\r\n"; while (<SOCKET>){ m/^\r\n$/ and last; } while (<SOCKET>){ print $_; } ここまでです・・・
裸のSocketは素人にはお勧めできない。 素直にLWPにしとけ。 どうしてもSocketを使いたいなら、せめてIO::Socketにしとけ。
>>547 私はそのままコピペで正常に動作しましたよ。
サーバーのPort番号は80ですよねぇ?力になれなくてゴメソ・・・
550 :
547 :02/03/14 12:14 ID:???
早速の回答ありがとうございます。
>>548 すんません、LWPってなんですかね?調べてみます。
IO::Socketのりてんってなんですかね?
>>549 もちろんサーバーのポートはデフォルトの80です!
ちなみにどんな内容がかえってくるのですか?
たびたび申し訳ないですがよろしくおねがいします。
551 :
549 :02/03/14 12:42 ID:???
>>550 index.htmlが無いので404が帰ってくるだけですが、次のような出力でした。
ちなみにperlはv5.6.1 built for cygwin-multiと
ActivePerl 5.005_03で実行しました。
<HTML><HEAD><TITLE>Error </TITLE></HEAD>
<BODY>
<H1>Error 404</H1>
Not found - file doesn't exist or is read protected
<HR><ADDRESS><a href="
http://www.st.rim.or.jp/~nakata/ ">AnWeb/1.36b</a></ADDRESS>
</BODY></HTML>
サブルーチンについてお答え下さった皆様ありがとうございました。 何となくわかりました・・・ 一応本は、オライリーのネズミの絵の奴とラクダの絵の奴を読みました。 一つのことを理解しようとするとき、いろんな要素で、ほかの知識が 必要になったりして、積み残したり理解できなかったりする知識があったりします。 本当にありがとでした
553 :
547 :02/03/14 13:09 ID:???
>>551 ActivePerlってことは環境はWinですよね?
うーん、私が接続できないってことはサーバー設定に問題があるんですかね?
ちなみにサーバーは何を使用されてますか?
Apacheがいいのかな?
>>553 551を見ればわかるけどAn HTTPDですよ。
そもそもWEBブラウザではlocalhostに接続できますか?
555 :
553 :02/03/14 13:37 ID:Ibnv+vbs
>>554 >>551 を見ればわかるけどAn HTTPDですよ
ほんとだ「AnWeb/1.36b」はずかしー。
>>そもそもWEBブラウザではlocalhostに接続できますか?
できますよー^^
手軽にローカルでテストするから使用するんですよ。
けど同じ環境でできないのならやっぱり設定ですかね?
551さんと同じ設定にして試したいので設定公開していただけないでしょうか?
設定は普通です。 HTTPサーバ機能 HTTPバージョン1.1 ポート80 ちなみに$paddrを↓こうしてもconnect失敗しますか? $paddr = pack_sockaddr_in(80, inet_aton('127.0.0.1'));
557 :
555 :02/03/14 15:15 ID:Ibnv+vbs
>>556 おおー!できましたー!ありがとうございます!
>>$paddr = pack_sockaddr_in($port, $iaddr);
↓
>>$paddr = pack_sockaddr_in(80, inet_aton('127.0.0.1'));
すなおにgetservbynameを使わずに’80’を指定すればいいのですね?
興味本位ですが、みなさんはSOKETを使ってどのよな処理をされるのですか?
死ね死ね 死ね死ね死ね死ね 死んじまえ きいろいぶためを やっつけろ 金で心を 汚してしまえ 死ね死ね死ね死ね 日本人は じゃまっけだ きいろい日本 ぶっつぶせ 死ね死ね死ね 死ね死ね死ね 世界の地図から 消しちまえ 死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね 死ね死ね死ね死ね 死んじまえ きいろいさるめを やっつけろ 夢も希望も うばってしまえ 死ね死ね死ね死ね 地球の外へ 放りだせ きいろい日本 ぶっつぶせ 死ね死ね死ね 死ね死ね死ね 世界の地図から 消しちまえ 死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね…… この歌を歌っている人を教えて下さい。 気になってPerlのスクリプトが書けません。
春だねぇ
561 :
nobodyさん :02/03/14 20:36 ID:83vwJ138
>>559 キャッツアイズとヤングフレッシュだよ。
しっかりコーディングしてね。
>559 どっかにフラッシュムービーあったね。
>>562 ほんとですか!
それが気になってPerlが書けません!
>>561 ありがとうございます。これで探せます。
死ね死ね 死ね死ね死ね死ね 死んじまえ きいろいぶためを やっつけろ 金で心を 汚してしまえ 死ね死ね死ね死ね 日本人は じゃまっけだ きいろい日本 ぶっつぶせ 死ね死ね死ね 死ね死ね死ね 世界の地図から 消しちまえ 死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね 死ね死ね死ね死ね 死んじまえ きいろいさるめを やっつけろ 夢も希望も うばってしまえ 死ね死ね死ね死ね 地球の外へ 放りだせ きいろい日本 ぶっつぶせ 死ね死ね死ね 死ね死ね死ね 世界の地図から 消しちまえ 死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね 死ね死ね死ね…… おれも歌って見ました…てへ
&func($a1, $a2); sub func { } などと書いてる奴は氏ね。 プロトタイプ使えプロトタイプ。
567 :
nobodyさん :02/03/15 01:13 ID:BRbcgxef
みんなどうやってパールを実行してんのですか。 ぼくは秀丸で打ち込んだら、いちいちコマンドプロンプトでperl ファイル名 と入力してやっているんですけど。 環境はwin xpです。
# ./hoge.pl
開発中は M-x perldb
>>567 せっかく秀丸つかってるのに・・・
最低でも次のマクロを用意しろ。
[実行]run "perl < con";
[構文チェック]run "perl -c < con";
↑共に1行だ。これでファイルに保存せずに、構文チェック、実行が出来るぞ。
>>567 closehidemaru findhidemaru(windir + "\\temp\\perlres.txt");
save;
run "\"c:\\program files\\perl\\bin\\perl.exe\" \"" + filename + "\" > " + windir + "\\temp\\perlres.txt";
openfile "/(0," + str(cyscreen - 300) + "," + str(cxscreen) + ",300) " + windir + "\\temp\\perlres.txt";
俺専用統合開発環境w
実行ファイル変更でjavaにも対応(と、言うか元々java用に開発)。
単なるPerl実行マクロでもみんな違うのな(w ちなみに俺のはこれ // ExecPerl.mac run "perl -w \"" + filename + "\" >con"; // EOM
573 :
nobodyさん :02/03/15 11:42 ID:pkh37ffW
open(IN,"aaa.dat");のあとに中身を表示するにのに、 --- @data=<IN>; foreach(@data){ print $_,"<BR>"; } --- と --- while(<IN>){ print $_,"<BR>"; } --- は、どっちが速いの? また、それぞれの利点・欠点は?
上はKENTのドキュソスクリプトかね。 上:メモリを食う。(やめとけ) 下:行数が多いと時間がかかるかも。(1,000,000行とかならんかぎり大丈夫) ファイルの表示だけなら下を使いなさい。
>下:行数が多いと時間がかかるかも 行数が多いと時間がかかるのは上も同じ。 実際に計ってみればわかるが、下の方が高速だしメモリも少なくてすむぞ。 上のほうがいい状況って何だ…? エディタとか?
全部読むなら普通read使うだろ
577 :
nobodyさん :02/03/15 14:03 ID:NtzdYptj
>>575 だね。なんかのルーチンで表示したあと配列保持して、spliceなんかで
編集する必要がある場合くらいしか思いつかない。
それにしても、@配列を逐次表示するのだって、
foreach使うよりwhile使うべきだと思うんだけどな。
read FILEHANDLE,SCALAR,LENGTH,OFFSET read FILEHANDLE,SCALAR,LENGTH Attempts to read LENGTH bytes of data into variable SCALAR from the specified FILEHANDLE. Returns the number of bytes actually read, 0 at end of file, or undef if there was an error. SCALAR will be grown or shrunk to the length actually read. If SCALAR needs growing, the new bytes will be zero bytes. An OFFSET may be specified to place the read data into some other place in SCALAR than the beginning. The call is actually implemented in terms of stdio's fread(3) call. To get a true read(2) system call, see sysread.
`read(FILEHANDLE,SCALAR,LENGTH,OFFSET)' `read(FILEHANDLE,SCALAR,LENGTH)' 指定した FILEHANDLE から、 LENGTH バイトのデータを読んで SCALAR に格納する。 実際に読み込んだバイト数、またはエラーがあれば undef を返す。 SCALAR は実際に読んだバイト数に合わせてサイズが変わる。 OFFSET を指定すると、読んだデータを文字列の先頭ではなく他の場所に格納する。 これは実際には、 stdio の fread コールを用いてインプリメントしている。 本当の read システムコールを使いたければ、sysread を参照せよ。
>>579-580 ていうか、こういうドキュメントって、なんの役にもたたんです・・・・
実際の使用例があればすんなり理解できるのに・・・・・
583 :
アホか :02/03/15 14:24 ID:???
$file = "/omaeha/ahoka"; open(AHO, $file) or die; read(AHO, $aho, -s $file); close(AHO);
584 :
582 :02/03/15 14:25 ID:???
a.txt: aiueo\n ----------------------- open(A, "a.dat"); read(A, $Dat); close(A); print "$Dat\n"; とかでいいのか?
>>581 重要なのは最初の2行なのよ。↓これでほとんど理解できるはず。
read FILEHANDLE,SCALAR,LENGTH,OFFSET
read FILEHANDLE,SCALAR,LENGTH
>>585 そんなこたないよ。
はじめたばっかしの人間、言語というもの自体になれていない人間で
それで理解できる人間なんてほとんどいない。
>583 使い方わかったサンクス。 でもそれを見て思うんだけど、ファイルの内容を一度変数に入れる形になってるみたいだけど、 while(<AHO>)よりもメモリ喰ったりしないの?
588 :
だから :02/03/15 14:33 ID:???
習うより慣れろって言葉がある。
仕組みを説明するより、実際に使われているソースをながめたりいじったりした方が、
どれだけ理解を深めるか。
名著と呼ばれるリファレンスブックには、必ず実例が付いている。
>>585 だけで理解出来るのであれば、そのような冗長な実例が付く本は
名著どころか、悪書とされているはず。
いやいや,変数に入れてる時点で食うよ。 readだと,どこからどこまでを読むかが指定できる。 だから $dat = <AHO> で全部読んで $dat から抽出するよりはマシ。
>>583 ありがと〜〜
俺も一つ質問です。
whileで読み込むと、\nごとにわかれた配列に入れることもできるワケなんですけど、
そういう用途だったら素直にwhileつかっとけよ、っていういみなんですよね?
で、一気に読み込んで表示するんだったらreadが便利だわって意味ですね?
大きいファイルはreadで読まないとダメだよね。 昔、数十MBのファイルを@lines = <FILE>;で読もうと思ったら、 すごく時間がかかった。readで読んだらすぐ読めた。
>589 なるほど。 それじゃあ何も考えずにファイルの内容全表示するだけなら while(<AHO>){ print; } でいいって事かな? readは確かに使いどころを見極めれば便利そうだ。 ありがとう。
593 :
582 :02/03/15 14:40 ID:???
>591 なるほど。readは ファイルデータをスカラに入れるときの性能がいいのか。 >592 うむ。それ推奨。 おれもPOST以外ではread使ったことんなかったんでいい勉強になった。 >579-580には素直に感謝。
594 :
585 :02/03/15 14:46 ID:???
>>588 >習うより慣れろって言葉がある。
>仕組みを説明するより、実際に使われているソースをながめたりいじったりした方が、
>どれだけ理解を深めるか。
そのつもりで、構文が大事だよって言いたかったんだが、余計にわかりにくかったな、俺。
ごめんよ。
>>594 勉強になったよ。ありがと〜〜
ほかのみなさんもありがと〜〜
>>594 そうだったのか、誤解だったかも知れない。
俺が言いたかったのは、
read FILEHANDLE,SCALAR,LENGTH,OFFSET
read FILEHANDLE,SCALAR,LENGTH
これだけ見て、たとえば、ファイルハンドルとは何か?スカラーとは?
オフセットとは実際どんな風に用いられているのか?
とか、そういうのがイメージできるような人は、その言語の上級者だって事なんだよな。
スカラーに$が付くってことすら、このステートメント見てイメージできない人って、
かなりいると思うんだよな。
俺自身、ほかの言語に行くとそういう混乱があったりする。
そういうことが言いたかっただけだったんだよな。
597 :
ファイル丸ごと読み込み :02/03/15 15:24 ID:j7EJ72ek
全文検索エンジン Namazu のインデックス作成プログラム
mkmnz での実装例。
http://www.namazu.org/ml/namazu-dev/msg00102.html # readfile:
#
# Reads a specified file and returns its content.
# Takes one argument which can be a file name or IO::File object.
#
sub readfile ($) {
my ($arg) = @_;
my $fh;
if (ref $arg) {
if ($arg =~ /^IO::File/) {
$fh = $arg;
} else {
warn "$arg: not an IO::File object!\n";
return "";
}
} else {
$fh = fopen_or_die($arg);
}
my $cont = "";
my $size = -s $fh;
if ($size > $MAX_SIZE) {
warn "$arg: too large!\n";
return "";
}
read $fh, $cont, $size;
return $cont;
}
>>597 つまりそういう場合はちゃんとサイズチェックをするべきだ、と。
599 :
nobodyさん :02/03/15 22:55 ID:Wm5JdTg+
@data=<IN>; やるなら、 push(@data,$_) while <IN>; だな
>>599 ここは「初心者コーナー」なんだからネタはネタと書こうぜ。メールアドレス欄でいいからさ。
>599 そ、それじゃKENTの意味無し処理と変わらんぞオイ・・・
602 :
nobodyさん :02/03/15 23:14 ID:Wm5JdTg+
>>601 @data=<IN>;
作業領域に<IN>が展開され、それを@dataにコピー
push(@data,$_) while <IN>;
$_に一行ずつコピーし、一行ずつ@dataに積んでく
意味が分からん奴は、KENT以下のDQN
603 :
ネタ :02/03/15 23:16 ID:???
undef $/; print <IN>; ちなみに、でかいファイル食わすとOut of Memoryでした(藁
>602 まわりくどいことするんだな。(藁
606 :
nobodyさん :02/03/15 23:28 ID:Wm5JdTg+
>>602 $a = 1000000;
と
for(1..1000000){ $a++; }
どっちのほうが君の好み?
608 :
nobodyさん :02/03/15 23:29 ID:Wm5JdTg+
しかし、ほんと初心者スレだな
609 :
601 :02/03/15 23:29 ID:???
>602 >606 ん?上だと一瞬メモリ容量が二倍になるのか?
>608 そうだよ。おまえみたいに上級者でも見下すヤツは正直場違い。
>>607 は本質を理解していない。
a[0] = IN[0];
a[1] = IN[1];
・
・
・
してから
result[0] = a[0];
・
・
・
と、
result[0] = IN[0]
・
・
・
の効率を話し合っているんだよ、今。
612 :
600 :02/03/15 23:36 ID:???
なるほどな。確かに後者の方が速い。(し、消費メモリも少ないのだろう) ファイルがでかくなると圧倒的とも言える差だよ。 その点は認識不足だった。コレは認めよう。 だが、普通は while(<IN>){ # ... } または read IN, $buffer, $size; を使った方がより良いのでそのテクは何らかの事情がない限り使わないがな。
613 :
607 :02/03/15 23:36 ID:???
>611 ネタだ。勘弁しろ。
>>612 認めてくれてありがとよ。
別にテクでもなんでもないんだが・・・(while倒置しただけだ)
どちらかというと、@data=<IN>;の方がトリッキーだしな。
ところで eval{} のに納得がいかない。 例えば,eval{ flock(xxxx); } だと flockが実行できそうな時だけ実行するの?? エラーが返ったらやっぱりなかったことにするの?? こんなちゃらんぽらんなもんなの?
>>615 「この中のエラーは無かった事にしてくれ」と頼んでおきながら、何か不満ですか?
それとも$@の存在を知らないとか?
オブジェクトも受け取れるのでC++ちっくな例外処理も出来るよ。
eval{
throw MyException('Hoge!');
}
if($@){
die $@->errstr;
}
617 :
615 :02/03/16 00:53 ID:???
とほほによると,どうやらとりあえず「eval{};」内を実行して エラーが返ると$@にエラーメッセージを入れて処理を続けるみたいだね。 ちゃらんぽらんだが便利なもんだな(笑 >616 その通り。$@知りませんでした。 あと「eval{};」みたいだね。
618 :
615 :02/03/16 00:55 ID:???
>616 2つeval{};を並べるときはそのつどundef $@;せなあかんの?
$@には直前のevalのエラーメッセージが入ります。 eval {flock STDIN,2}; print $@ . __LINE__; eval {print $@ . __LINE__}; print $@ . __LINE__;
会員制サイト IDとパスワードでログイン ってのはどうすれば良いですか? ご説明は邪魔くさいと思うので 参考になるサイトがあればお教え下さい。
>>620 IDとパスワード入力させてあってたら会員用のにリダイレクト。
623 :
620 :02/03/16 06:55 ID:???
>>621 回答ありがとう。
>>622 Basic認証で複数ID、複数パスって
可能なのでしょうか?
>>623 BASIC認証知らないなら・・・もとい、認証がなんたるかわかってないなら調べてくる・
625 :
615 :02/03/16 08:20 ID:???
>619 さんくす!参考になります! >621 "認証サイト"なら .httaccess 使うとヨシ。
認証ついでに、perlでNTLM認証できるモジュールなんかありませんか?
628 :
626 :02/03/16 12:44 ID:???
>>627 サンクス!
てか、FAQレベルでしたね・・・(;´Д`)
629 :
627 :02/03/16 13:32 ID:???
自分で調べるくせをつけような. ъ( ゚ー^)
鯖が生きてるか死んでるかを調べるには どんなコマンドをつかったらよいですか? 自鯖を調べるのにつかいます てか、自鯖立てるんだったらこれぐらいできるようにならんと・・・
ping
632 :
630 :02/03/16 22:09 ID:???
>>630 Perl初心者コーナーで聞くからには、
もちろんPerlを使っての調べ方と仮定しますが。
Net::Pingを使いましょう。
perl-5.7.3では標準添付のようです。
ただし、MSWin32だと、Errnoの関係から使えないようです。
>>630 =632
違うんだったら、``コマンド''という表現はいかがなものか。
> コマンド つまり、こういうことだろ。 $result = `ping hoge.org`;
>>636 でも ping だと IP reachable かどうかはわかっても
サーバが動いてるか止まってるかはわからんよ。
>>637 がたがた言わずにソケットでコネクション張れば良かろう。
>>637 取りあえずサーバの定義をはっきりしようや。
1台のマシンを指すのかサーバマシン上で走ってるネットワークデーモンを指すのか。
偉そうなことを言うのはそれからにしてくれ。
>>633 pingには特権が必要だから,普通`ping`
厨が出てこなかったら揚げ足取りばっかか… なんでこうなるかねぇ…
644 :
615 :02/03/17 01:39 ID:???
flockってwin2000で使えてるのですか?anhttpd&ActivePerlです。 eval{ flock(); }; die "errer!" if $@; でも出力はないのですが,ロックしてないクセにそのまま真返してそうで・・・
645 :
615 :02/03/17 01:51 ID:???
>619 遅くなったけどありがとう。つまり偽だと空が入るんだね。納得。
>>644 W2kは強制ロックしかかからないって聞いたことあるけど。
ホントのとこどうなってるかは知らん。
>>644 排他ロックを2重にかけて、ハングするか試してみればいいのでわ?
648 :
636 :02/03/17 03:35 ID:???
>>637 そういうときは、さくっとsynスキャンする。(嘘)
use IO::Socket;
print "ok\n" if (new IO::Socket::INET("www.kantei.go.jp:22"));
とかする。
ちうか"flock()"は"プロトタイプが違うぞゴルァ"てんで必ずコケる気がするんだが。
652 :
630 :02/03/17 21:54 ID:???
>>648 ありがとうございました
うまくいきました
653 :
615 :02/03/17 23:21 ID:???
>647>650 (((((||| ゚Д゚;;;)))))ガタガタガタガタ
654 :
648 :02/03/17 23:40 ID:???
>>653 過去にデッドロックで酷い目にあったSEさんの霊でしょう。
656 :
648 :02/03/17 23:44 ID:???
>>653 あ〜〜〜〜、デッドロックがなにか悪いことだと思ってるのね。
意図しないでデッドロックに陥るのはもちろん問題だけど、
テストとして意図的にデッドロックさせるのは、問題ないよ。
プロセス止めれば、解除されるので安心したまい。
657 :
nobodyさん :02/03/18 02:42 ID:3JM+vmYu
perlでディレクトリ以下の全ファイル容量って 調べられますか? もちろん対象ディレクトリ以下にディレクトリが複数あっても 底の底まで調べる・・・ど?
>657 できるよ。 ファイルサイズ取得とディレクトリ内ファイル一覧取得を組み合わせるとか, 適当なモジュール使うとか,他のプログラム使うとかで。
特定のHTMLファイルから4桁の数字だけ得れるプログラムを作ってます。 データを全部配列に入れてからforeachで回して、 4桁の数字を見つけたらその部分をsubstrで取り出す・・と考えているのですが 4桁の数字を見つける処理に手間取っています。 正規表現を上手く使って^(\d{4})$とやろうかなと思っているものの、どう使ったものか・・。 スマートな方法は何か無いものでしょうか。
>659 m//や//は,リストコンテキストで評価すると()内のリストを返すので, それを利用するとこんな感じ。 while (<DATA>) { my @tmp = /(\d{4})/g; push @ary,@tmp; } print "@ary"; __DATA__ asdf1234as d45ad6f54a32451234 af9842s
661 :
nobodyさん :02/03/18 11:37 ID:34CtYnSp
おはようございます。凄く初歩的だと思いますが Perl4ですけど、 @DATA[ $FORM{'ressno'} ]の値を$oldDATAに代入したいんですが つぎのコードは文法上間違ってますか? $oldDATA = @DATA[ $FORM{'ressno'} ]; printしてみると@DATA[ $FORM{'ressno'} ]には文字列が入ってるんですが $oldDATAは空っぽなんです。 本を見るとよさそうに見えるんですが・・・ ココで作業が止まっちゃってるんです。 おしえていただければありがたいのですが。
>660 ()なんて必要ないケド... ループ内でのmy宣言はしないほうがよいのでは? あと、その正規表現では5桁以上にもマッチしてしまうのでは? my @array= map{ (/(\D|\b)(\d{4})(\D|\b)/g)[$[+1] } <DATA>; print "@array\n"; __DATA__ asdf1234as d45ad6f54a32451234 af9842s
>>661 $oldDATA = $DATA[ $FORM{'ressno'} ];
じゃない?
664 :
661 :02/03/18 11:59 ID:???
>>663 ありがとうございます。
やってみましたけど残念ながら同じ結果でした。
もういちど、こんぽんのデータ値を確認しては?
666 :
615 :02/03/18 12:35 ID:???
>661 変数名が間違ってないかもう一度確かめて。 >662 なるほど。 ループ内でmy()はしないほうがいいのか。 ループの前に宣言するか,ループの後でundefするほうがいいのね。
667 :
たろう :02/03/18 12:37 ID:eHMudoVK
一回のリクエスト/レスポンスで クッキーをセットして取得することってできます・・・? 無理かなあ。 それかクッキーがオンかオフが判定できる方法ってありますかねえ。
>661 代入のタイミングが間違ってないか確認するべきかと。 printで文字列が出るという事は、@DATA[ $FORM{'ressno'} ]には文字列が入っているんだろう。 変数名の間違いという事もないと思われる。 しかし、 $oldDATA = @DATA[ $FORM{'ressno'} ]; この書き方では、@DATA[ $FORM{'ressno'} ]を変数でなく配列として認識してしまう為、その要素でなく要素数が返される。 だから>663の書き方のほうが正しい。 しかし、間違いの書き方でも、要素数の1が$oldDATAに入らないのはおかしい。 だとしたら考えられるのは変数の代入タイミングが間違っているか、変数のスコープの範囲外で判定しようとしてるかどっちかじゃないかと思われる。
>661 その価値のないソースを見せてみRO!
670 :
663 :02/03/18 13:18 ID:???
>>664 なら、@と$の間違いじゃない(配列に何か入ってる)ということで、
$oldDATA = join(undef,@DATA[ $FORM{'ressno'} ]);
とか。
>670 663をやってダメなのにオマエはアフォか?
672 :
661 :02/03/18 13:37 ID:???
>>668 ありがとうございます。その通りでした。
変数のスコープの範囲外です。
勉強不足で申し訳有りません。
他の皆さんも、ありがとうございました。
673 :
nobodyさん :02/03/18 14:36 ID:HCOk+r4Y
色々調べましたが、わからない事があるので質問します。 どうぞよろしくお願いします。 use関数についてなのですが、よく use lib '/mylib'; というのを目にしますが、これの第二引数'/mylib/';の意味がわかりません。 ご教授いただけないでしょうか? それともう一つ use I18N::Japanese; の”::”の意味は一体なんなのでしょうか?さっぱり意味不明です。 それでは失礼します。
674 :
nobodyさん :02/03/18 14:38 ID:HCOk+r4Y
>>673 補足させていただきます。
"::"がパッケージ変数へのアクセスに使われるというのは知っているのですが
use関数で使われる事の意味がわからないのです。
>>673 モジュールを読み込むディレクトリに'/mylib'を追加しまっせ!
'::'はディレクトリ構造を表します
I18N/Japanese.pm
676 :
670 :02/03/18 14:57 ID:???
677 :
673 :02/03/18 15:27 ID:HCOk+r4Y
>>675 お答えありがとうございます!
"::"の意味がよくわかりました。一ヶ月くらい悩んでただけに感動ですw
'/mylib'は、つまりlibモジュールだけの特別な引数であるという
解釈でよろしいのでしょうか?
679 :
675 :02/03/18 16:06 ID:???
>>673 useの後ろに付くlibはプラグマってやつね。
プラグマはperlの動作を変えるわけ。strictとかutf8とかあるから
自分で調べてみなさい。(プラグマは慣用的に小文字を使う。)
use lib LIST;は
BEGIN { unshift(@INC, LIST) }と同じね。
@INCにはモジュールなどを探すディレクトリが入ってるわけです。
680 :
673 :02/03/18 16:41 ID:BUM18lm5
>>678 はい。わかりました。ただ「駱駝本」が読めないのが難点ですがw
今度書泉で探してみますね。
>>679 よーーーーーーーーーーくわかりました!プラグマですか。正直そんな
単語は聞いた事も無かったですね。どうもありがとうございました。
@INCってinclude?
683 :
nobodyさん :02/03/18 17:31 ID:kNBmdvNL
すみません! 煮詰まってしまったので教えて下さい。 受け取るデータ(文字列:長さ制限なし)が1000文字以上だった場合、 文頭、文末それぞれ1文字を削除した状態に加工後、 REMOTE_ADDR,domain,加工後の文字列,文字列を受け取った時間 というようにCSV形式に成形して↑これをファイルに書込んでいます。 文字コードはEUC-JPで、文字列の加工にはsubstrを使っています。 文字列の加工まではうまくいくのですが、ファイルに書込まれたデータを 見ると、文字列の最後と時間の前のカンマが全角ひらがなとして1文字に なってしまいます。 この文字化けを解消する方法ありませんでしょうか? ファイルに書込んだ後比較用データとして、後でまた呼び出し カンマでsplitをかけると、ちゃんと時間と文字列に分割されては いるようなんですが・・・・
>>683 EUCなら簡単に出来ますが、1文字削除する行為が意味不明なので
教えてあげない。
ってゆうか、Perlメモ見れば分かるよね。
685 :
683 :02/03/18 17:48 ID:???
一応perlメモ見たんですが(^^; もう一回逝ってきます。 1文字削除は私にも…上からの命令なのです。
686 :
683 :02/03/18 17:52 ID:???
>>684 ありがとうございました。
見つかりました!
あ、即レスも感謝です。
perlメモ今見てきたらありました。
煮詰まってるとだめですね。。。
特定のサブルーチン(メソッド)が、継承されても、 常に親クラスのを呼び出すことって出来ますか? つまり、$obj->method とあった時に、 $objが子クラスのオブジェクトでmethodが子クラスにあった時でも 親クラスのmethodを呼び出すような物です。 それをSUPER::とかじゃなくて、クラス側(モジュール側?)で書きたいのです。 可能であれば、是非方法を御教授下さい。 宜しくお願い致します。
>>687 ?
オブジェクト指向的に妙じゃないか?
なぜSUPERじゃだめなのか小一時間質問したい。 それともあれか、"virtualではない"メソッドを定義したいってか?
690 :
687 :02/03/18 22:53 ID:???
例えばアクセスメソッドとかがオーバーライドされたら、あれだと思ったので、、 まぁ無理ならいいです。すいませんでした。
>>690 java でいう final てやつだね。perl5でできるのかなー。
どなたかわかるかたがいたら教えていただきたいのですが、 CSVデータをうまく分割するコードがあれば是非教えてください。 Perlメモにあるやり方は知っていますが、ほかにもっとうまいやり方が ありそうでなかなか思い浮かばないので途方に暮れています。 できればワンライナーかシュウォーツ変換のうまいコードがあればありがたいです。
>693 >できればワンライナーかシュウォーツ変換のうまいコードがあれば ってことですが...
>>694 1行で書いても何も得にならないよ。
そんなことで悩んでないでPerlメモにあるやつを、自分の使いやすいように
アレンジするか、適当なモジュールを導入した方がいいと思う。
但し、格納するデータが汎用でなくカンマやダブルクウォートを含まないのなら
特に加工が必要ないので簡単になるけどね。
バイナリを格納しないのなら、区切りを制御文字に・・・(CSVにならない)
で、結局君はどんな目的で「ワンライナーかシュウォーツ変換のうまいコード」
が必要なわけ?
>695 すぐに使うわけではなかったのでべつにできないならできないでいいけど、 たったいまこちらである程度いいものができたのでテストを繰り返して いるところです。 ただ、わたしのライブラリを増やしたかっただけ(自己満足)なのでこれで 5パターンになりつつあります。(テスト結果でバグがなければ) ただ、Perlメモにあるのはなんか好きになれないというだけのことです。 いま書いたのは、ワンライナーで2次元配列にセットするものでなんとなく 気に入っています。 ということで、この質問は自己解決のためもう忘れてください。
シュウォーツって初めて見る表現だな。Schwartzだから間違っちゃいないのか…。
698 :
nobodyさん :02/03/19 17:20 ID:FUNiZ5qx
Perlでoopってどうなの 皆してる? 流行のソースの記述きぼーん
>>698 LWPとか*::Parserとその派生クラスとかDBIとかいろいろあるけど、
最も身近なのはTieかな。
702 :
:02/03/19 23:05 ID:???
perl の eq 演算子(文字列比較)なんですが、比較したい変数の先頭文字が メタキャラクタの場合、比較がうまくいかないのですが、こういうものなのでしょうか? たとえば下記のような二つの文字列を代入した変数があります。 $ORIG="hello"; $TARGET="$$"; これを比較した場合、等しくなってほしくないのですが、eq で比較すると 等しいという結果になってしまいます。 ↓こんな感じ。 if ($ORIG eq $TARGET) { # この中に入ってしまう } else { #本当はこっちに来てほしい } 変数にメタキャラクタが入っている場合、どのように比較すればいいのでしょうか? あるいは、変数の最初の文字にメタキャラクタが入っている場合、 うまく比較できないのは perl の仕様なのでしょうか?
$ORIG = "hello"; $TARGET = '$$'; # シングルクオートで囲ってあるの。 で大丈夫だよー。
$$はスクリプトを実行しているPerlのプロセスIDだね。
先生!当方、Windows Meなのですが Perlを勉強したいと思い、perlの本を買いました。 (すぐわかるPerl、CGI&Perlポケットリファレンス) とりあえず、最初どうしたらよいのでしょうか? プログラミングを参考書に習って書いていくにしても どういう風に進めたらいいか分からなくて...
>>703-704 それでも等しくなるのはおかしい。
>>702 > うまく比較できないのは perl の仕様なのでしょうか?
なわけねぇだろ。
100%お前のミスだよ。
ifの前に print("$a $b\n") で変数の値を出力してみろ。
710 :
702 :02/03/20 00:12 ID:???
>>703 >>704 レスありがとうございます。
すみません、ちょっと私の書き方がまずかったです。
perl においてシングルクォートでくくると、変数を展開しない、エスケープが使えないというのは承知しているのですが、
今回のケースは、正確には下記のようなケースなのです。
前提:
1.テキストファイルにデータが書かれている
2.テキストファイルには、1行に複数の項目が書かれており、デリミタでくくられている
処理:
1.テキストファイルから1行読み込む
2.splitで分割する(分割した文字列が $TARGET に入る)
3.その文字列を eq で比較する
という感じなので、$TARGET には、普通の ascii 文字列が入ってくるかもしれないし、
$ とか ? で始まる文字列が入ってくるかもしれないのです。
↓コード例==============
$ORIG="hello";
open(DATA, "ファイル名")
while(<DATA>){
@hoge = split(/,/, $_);
$TARGET= @hoge[0];
if ($ORIG eq $TARGET) {
# $TARGET の中身の先頭文字が $ などの場合は
# この中に入ってしまう
}
:
==============
さぁどうしようかという感じなのですが....
どこかに、「eq では、先頭にメタキャラクタが入っていると比較できない(perlの仕様)」
見たいなことが明文化されていると、ある意味幸せなんだけど...
みなさんこういうときどうされてますか?
$TARGETをprintしれ。 そうすれば大体わかる。 っつーか全ソース晒せ。
>>710 709は読んだか?
大体メタキャラクタってなんだよ。"正規表現の"メタキャラクタならまだ解らんでもないが。
脳内定義は止めてくれ。
713 :
:02/03/20 00:21 ID:fhi6exvT
714 :
:02/03/20 00:22 ID:fhi6exvT
う〜む こういうことになるのかぁ
715 :
:02/03/20 00:23 ID:fhi6exvT
716 :
:02/03/20 00:24 ID:fhi6exvT
なるほど ではこれでは >>DQN
717 :
:02/03/20 00:25 ID:fhi6exvT
>>ID:fhi6exvT 消えろ
719 :
:02/03/20 00:27 ID:fhi6exvT
720 :
:02/03/20 00:28 ID:fhi6exvT
fhi6exvTよぉ。 たかが2ちゃんねるでもな、おもしれぇところで下らん事やると、 そこは面白くない場所になって寂れるんだよ。 下の方にいくらでも廃墟のスレッドがあるだろ? そこで、sageでこっそりやるのがテストってモンなんだよ。
>>710 > どこかに、「eq では、先頭にメタキャラクタが入っていると比較できない(perlの仕様)」
> 見たいなことが明文化されていると、ある意味幸せなんだけど...
僕は不幸だと思います。
723 :
:02/03/20 00:32 ID:fhi6exvT
>>721 あ、sageですればよかったすね
失礼しました。
ところでお聞きしたいんですが2ちゃんねるのレスの改行制限、文字数制限っていくつなんでしょうか?
いま2ちゃんねるのまねCGIつくってまして
荒らしは放置の方向でいこうYO
726 :
702 :02/03/20 01:06 ID:???
>>709 >>711 >>712 レスどうもありがとうございます。(709は 710 を書いた後に気がつきました。)
すみません、結論から言えば私のミスでした。みなさん申し訳ありません。
perl の eq は間違っていませんでした(printしまくってみて、気がついた。)
別のところが問題だったのですが、そこがわかりません。
ソースを貼り付けます。
1 #!/usr/bin/perl
2
3 $ORIG="hello";
4 print "$ORIG\n";
5
6 open (DATA, "dat.txt");
7 while (<DATA>) {
8 chomp;
9
10 @hoge = split(/,/, $_);
11 $AA = @hoge[0];
12 $BB = @hoge[1];
13
14 print "\n";
15 print '$AA>>'."$AA"."<<";
16 print '$BB>>'."$BB"."<<\n";
17
18 if( $ORIG eq $BB) {
19 print "pattern 1\n";
20 } elsif($ORIG =~ /$BB/ ) {
21 print "pattern 2\n";
22 } else {
23 print "pattern 3\n";
24 }
25 }
727 :
702 :02/03/20 01:06 ID:???
hoge.datの内容 ---------------- 11,bb 22,$$ ---------------- 実行結果 ---------------- $ ./hoge.pl hello $AA=11 $BB=bb pattern 3 $AA=22 $BB=$$ pattern 2 ---------------- 気になるのは、2行目のデータを読み込んだときに hello と $$ を比較していて、 部分一致になってしまっている点です。この二つを比較すると 不一致になる(だから pattern 3 が表示される) はずなのですが、どうして pattern 2 にいってしまうのでしょうか?
$BB = quotemeta($BB);
729 :
702 :02/03/20 01:42 ID:???
ああっ、直りました!! quotemeta(); をいれて print してみたところ、 $$ が \$\$ で表示されました。 この quotemeta(); で、今まで問題がなかったところに影響がないかどうか、 テストをしてみます。 (quotemeta されることにより、いままで正常に eq できていたところが eq できなくなると、それはそれで困るので) ついでに quotemeta() で、\ が挿入される文字についても調べて見ます。 (正規表現で特別な意味を持つ文字が対象? だからセミコロンとかは対象にならない?) 728 さん、どうもありがとうございました。
>>729 とりあえずquotemetaの「meta」が何を意味するのかを勉強しなさい。
どうもeqと正規表現の違いが分かっていないように見える。
ハッシュを多次元配列の構造体としてついかいたいんだけど $mesu{ 'manco' }{ 'size' } = '宇宙' ; 見たいな感じで、 合わせて、どっかいいポインター紹介してもらえないすか、
>>731 どうぞご自由に使ってください。
貴方の邪魔をする者はいません。
「どっかいいポインター」が何の事かは分かりませんが…。
無理だと思うからキーを<>で区切れば? あとここの人間下ネタ嫌いみたいだから・・・(笑
734 :
:02/03/20 10:34 ID:fhi6exvT
フォームメールで添付ファイルを送信するやりかたをおしえてください
>734 7bitにエンコード(←合ってる?)したりかなりめんどくさいからオススメしません。
>>735 逆に一回BASE64なりなんなりのライブラリを作ったら最強。
738 :
731 :02/03/20 13:19 ID:???
なんかそのままいけたくさい。 >$mesu{ 'manco' }{ 'size' } = '宇宙' ; >「どっかいいポインター」が何の事かは分かりませんが…。 URLって事で
739 :
:02/03/20 18:12 ID:fhi6exvT
>>734 ですが
mimew.plっての発見してできました。
740 :
735 :02/03/20 19:29 ID:???
>739 そらよかったやん。 語学のためにURLきぼんぬ。
少々板違いなんですが、Windows上でperlを動かすと コマンドプロンプトらしきものが立ち上がり そこでperlが動いてるのが見えるんですが これを見えないようにするやり方ありませんか? バックグラウンド(?)で動かしたいのです
コマンドプロンプトから実行せんとどこから実行すんのよ。 ひょっとしてApache か anhttpdのDOS画面のことか?
>>743 >anhttpdのDOS画面
むぅ?
ПП
(゜x゜ )○
>744 いや,おれのマシンではたまに出てくるのよ。4回に1回ぐらい。
>>741 perl.exeじゃなくてwperl.exeだったら大丈夫じゃない?
ActivePerlだったら入っているはず。
747 :
nobodyさん :02/03/20 21:22 ID:UA5ZBzLD
テキストデータファイルperlで扱うCGIを作る場合、 全部一気に配列に読み込んで扱いますか?? データソートとかする場合、いちいち読みに行くと遅いかなあと思うけど サーバに負担かかるだろうし、例えば5Mくらいのデータファイルだったら 普通みなさんどうしますか? それから、データが後々増えることを考慮する場合どうしますか?
>>747 前それでもめた。
while(<>)
がベストというのが有識者の意見。
>748 それは「表示するだけなら」じゃないのか?
750 :
出来の悪い子 :02/03/20 21:32 ID:K1AeGIQF
質問です メールをチェックする正規表現がうまく作動しないのですが どうしたら良いですか? } elsif ($email =~ /^[^@]+@[^.]+\..+/) { &Header('Insert Editor'); print "<H5> Emailが正しく入っていません<br>"; これだと素通りしてしまいます とりあえず下記のやり方でごまかしているのですが。 } elsif ($email eq "") { &Header('Insert Editor'); print "<H5> Emailを入力してください<br>"; これじゃチェックにならない(´・ω・`)ショボーン どう記述すれば良いでしょうか?
while(<xxx>){ push(@yyy); } ね。 その時散々煽ったおれも全部上に書き換えたよ。(笑 「^」使うとまぎらわしいね。「 !~ メールアドレスの書式」 にしてみろよ。 てきとーで書くけど $email !~ /\w\.-_@\w-_\.\w/ とか。
>751 てきとーに書きすぎた。 $Mail =~ /^[\w\-\.]+\@[\w\-]+\.[\w\-\.]+$/i でどう?
>>752 駄目でした。
うーん 頭冷やしてきます。
「$email !~ /^[\w\-\.]+\@[\w\-]+\.[\w\-\.]+$/i」にしてる?
>752==754 メールユーザID文字数は何文字でもいいの? . (ピリオド)が2つ続いてもマッチするのでは? 最後に . (ピリオド)がきてもマッチするのでは? i オプションの意味は?
>755 ならアンタが早く説明してやれよ。 どうせ初心者の相手する気なんてまったく無くて解答者に茶々入れるだけにここいるんだろけど。
>>747 1MB超えた辺りから、自前のエンジンより
DB_FileのBTREEとかXS拡張DBDを使うDBIが検索やソートは高速になってくるよ。
if($email !~ (?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")(?:\.(?:[^(\04 0)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*"))*@(?:[^(\0 40)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:\.(?:[^(\040)<>@,;:".\\\ [\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*){ &err("mailerrer"); }
>756 生半可な知識だったら書かないほうがいいということを言いたかっただけ。 できもしないのに嘘をはずかしげもなく語るほうがよっぽど迷惑なのでは?
>>759 じゃあおまえが絶対な解答で答えてあげてくださいよ。
>>759 自分が出来ないのに人を非難するのは筋違いかと。
>759 生半可な知識でも書いてみるのはいいことだよ。 そこからより効率のいい正しい方法の話し合いがされて、間違いを書いた方も正しいやり方を覚えられる。 初心者は自分の知りたかった事が議論によって導き出され、より理解力が深まる。 答えだけ出されるよりよっぽど勉強になるよ。
ドットが2つ続くかどうかなんてチェックしてたら とても簡潔なコードにはならんよ。 それならモジュール使って送信テストまでするよ。
764 :
nobodyさん :02/03/20 23:41 ID:UA5ZBzLD
>>748 ,
>>749 ,
>>757 遅れましたが、ありがとう!
なんかDBの知識もなく、また頼まれ仕事で納期もないので
取りあえずタブ区切りテキスト+自前エンジンでやるしかないんですが、
やはり動作速度を犠牲にしたほうがいいのかな。
サーバに負担かけたら怒られますかね。ド素人ですまんです。
>763 >ドットが2つ続くかどうかなんてチェックしてたら >とても簡潔なコードにはならんよ。 なぜそういいきれる? その根拠はなんなの? やらないうちから決め付けるのはやめたほうがいいと思う。
メアドチェックならperlメモにあったよね?
ていうか
>>758 にある。。
>>764 5MBをいちいちメモリ上に展開するのはやめたほうがいいと思われ。
>nobodyおっさん 場に出てきたモノにカウンターかます以外のこともやってみれっての。
>>764 2-3年前のサーバと、今のサーバでは、CPUやメモリやHDDの回転数なんて言った
処理系のスペックは比較にならないくらいあがってるよ。
だから無茶な処理して良いと言うことではないけど、ね。
問題は、先方がコーディングする人間に支払っているコストと、与えている開発日数、
そして、要求している仕様ですべて決まると思うよ。
>768 761に非難するのは筋違い とありますが、わたしがはじめに書いたいくつかの 疑問点は非難しようというのではなくて助言のつもりで書いただけです。 この助言を書いた途端にどなたかがいきなりつっかかってきた上に非難される のはこちらも困ります。 760に絶対な解答をとありますが、メールアドレスには[]付きのIPアドレス を含むなどの予想外の形態のもの等もありますので不可能といっていいでしょう。 「Perlメモ」にも非常に長い正規表現が書かれていますが、これも絶対ではない と書かれています。特殊な形態はマッチさせない条件でなら簡単に書けると思う のですが、絶対な解答ということなので遠慮しておきます。
>770 初心者スレではそういう説明が重要だよ。 それがわからない人が多いんだから。 なにかを否定する場合はきちんと説明もつけましょうね。 そうすればみんながハッピーになれる。
772 :
nobodyさん :02/03/21 01:51 ID:KirJ6q/U
>>767 やはりそうですよね。過去レス随時削除するような掲示板くらいしか
作ったことなかったもので、そんなでかいのは検討も付かなかったのです。
>>769 おっしゃる通りです。俺みたいな素人に安く頼むんだから我慢しろという
姿勢で行きます。ただ、コストはそうですが、開発日数の方はちゃんとした
DBシステム覚えた方が早くて楽チンのような予感もするので、次の仕事が入るまでに
覚えることにします。
ありがとうございました。
>>750 正規表現はそれで合ってるよ。(意図したいことは分かる。)
漏れも、簡単なチェックならそう書く。
んで、
>>751 の指摘の要点は
} elsif ($email =~ /^[^@]+@[^.]+\..+/) {
じゃなくて、
} elsif ($email =~ /^[^@]+@[^.]+\..+/) {
ってしろってことだけど、これでダメだったの?
print "<H5>[$email]は不正なメールアドレスです</H5><br>";
に書き換えてみて、うまく行かない時の表示キボン。
774 :
773 :02/03/21 02:17 ID:???
>>773 ミスった。
「} elsif ($email =~ /^[^@]+@[^.]+\..+/) {
じゃなくて
} elsif ($email !~ /^[^@]+@[^.]+\..+/) {
ってしろってことだけど、これでダメだったの? 」
でした。
>774 また責められそうですが、助言として書いておきます。 762さんも「議論によって導き出され、より理解力が深まる」という認識ですので。 ユーザIDにドットを含んでいてもマッチします。 アットマークの後にアットマークがきてもマッチします。 末尾は何にでもマッチします。
776 :
774 :02/03/21 03:43 ID:???
>>775 もちろん承知。助言さんきゅ。
ということで、いい加減な文字をemail欄に書いて書き込もうとする奴を
排除する目的じゃなくて、正しいメールアドレスしか受けつけないように
したいという目的の場合は、正規表現を改良するのもいいかも
>>750
メールアドレスのパターンにマッチさせるには、まずメールアドレスの基本形式 を知ることからはじめたほうがいいと思う。(特殊形式は除く前提で) ということで、まずはメールアドレスのかんたんな構成を書いておきます。 [メールユーザID]@[メールサーバドメイン名]
778 :
774 :02/03/21 04:15 ID:???
[メールユーザID] についてはほとんどのメールサーバがUnix系ということ を考えると、だいたい文字数は4〜10が妥当な線ダロウ。 文字の種類としてはなんといっても[@.]の2種類は含まないということで [^@.]が考えられる訳だが、普通は[a-zA-Z0-9_-]あたりが使われる場合がほとんど ということからエスケープシーケンスを使って表すと[\w-]と考えられる。
[メールユーザID] の文字数の点で補足ダガ、以前に3文字(3バイト)というの を見たことあるから余裕をもって3〜15と考えるのもいいネー。 つまり前段から /^[\w-]{3,15}@ の部分までは正規表現は決まったことになる。
っと、チョットごたくを並べ過ぎたようなので今日はここで終わりとしよう。 762さんが言うようにいきなり最後まで書いてしまうのはチョットですぎた 行為というものです。考える余地を与えることも勉強になるものです。 それはそうとして、「正規表現道場」っていつのまにかなくなったのかナ? あればそっちにメアドの正規表現ぐらいのってるだろうに。閑古鳥が鳴いてた ようだから無理もないかー。
>782 電球
WindowsでPerlを使う方法を、猿でも厨房でも わかりやすく記載しているサイトってありますか? ActivePerl入れてもなんか上手くいかなくて...
785 :
親切紳 :02/03/21 07:18 ID:???
>>784 インストールはできたんだね。
じゃあ、コマンドプロンプト開いて
perl test.pl
とか入力すればtest.plが実行されるよ。
787 :
nobodyさん :02/03/21 07:46 ID:p3ZJIC7X
>770 >この助言を書いた途端にどなたかがいきなりつっかかってきた上に非難されるのはこちらも困ります。 >生半可な知識だったら書かないほうがいいということを言いたかっただけ。 >できもしないのに嘘をはずかしげもなく語るほうがよっぽど迷惑なのでは? がホンネなんだろ?(藁
>779 [\w-]は[\w\-]じゃなくていいの?
あっ ohzaki氏の「Perlメモ メールアドレスの正規表現」にバグ発見。 local-part = dot-atom / quoted-string / obs-local-part だから $word = qq<(?:$atom|$quoted_str)>; $local_part = qq<$word$X(?:$Period$X$word$X)*>; では駄目。
すごい初心者で悪いんですけど、 PerlってCGI以外で何かに使います?
ハッシュアクセスでさ、 $_{manco} と、するべきか、 $_{'manco'} どっちだ?
>>792 MakeFile とか、シェルスクリプト書くの面倒なときとか、
テキスト処理とか。
>>792 元々レポート作成言語。
そのため文字列操作が異様に発展。
CGI使いからはマイナーだがレポートのテンプレートを指定する機能も。
と、言うか、
Perlってレポート作成以外で何に使います?
CGIとかです。
が正しい。
>792 自分がよく作るのはなんちゃらコンバータとかかなぁ。 HTMLから,ある規則に従ってリンク抜き出したりとか。 >793 どっちも変わらないみたいなので,私は短い前者を使う。
>792 レポート処理とか。 おれはチャットログの整理とかもしてる。 複数のログから特定のキーワードを探したりするときも手軽で便利。
>793 2バイト文字列指定してる場合は囲んだほうがいいよ。多分ね。
>799 自己レス。 推測だが変数名に使えない文字の場合は囲まないとエラーが出る。 ただし変数名に使える文字なら不要。 例。$ENV{HTTP_HOST} と$Rom{"坂田@アホ"}。
>>793 >>800 見たいなエラーがでる場合ってのが存在するから囲め。
統一性が無いとウザイから。
こういう事したい。 sub manco { print "sage\n" ; } $a = manco ; $a() ; なんか解決ないすかね?
>802 意味ねー(w おとなしく&manco;しろ。
テーブルジャンプしたいの、 $a[ i ]() ; こんな感じで
>802 リファレンス使ってこんな感じかな $a = \&manco ; &$a() ;
>802 $a = "print"; &{$a}; sub print { print qq(<hr>ok!<hr>); } とりあえずこれで動いた。 >803 if elsif文を並べてサブルーチンに飛ばすような時とかに便利かも。
>>806 if elsifを並べるのはあんまり良くないでしょ。
ハッシュに入れたサブルーチン名(もしくはリファレンス)
をコールするってことでどうかね>適用例
808 :
792 :02/03/21 14:53 ID:???
>>808 昔は、MS-DOSからやってた。
最近はUNIXからが便利なので、そっちでやってる。
$a[ 0 ] = \&manco ; $b = $a[ 0 ] ; &$b() ; これ、いいね、 でも、 $a[ 0 ] = \&manco ; &$a[ 0 ]() ; これだと駄目ね
>>803 &manco;
なんて、レスキューやKENTみたいなことやってんじゃねーよ。
それじゃ、プロトタイプのチェックしねーだろ。
>>806 man perlref
man perldub
組み込み関数とユーザサブルーチンの区別つけれ。
ユーザ定義ハンドラを許すようなオブジェクトなら必須。
>807 そうだろね。LUTみたいな考え方だね。 >808 CGI以外の用途に使うなら「Perlを始めよう」というソフトがおすすめ。 ソースを書いて直接実行したりできる。
813 :
803 :02/03/21 15:05 ID:???
>811 詳しく解説きぼん。
814 :
792 :02/03/21 15:07 ID:???
>>809 >>812 ありがとうございました。
参考になりました。
このへんの住人かなりスキルが高いですね。
>814 皮肉にしか聞こえん・・・
>>803 どこでエラーになるか確かめれ。
固いコードを書きたいんだったらプロトタイプ使え。
sub manco($)
{
print "$_[0]\n";
}
&manco();
manco();
818 :
nobodyさん :02/03/21 16:35 ID:7Dyo1H3n
htmlについての質問なのですが、 フレームで上と下に分割して下のフレーム内にdocファイルへのリンクを張ったのですが、 docファイルへのリンクをクリックするとフリーズして強制終了してしまうのですが どうすれば正しく表示できるのでしょうか。 ちなみにOSはxp proです。
>818 Web製作板かWin板で聞くべし。 Perlと関係ないじゃない。
正規表現についてききたいんですがここじゃだめですか?
「
>>1 」と「
>>1-100 」を両方かけるやりかたがしりたいんですが
821 :
818 :02/03/21 16:43 ID:7Dyo1H3n
すいませんはやとちりました。
>>(\d\-)*(\d+)
>>(\d\+-)?(\d+)
>>(\d+\-)?(\d+)
826 :
nobodyさん :02/03/21 18:10 ID:TYcdRNHS
質問っす。 cgiで、同じディレクトリにある他のファイルのパーミッションを変更したいんだけど、 chmodを使ってもなぜか変更できないです。 chmod 0777,"./abc.dat"; こんな風にしてるんですが、何かやり方がいけないの?
>>810 今更ですまんが。
$a[ 0 ] = \&manco ;
$a[ 0 ]->() ;
で行くでしょ。
あのさ、 $manco->{'kuri'}=1; $manco->{'torisu'}=1; print Dumper($manco); ってすると、 $VAR1 = { 'kuri' => 1, 'torisu' => 1 }; こんな感じで表示されんだけど、 $VAR1ってなるんだけど、 これに、名前付けられないの?
>824
こう書いたほうが尚よいダロウ!
$_= '
>>1-100 ';
print />>(\d+)(-\d+)?/ ? $2 ? "$1$2" : $1 : "unmatched";
>>830 何が不満?第一引数がそうだって親切に・・・。
>>830 use Data::Dumper;
%hash = ('A' => 'apple', 'B' => 'buffalo');
$d = Data::Dumper->new([\%hash], ['hash']);
print $d->Dump;
834 :
830 :02/03/21 22:27 ID:???
>>832 あんな、
use XML::Simple;
$manco->{'kuri'}=1;
$manco->{'torisu'}=1;
print XMLout( $manco ) ;
これ動かすと
<opt kuri="1" torisu="1" />
って表示されんだけど、ノード名前が、optになっちゃうのね、
でな、無名のハッシュだっけ?に名前付けたら、変えられんじゃね
っと思ったンヨ
はずしとりすかね?
835 :
830 :02/03/21 22:33 ID:???
>>833 ども、参考なたよ、
でも、834で書いたのは、おもっきり外してたぁ〜
836 :
830 :02/03/21 22:43 ID:???
わがったわがった。 こうだった。 my $xs = new XML::Simple( rootname => 'mesu' ) ; $manco->{'kuri'}=1; $manco->{'torisu'}=1; print Dumper($manco); print $xs->XMLout($manco); $VAR1 = { 'kuri' => 1, 'torisu' => 1 }; <mesu kuri="1" torisu="1" />
837 :
830 :02/03/21 22:48 ID:???
また、質問なんだけど、 漏れさ、PerlのCGIって、 WEB FORUMっていう掲示板をいじる事から 始まったんだけどね、 なんか、記述スタイルが古いつ〜かさ、 もっといま風な、オブジェクト指向っぽくやりたいな、 なんて思ってるんだけど、 これは参考になるぞ!、っていうソースどっかに 転がってないすかね、よろすく
このスレの上のほうで$| = 1;をメシ食いながらウンコと表現したものだが いっておくが,おれは >830とは別人だぞ・・・
リンク集を作ってるんですが、サイト名やURLに加えて、 (TOPページの)最新更新日を表示させたいと思っています。 リンク先のページの最新更新日を取得するような方法はあるのでしょうか。 ご指南の程、よろしくお願いします。 なにぶんPerlは始めたばかりなので、ムズかしい処理は理解できないかも しれないので、なにをどこらへんを勉強すれば理解できるようになるのか 教えていただけるとありがたいです。
ここで、ソースを記述するときは、変数とか、関数に sub mancoとか、 $unco もしくは、それに類似する単語で 書かないと、誰も答えてくれねぇ〜ぞ、ゴウラァ!!!
>>839 おまえさ、北海道しゅっしんだろ、な、図星だろ、
わかんだ、おれ。
>839
LWPモジュールを使うと簡単に更新時刻を取得できる。
使い方は
>>4 あたり。
844 :
839 :02/03/21 23:15 ID:???
>>842 生まれも育ちも兵庫です。北海道・・・・はて・・・
>>843 ありがとうございます。
さっそく見てみます。
845 :
839 :02/03/21 23:25 ID:???
>>843 「河馬屋二千年堂's Page」さんを見てみましたが、すみません。
まったく理解できませんでした(涙
「モジュールとはなにか、どうやって使うのか」から勉強し直します。
せっかく教えていただいたのに、すみませんでした。
>>839 アンテナ系のスクリプトを改造してみたら?
基本的な対象は日記だけど、別に普通のリンク集に使ってもいいだろ。
「アンテナ なつみかん」とかで検索してみ。
>「モジュールとはなにか、どうやって使うのか」から勉強し直します。
とか言うレベルだと改造は厳しいと思うが。
>>846 べつにモジュール万能主義でもないだろうよ。
848 :
839 :02/03/21 23:38 ID:???
>>846 やっぱりレベル低いのに、高望みしすぎなんですかね・・・。
とりあえずダウンロードしてソースをじっくり見てみます。
ありがとうございました。
>>847 >べつにモジュール万能主義でもないだろうよ。
846さんはモジュールを勧めているわけではなく、モジュールというものを
知らないレベルの人には、改造は難しいかもしれない、
という懸念をの述べただけじゃないかな。煽りネタだったらスマソ。
>>839 perlは、本読まないと理解は難しいよ。
他の言語と違って、他人のperlのソース読むのは、
時間の無駄のような気がする。(解説がついてるソース
とかならいいけど)
851 :
1234 :02/03/21 23:52 ID:di2RpoJq
>>831 ありがとうございます。
ところでこれではだめだということに気づきました。
>>1 >>1-
>>1-20 これ全部にヒットしないといけなかったんです。
書いてて気づきました。
すみませんもう一度おしえてもらえませんか?
>>851 >>831 を元に応用できないってことは、perlの正規表現を勉強してないって
ことだと思うんだけど、どうなの?
853 :
1234 :02/03/21 23:54 ID:di2RpoJq
854 :
1234 :02/03/21 23:56 ID:di2RpoJq
(\d+)(-)?(\d+)? こうっすね
>>851 こんなんじゃダメ?
>>(\d+)(-\d*)?
857 :
nobodyさん :02/03/21 23:58 ID:CC60PDt4
Perlで、C++の"ifstream f()"のようにファイルを読みこむ方法を教えてください。
>851
ヒットするんじゃないの?
>>1- は
>>1 と同じとみなすんじゃダメかい?
>>857 ファイルをオープンしたあと、ファイルハンドル使いなさい。
ありがと。 ファイルハンドルで索引を見たら書いてあった。
861 :
1234 :02/03/22 01:33 ID:PNDxe/pL
862 :
839 :02/03/22 02:05 ID:???
いろいろ調べてみました。
テストではうまく動いてる気もするんですが、これでよろしいのでしょうか。
use LWP::Simple;
($content_type, $document_length, $modified_time, $expires, $server) = head "
http://www.aaa.ne.jp/test.html ";
($sec, $min, $hour, $day, $mon, $year) = localtime($modified_time);
$year += 1900;
$mon ++;
print "$year/$mon/$day/$hour";
>>839 それでおけ。
問題はHEADでちゃんと更新時刻を取得できないサイトが多いこと。
864 :
839 :02/03/22 03:18 ID:???
>>863 はい、その通りでした・・・・。
更新時刻が取得できないサイトがいくつかありました。
私のLWPの使い方が間違ってるのでしょうか。
それとももっと良い方法があるのでしょうか。今一度、探してみます。
またヒントを与えてもらえれば幸いです。
>>864 (貴方のマシンがWinなら)WWCとかWWDとかのメジャーな更新チェッカ落として
みると参考になると思うよ。ヘッダも表示されるし。
>861
こんな感じかい?
$_= '
>>1-100 ';
if ( />>(\d+)((-)(\d*))?/ ){
if ( $4 ){ print "$1$2"; } # >>n-n
elsif ( $3 ){ print "$1$3"; } # >>n-
else { print "$1" ; } # >>n
}
.htaccessや.htpasswdファイルって直接url指定されても 見られないようにする方法ってどうするんですか?
>>869 相手サーバの問題。
更新時刻がとれなかったら長さや内容を前回チェックのと比べるとか。
いくつかのサーバは更新時刻いいかげんに返すので
そのあたりは試行錯誤で。
>867
それらのファイルにアクセス制限をかける。
近ごろの apacheは標準でそういう設定になってる。
869 :
867 :02/03/22 08:46 ID:???
>>868 そーなんですか!
ちなみに私はan httpd使用してるんですけど
これでの方法はないですかね?
なんだか、質問の仕方が悪くて皆さんに迷惑をかけてしまったようです
申し訳ありません m(_ _)m
とりあえず実験してみて
>>774 さんのやり方で大丈夫でした
= じゃなくて! ってことですね
もっと頭を解して考えるようにします。
ありがとうございました。
>>866 なぜprintするのかわからないのだけれど,それは効率悪いんじゃないか?
↓こうできるよ.
/>>(\d+(?:-\d*)?)/ and print $1;
>871 print してるのは、だた結果が正しいかを確認するため。 確かに、後読みだとコンパクトにまとめて書けるのでよりいいと思います。 ただし、やりたいコーディングが >>n >>n- >>n-n の3パターンへのリンクを張るだけならいいのですが、もしかしたら >n- の場合など、nが1なら100までとかに制御する余地を残す意味で敢えて わけているだけです。
補足: 1つにまとめるなら以下のようによりコンパクトにも書けます。 />>(\d+(-\d*)?)/
874 :
縞栗鼠(シマリス)の親方 :02/03/22 10:54 ID:pJ6rZ2it
吉祥寺にある大検・大学受験予備校の中央高等学院
ここは、完全に狂ってる。
授業料は一年分一括前払いなので、
金が入れば、生徒は要らない
金を振り込んだら、何とかその生徒を辞めさせようと
講師どもが、あの手、この手でイヤガラセをしてきますね。
セクハラはもちろん、脈絡の無い罵倒は日常茶飯だね。
酒臭い講師もいるし・・・ 人生の最果て中央高等学院
学歴詐称、経歴詐称、合格実績詐称、デタラメ授業、
http://www.chuo-school.ac/ http://chs-f.com/index.html 中央高等学院福岡校
司法浪人の田中校長は ↑ また司法試験に落ちましたが
HP上では下らない見栄を張っています
875 :
839 :02/03/22 12:08 ID:???
>>869 長さっていうのはファイルサイズのことでしょうか。
そんなこともできるんですか・・・。
LWPモジュールについてもう少し勉強してみます。
>873 おっさんおっさん、いくらコンパクトでも効率的には>871のほうが上だぞ。 つーか(?:regexp)はNon-capturing groupingsだろ。何でここで後読みなんだよ(w 学生はperldocでも読んで勉強しとけ。
>>875 長さってのは、
use LWP::Simple;
$content = get ("
http://www.2ch.net/ ");
$length = length($content);
と言うことだと思う。868じゃないから知らんけど。
878 :
nobodyさん :02/03/22 17:23 ID:2hKQObXw
質問です。 いま、仕事で掲示板の修正をやってるんですが、 特殊文字を削れってんで、メッセージに対して、 $value =~ s/&/&/g; $value =~ s/\"/"/g; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/\|/¦/g; $value =~ s/\[/[/g; $value =~ s/\]/]/g; $value =~ s/\\/¥/g; みたいなことをやってます。 そしたら、 「申し込み」が「・yen;し込み」みたいな感じで思いっきり化けちゃいます。 どうすれば文字化けしないで、特殊文字の変換ができますか?
879 :
nobodyさん :02/03/22 17:26 ID:2hKQObXw
変換されてしまった。 $value =~ s/&/&amp;/g; $value =~ s/\"/&quot;/g; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\|/&#166;/g; $value =~ s/\[/&#91;/g; $value =~ s/\]/&#93;/g; $value =~ s/\\/&yen;/g; こっちが正しいです。 ちなみに「&」は実際は半角文字です。
意味のない変換の多いこと・・・ Shift-JISだったらモロ化けるね。 上の4つだけで十分。 どうしても変換したいならEUCにすれば?
881 :
nobodyさん :02/03/22 17:35 ID:2hKQObXw
>>880 え?意味ないんですか?
某雑誌にこれらの特殊文字は削るか置換しろ!
って書いてあるんですよ。
で、その通りにしてほしいってことで、修正依頼が来たんですよ・・・。
882 :
868 :02/03/22 17:36 ID:???
>>875 ごめんレス番間違えてたね。
>>862 で $document_lengthに長さが入ってるみたいなので
それも見たらどうかってこと。
>>879 変換結果に「yen」って出てるので分かるかと思うけど、
「申」のSJIS2バイト目が「\」なのです。
なので、2バイト文字をうまく扱ってくれる jperl を使うってのが、
とりあえずよいのではないかと。
Shift-JISの2バイト目に\x40-\x7Eも使われているので、 (もしShift-JISだったら)漢字の一部が変換されてることになる。 わかりますか?
そんなことより制御文字削除してないんちゃうんかと・・・(以下略)
886 :
nobodyさん :02/03/22 17:42 ID:2hKQObXw
>>883 環境を変えるのはきびしいです。
>>884 意味はわかります。
それでは、文字コードがSJISならばどうしようもないってことですかね?
880さんが言ってるみたいに、とりあえずEUCに変換しとけってことですか?
>>885 制御文字?
0x0〜0x19 ぐらいのやつ?
特殊文字の変換とかって、どのくらいのことやるのが普通なんですか?
ここ見ろ! ってとことかあります?
IBM的なバカ変換だな・・・ボソ
889 :
878 :02/03/22 17:53 ID:???
とりあえず、文字コードをEUCに変換して処理してみます。
>>881 某雑誌の名前教えてください。なんかその雑誌読んでみたい。
891 :
878 :02/03/22 18:03 ID:???
nikkei オープンシステム 2001/12 P118 からの特集です。
すいません、掲示板などを作る時、ユーザに変数の内容を 決めて貰い後で参照しますが、その際「定義されていない or 空か無効」と「正常」を区別するスマートなやり方ありませんか? # ユーザの設定 package user; $file = 'bbs.cgi'; # プログラム package main; my $file = (defined($user::file) && $user::file) ? $user::file : 'bbs.cgi'; これだと何度も $user::file をタイプしないといけないので なんか無駄に文が長くなってしまうような気がします。 なんとなく perl -w で文句を言われるのも嫌なので my $file = $user::file || 'bbs.cgi'; のような記述も避けたいのですが・・・・。
>>881 話し終わってしまったみたいですが、エスケープする文字は
キチンと用途別に考えた方が良い場合もあると思いますよ。
そのまま or HTML として出力する場合や、コマンドの引数 or
ファイル名として使用する場合などです。
釈迦に説法ならすんまそん。
>893 何度もタイプするのが嫌なのと perl -w で文句言われるのが嫌なのは相反する ことなのでどちらかにせざるを得ないのでは? それとも以下のようにしてみる?恐らくよけい嫌だとは思うが・・・・ my $user_file='user::file'; my $file = $$user_file || 'bbs.cgi';
896 :
895 :02/03/22 22:45 ID:???
もう1つあった。 変数 $file をいっそのこと使わないで my $user_file= 'user::file'; $$user_file ||= 'bbs.cgi';
>>893 ユーザ定義の変数をインポートする部分を
no warnings;
my $file = (defined($user::file) && $user::file)
? $user::file : 'bbs.cgi';
....
use warnings;
面倒は嫌いだ。(w
898 :
839 :02/03/22 23:15 ID:???
>>877 >use LWP::Simple;
>$content = get ("
http://www.2ch.net/ ");
>$length = length($content);
では全く応答なしです。
>>882 $document_lengthは空でした。ナニも入っていませんでした。
私がやろうとしていることは不可能なことなんですかね・・・。
>>898 2ちゃんのサーバはagentみて蹴っているかも知れない。
900 :
839 :02/03/22 23:20 ID:???
>>899 いえ、実際はジオの友人のアドレスを入れてました。
失礼しました。
>>900 ジオもagent見て蹴っているかも知れない。
わかるだろ?
Agentていうか、REQUEST-HEADERね。正式名称知らないけど。 画像置き場とかに使ってくれるな機能があったんじゃない?>ジオ その関係とかはどうなの?
903 :
839 :02/03/22 23:40 ID:???
>>901 >>902 agent・・・REQUEST-HEADER・・・・すみません、どちらもわかりません。
ただ、901さんの言い方からすると、なにか解決法があるということですね。
探してみます! ヒントありがとうございます!
904 :
ヤクザ :02/03/22 23:51 ID:???
>>895-897 ひぃぃぃ・・・・すいませんでした。面倒でも普通に書きます (笑い
いや、自分は本を買わず web で勉強していますので、
入門サイトには中々紹介されない $file |= 'hoge'; みたいな
独特の方法なんかあるのかなぁ・・・とか思ったのですよ。
記述&凡ミスを避ける為の出力に振り回されるのも情けないですね。
飽く迄デバッグ用のメッセージと割り切って -w と付き合う事にします。
有難う御座いますた。
905 :
839 :02/03/23 01:02 ID:???
use LWP::UserAgent から入ればいいんでしょうか とりあえずなんとか上辺だけでもそれっぽくなるように いろいろ探してます。 もし間違ってたら、申し訳ありませんが、教えてください。 別のソレっぽいのを探しに行きますから。
906 :
IKeJI :02/03/23 05:56 ID:5i8LX5eB
質問。 Perlで、$aに'ー'という文字を含むSJIS文字列が入っているときに、 $a =~ /$b/ という文を実行すると落ちるのですがなぜでしょう?
>906 エラーメッセージとかは無いの? あと環境も書いて。
>>906 $bに'ー'が入っている場合だよね?
SJISの2byte文字の2バイト目は'@'から'~'まで使われてしまうので、
'['などが問題を起こしがち。
応急処置としては\Qと\Eで囲むことかな。(詳しくはPerlメモを参照)
[\Q]これ以降に続くすべての非英数文字の前に逆スラッシュを挿入
[\E]\Q,\U,\Lの効果を終了する
>905
geocitiesは User-Agent見てないみたい。
use LWP::Simple;
getprint '
http://www.geocities.co.jp/ ';
だけでできたのでなにか別の所に問題があるんじゃないかな?
プロクシ通さないとインターネットにアクセスできない環境からやってるとか。
910 :
IKeJI :02/03/23 08:19 ID:iMj9R1av
>>907 CGIで使っています、FreeBSDなど色々なサーバーで同じような症状が出ています。
>>908 ありがとうございました。
解決しました。
>>904 すまん、中身間違えた。
no warnings;
my $file = $user::file || 'bbs.cgi';
....
use warnings;
これで逝けるだろ。
画像アプローダを作るためのスクリプトってありますか?
shtmlに埋め込んだ掲示板が書き込んだ後、cgiに移動するんだけど 埋め込みしてあるshtmlの所に戻したいんだけど、どうやるの?
正規表現のことでお聞きしたいのですが、 ひらがな、カタカナ、半角英字、全角英字は [ぁ-ん]みたいな感じで、使用できると参考書に書いてあったんですが、 半角数字や全角数字も [0-9]みたいな感じで使用できるのでしょうか?
918 :
839 :02/03/23 15:35 ID:???
>>918 telnet www.geocities.co.jp 80
GET / HTTP/1.0
すると、
HTTP/1.1 200 OK
Date: Sat, 23 Mar 2002 08:41:52 GMT
Server: Y.G.Apache-SSLv3/1.3.9
Set-Cookie: Geoche=DX8gxX6cO000tucZycfSdO00ScRoAB; domain=.geocities.co.jp; path=/; expires=Mon, 22-Mar-04 08:41:52 GMT
Connection: close
Content-Type: text/html
<html>(以下略)
と返ってくるので、最終更新日は返さないみたいだね>geocities
920 :
nobodyさん :02/03/23 19:12 ID:aOzStk5l
ローカルな環境で、ブラウザのテキストフィールドに文字を入力して、 perlを通して綺麗に整形したHTMLとして出力しようとしています。 入力用のhtmlを整形用スクリプトはできたのですが、その間のデータの受け渡しがうまくいきません。 サーバに自作cgiをアップロードして使用した経験はあるので、同じように <form method="post" action="c:/zisaku.cgi"> <input type="submit" value="出力"> でデータを渡して、 print <<END .... END で表示できるだろうと思っていたのですが、submitボタンを押すとcgiのソースが表示されてしまいます。 無い頭をひねって cgi の一行目に「#!/perl」を付け加えたり、拡張子をcgiではなくplにしてみましたが うまくいきません。 ActivePerlはインストール済みです。 どなたか解決方法が判る方、ご教授願います。
921 :
839 :02/03/23 19:14 ID:???
>>919 どうも、ありがとうございます。
てことは、最終更新日を得るのは不可能ということですか?
方法としては、前回内容を保存しておいて、今回内容と比較して
更新されているかどうかを得る、という方法が現実なんですかね???
922 :
839 :02/03/23 19:18 ID:???
>>920 自作CGIはローカルにあるんですよね?
私は、httpdを入れてつかってます。
ActivePerlだけでは、920さんと同じくCGIソースが表示されました。
素人なので原因も解決法もわかりませんが、
ムリなことなんだろうな、とおもいます。
>>922 ,923
Anhttpedを導入した所うまくいきました。
ありがとうございました。
父親兼社長に、
「某システム社に頼んだら30万で見積もられたって?そんなの簡単だから一万円でやってやるyo!」
って大口叩いていたので、うまくいってほっとしております。
925 :
nobodyさん :02/03/23 21:29 ID:bh9fdkhx
バグの効率よい見つけ方を教えてください。
PerlでSocketで通信するプログラムを作ったんだけど、 LAN内では、問題無く動くのだけど、 外から、だと繋がらない、 思い当たる事無いですか 動いてる環境は、Linuxっす。
>>928 火壁は、IPマスカと、フィルターしかしてないから、
関係なくなかくない?
アドレスが127.0.0.1のままだったり
>>929 >IPマスカと、フィルターしか
これだけやってりゃ十分だ。
>927 オマエのその価値のないソースを見ないとなんとも言えないZE! オマエの説明不足からして接続できないのは納得できるZE!
質問があります CGIでHTMLを出力するとして 容量80KBのCGIファイル1つで出力するのと requireで10KBのファイルを呼び出して20KBのCGIファイル(合計すると30KB)で 出力するのとではサーバーの負荷はどちらが軽いのでしょうか?? perlの勉強をはじめたばかりなんですがどうしてもわからなくて・・。 申し訳ないですがどなたか教えて頂けないでしょうか?
935 :
839 :02/03/23 23:34 ID:???
LWPでジオの最終更新日が取れなかったので、
取れない場合は、改行およびタグを外した本文を保存しておき、
次回アクセス時に今回のものと前回のものを比べて更新日を推測する、という
方式を取ることにしました。
>>862 でLWPで更新日を取得できなかった場合は、
$doc = get URL;
$doc =~ s/\r\n//g;
$doc =~ s/\n//g;
$doc =~ s/<[^>]+>//g;
としています。
ところが、ジオではないあるページにて、前回と今回の$docが同じにも関わらず、
if(前回$doc ne 今回$doc)
に引っかかってしまうのです。他のサイト(ジオ)では問題ありませんでした。
if(前回$doc ne 今回$doc)という表現に問題があるのでしょうか???
カウンタが回って数値が違うとかじゃねーの。 なぜ改行とタグ削って保存するのか疑問。
937 :
839 :02/03/23 23:56 ID:???
>>936 カウンタ画像を読みこまないためにタグを削除しました。
ローカルに落として目で確認しましたが、前回$docと今回$docの
内容は同じでした。
ログファイルの中身ですが、サイトごとに<>で区切り、サイトのURLや
最終更新日等を,で区切って保存しています。
open(IN,ログファイル); $log = <IN>; close(IN);
@log = split(/<>/,$log);
foreach $x (@log){・・・・
という感じですが、改行を外すさないとうまく動かないからです。
すみません、たぶん技術がない所為です。
>934 便器マークとったら?
939 :
839 :02/03/24 00:02 ID:???
追記です。 すみません、2回のアクセスに1度の割合で、 順番に前回と今回の$docが同じでも if(前回$doc ne 今回$doc) に反応しているようです。 1アクセス目:反応なし 2アクセス目:LWPで取得できなかったAサイトが反応 3アクセス目:反応なし 4アクセス目:LWPで取得できなかったBサイトが反応(ジオ) ・ ・ ・ という感じでした。 もしif(前回$doc ne 今回$doc)が悪いのだとしたら、他に良い方法の ヒントをなんとかよろしくお願いします。
すいません、STDOUT 等はどうやって宣言するのですか? #!/usr/local/bin/perl -Tw use strict; exit &func(STDOUT); sub func { my $fh = shift; print $fh 'hello world.'."\n"; return 0; } % ./sample.pl Bareword "STDOUT" not allowed while "strict subs" in use at ./sample.pl line 3. Execution of ./sample.pl aborted due to compilation errors. なんとなく FAQ っぽいのですが、"use strict;" STDOUT で ググってもそれらしいのが見つけられませんでした。 しかしこれ系のファイルハンドルは実行時に自動的に発生する筈ですし、 性質上初期化なんてできませんよね?
*STDOUT, \*STDOUT, *STDOUT{IO}
942 :
nobodyさん :02/03/24 00:18 ID:+OOAM91Z
use File::Sort qw(sort_file); これはどういう意味なのでしょうか? 本を数冊読んだのですが説明がありませんでした…。 sort_file(...); というふうに関数を使用しているのですが。
File::Sort.pmのうちsort_fileメソッドだけ使用するという意味です。
944 :
940 :02/03/24 00:39 ID:???
>>941 速攻レス有難う御座います。*STDOUT で上手く行きました。
しかし、それって型グロブってやつですよね?
そうなると、なんか意味として回りくどくなってしまうような
気がしますが、こういう使い方はごく普通なのでしょうか・・・???
945 :
942 :02/03/24 01:40 ID:+OOAM91Z
>>943 レスありがとうございます^^
そうすることでメモリ消費を抑えたりするのでしょうか…。
>>934 それは、トータルのスクリプト量が小さいほうがDISKアクセス負荷、
CPU負荷、共に軽いんじゃない?つまり、requireしたほうが軽そう。
どうしても知りたいなら、
>>938 の言うように、なんらかのベンチマーク
を取って、結果報告キボン。
でも、perl自体が起動する負荷に比べれば、
その程度の違いは無いのと同じだと思う。
>>927 1.そのスクリプトを動かしたマシンにグローバルアドレスがついてない
2.ついてるんだけど、ファイヤーウォールの設定で遮断されてる
3.上記の問題はないんだけど、127.0.0.1 のみをlistenしている。
>>939 「if(前回$doc ne 今回$doc)」以外の場所にバグがあるとしか
考えられない。
949 :
839 :02/03/24 02:00 ID:???
>>948 そうですか・・・・
それにしても if(前回$doc ne 今回$doc) に問題がないと
いうことがわかり、前進です! ありがとうございます。
とりあえずEUC(?)にして試してみます!
>>945 実際に検証したわけではないので伝聞ですが読み込みが早いそうです。
今思いつくものでは
use Symbol 'gensym';
use Fcntl qw(:flock);
のようなケース。
ん?
#!/usr/binbin/perl -T no strict; use Asian::Pussy qw/:sexy :healthy/;
953 :
nobodyさん :02/03/26 12:00 ID:pm1MjUop
Perl4で作ったBBSがIE以外で表示できません。 ナゼなのでしょうか。 1.NNの場合、Perlが出力したソースが表示されます。 2.Operaの場合はファイルダウンロードのダイアログが起動します。 IEでは問題ないんですけど 私がアフォだからっていう以外の理由を知りたいです。 お願いします。
print "Content-type: text/html\n\n"; ってやってるあたりがおかしいから。
955 :
953 :02/03/26 12:22 ID:???
>>954 あたりって・・・見たところ良いみたいなんですが(涙。
こんな現象は良くあるんでしょうか?
>955 君の良いと正解の良いには違いがある可能性があります。 とりあえずソース晒してください。
957 :
953 :02/03/26 12:48 ID:???
>>956 その「あたり」でいいですか?
print<<END;
Content-type: text/html\n\n
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
>957 それ以前にprintをしている可能性は?
959 :
953 :02/03/26 13:02 ID:???
>958 なさそうです。敢えて言えばサブルーチン名にPrintPageっていうのを使ってます。これは問題ないですよね。
ヒアドキュメントの中に\n\nとか書いても解釈されるんだ。はじめて知った。 とりあえずCGIファイルの先頭あたりで print "Content-type: text/html\n\n"; して様子を見てみるとよいかと。
>960 ヒアドキュメントでも print <<'END'; ってやったら解釈されないから注意。 シングルクォーテーションだと解釈されないのは同じだから。 でも、覚えておくと逆に便利な事もある。 メアドをプリントする時とか\入れなくて済むし。
962 :
953 :02/03/26 13:20 ID:???
>>960 >とりあえずCGIファイルの先頭あたりでprint "Content-type: text/html\n\n";
これで正常になりました。
やはり以前のステップに問題があるんだろうと思いますが
現象が解消したので、じっくりゆっくり調べます。
本当にありがとうございました。
963 :
960 :02/03/26 13:54 ID:???
>>961 今実験してみたらそうみたい。
さんくす。
>>953 とりあえずよかったねぇ。
がんばって調べろよー。
964 :
超・超初心者 :02/03/26 14:40 ID:6InRaAYk
どなたか助けて下さい!以下の2つのプログラムの作り方が 全然わかりません。 任意の10億までの数を入力して、 その素因数分解して、その結果を出力 するプログラムをPERLを使って作成 してください。 ファイル名と文字列を入力すると、 その文字列がそのファイルに含まれるか どうかを検査し、含まれていた場合は、 ファイルの何行目に含まれているかを 出力するプログラムをPERLを使って 作成してください。 どうか、宜しくお願いいたします。
>作成してください。 宿題は自分でやりましょうね。 はい次の方。
>作成してください。 ぉぃぉぃ 宿題? 素因数分解は遅くていいなら簡単だけど。 速くするのは数論の知識も必要になってくる。 grepみたいなのはものすごく簡単だけど。 教えない。
967 :
のび太 :02/03/26 16:00 ID:Kul7lxpG
perlでhtmlファイルを書き出し、それと同時に違うサーバーにFTP転送しています。 元ファイルの作成と転送そのものは問題なく動作してるのですが、 コピーしたファイルが元のファイルと比べて内容が変わってしまいます。 ※内容が変わるというのは、ファイルが最後までコピーされない感じです(100行あったら90行までしか) テーブルを使用してるのでレイアウトがグチャグチャに。。。 これはどのような原因が考えられるでしょうか? ちなみに出力したファイルが全て書き込まれる前に転送しちゃってるのかな?と思い 転送の前にスリープとかやってみても結果は変わりませんでした。
969 :
ほげ :02/03/26 16:09 ID:gjNyJjgt
>>967 スリープしても意味無い。closeしなされ。
>>964 $x = ファイル名
$y = 文字列
$cnt = 1;
open(IN,$x);
while(<IN>){
if($_ =~ /$y/){ print "$cnt行目\n"; }
$cnt++;
}
close(IN);
>>964 $i = $in = $ARGV[0];
for($prime=2;$prime <= $in && $prime<1000000000;$prime++) {
if ( ($i % $prime) == 0 ) {
$power{$prime}++;
$i = $i / $prime;
$prime = 2;
}
}
foreach(sort {$a<=>$b} keys %power) {
$n = $power{$_};
if ($n == 1) {
$term = $_;
} else {
$term = "$_^".$n;
}
push(@result,$term);
}
print "$in = ",join(" * ",@result),"\n";
課題とすると
授業で扱った関数使うとか、
前提が思うんだけどな。
>>972-973 を提出しても誰かに作らせたとばれてしまう罠。
975 :
973 :02/03/26 22:02 ID:???
>>973 つっこみどころ満載でお届けしております。(藁
977 :
nobodyさん :02/03/26 22:34 ID:7ingtp1l
$b=$a-1; print "a-1=$b"; というのを$bを使わないで print join("", "a-1=", $a-1); って書くのは普通ですか?もっと良い方法ありますか? join使うとhtml出力するときとか、めちゃめちゃ分かりづらくなるんですが。
>>977 printf "a-1=%f", $a - 1;
# or
print "a-1=${ \do{ $a - 1} }";
print "a-1=@{[ $a - 1]}"
好きな方法を試されよ。
>>977 ふつーに
print "a-1=", $a-1;
とか。
>977 なんで join でくっつけるの? つっくける意味がわからん。 print '$a-1= ',($a-1),"\n"; または print "\$a-1= ${\( $a - 1 )}\n";
982 :
977 :02/03/26 23:03 ID:7ingtp1l
あれーそんなにいっぱい方法が..。 979さんと980さんのはピリオドじゃなくてカンマでいいんですか? なんかdoってのが一番しっくりきそうなので使ってみます。 てか、今までずっとjoinでやってた..。人に見せなくてよかった。 ありがとうございます!
ppm install Net-SMTP すると、
Error installing package 'Net-SMTP': Could not locate a PPD file for package Net-SMTP
ってエラーが出るんだけど、なにこれ?
プロキシ使ってないのに・・・
http://www.activestate.com/packages/ に Net-SMTP が見当たらないのと関係ある?
984 :
983 :02/03/27 05:02 ID:LXoBMXbo
ちなみに ppm install Net-Ping は成功しました。回線不調ともちがうようです。う〜ん・・・
986 :
983 :02/03/27 05:34 ID:???
987 :
帝国 ◆9qoWuqvA :02/03/27 11:30 ID:BFIdDUdC
Perlで質問なんですが、 $folderで指定したフォルダ内に フォームで受け取ったファイル名($filename)とパーミッション($permission)で、 空ファイルを生成する方法を教えてほしいんですが・・ もしかしてcgi-lib.plとか使いますか??
>987 フォルダのパーミッションがきちんと設定されてればopen(MAKE,">$filename");でできる。 パーミッションはchmodで変えれ。
989 :
帝国 ◆9qoWuqvA :02/03/27 11:58 ID:BFIdDUdC
>>988 ファイルの生成はうまく行きました。
でもパーミッションが設定されないんです。。
chmod($permission,"$folder/$filename");
でダメなんでしょうか?
>989 パーミッションの数字はなににしてる?
$permissionの中身は何? てかパーミッション設定するのに変数使う必要あるんだろうか・・・・ $file="\.\/$folder\/$filename"; chmod 666,$file; とかじゃダメ?
nobodyに0700にされる罠。
993 :
帝国 ◆9qoWuqvA :02/03/27 12:39 ID:BFIdDUdC
パーミッションはフォームにいれた値。 だから変数に格納する必要が。。
パーミッションは8進数で設定するのは別に罠ではないという罠。 立たぬなら 立つまでまとう Perlスレ
996 :
nobodyさん :02/03/27 16:20 ID:Uw889VO5
996!
997!
998
999!!!
1000get!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。