【Perl】初心者コーナー Part18
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/20 22:04ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0136135
02/11/30 12:17ID:???上手くいきました、ご迷惑おかけしまスタ
0137nobodyさん
02/11/30 13:59ID:/75slB4UMath::Bigint 使ってください。
Perlで大きい整数はまともに扱えません。
使い方は perldoc Math::Bigint 読んでね。
0138nobodyさん
02/11/30 14:04ID:???ttp://www.din.or.jp/~ohzaki/perl.htm
ここの「日本語を扱う 正しくパターンマッチさせる」を読んでくれ。
日本語処理はそう簡単には実装できない。
0139125
02/12/01 14:00ID:???求めていた回答がここにありました。
じつはそこのサイトはこのスレッドの頭にあったので
見ていたのですが、ちゃんと読まずに通過していたようです。
解決することができました。ありがとうございました。
他の皆様も考えてくださったり回答してくださったりして
ありがとうございました。では。
0140nobodyさん
02/12/01 21:52ID:???で作ったをもとに、
hoge,piyo,huga
と表示させたいです。どうやればいいか教えてください。
0141nobodyさん
02/12/01 21:55ID:???0142nobodyさん
02/12/01 21:58ID:???0143nobodyさん
02/12/01 22:02ID:???0145nobodyさん
02/12/01 22:06ID:???{
my @hogelist = ('hoge','piyo','huga');
my $count =1;
foreach(split(/\t/,join('\t',@hogelist))){
print "," if $count%0x04;
chomp;
print STDOUT;
$count += ($count+1)/0x01;
}
もっと無駄な方法ってないかしらん・・・
0147nobodyさん
02/12/01 22:22ID:SByI0FEM誰かUPローダの作り方教えてください。
作り方を説明してるサイトでもいいんで、お願いします。
0148nobodyさん
02/12/01 22:25ID:???CGI::Liteとかのurl_encode,decodeなんですけども、
ある文字列がエンコード済みなのか未エンコードなのか調べる方法は無いでしょうか?
既にエンコード済みの"300%89%7e%82%c5%8d%a1%8c%8e%90%b6%82%ab%82%c4%82%a2%82%af%82%e9%82%a9%89%b4"
とか、未エンコードの"松屋のカレー(゚д゚)ウマー"とか色々な文字列が与えられてくるのですが
それを一律にURLエンコードがされた状態にしたいのです
で、ソレをデコードする時等、エンコードされてるモノはデコードしなきゃいけませんですし、
エンコードされてないモノに、"今日の降水確率は%25ってとこですかね"とか与えら、
デコードしたら変になってしまいますし…
なにかいい方法はないでしょうか?お知恵をお貸しください…
0149nobodyさん
02/12/01 22:37ID:???レンタルのにしなさい。
>>148
本文につっこみますが日本語がとても難しいです。
もう一度日本語の勉強をしなおしてきます。
($str =~ m#^%.*#)? デコード処理 ;
ではダメ?(やっぱりよくわからん)
0150nobodyさん
02/12/01 22:38ID:???理論的には不可能だ。
'%22'という文字列だけが来たときに、それがもともと
'%22' という文字列をそのまま送信したのか、
'"'(ダブルクォーテーション)を送信したのか、判別できないだろう。
[\x80-\xff]が含まれていたらエンコードされていないと見なす、くらいで
妥協したら?
0151nobodyさん
02/12/02 04:38ID:weXpByrh->decode($str) if $str =~ m/^(?:%[a-fA-F0-9][a-fA-F0-9])+$/;
で、十分実用に耐えると思うが・・・
エンタープライズとかだと、デコードしてないと
error 400になるけど
0152151
02/12/02 04:39ID:???0153nobodyさん
02/12/02 04:41ID:???表示するためには、CGIでどういう記述をすれば良いのか教えて下さい
0154nobodyさん
02/12/02 08:03ID:???ごめんなさい、意図がよく伝わらなかったようで(汗
えと、とりあえず"与えら"は"与えられたら"です、打ちミスりました
>>150
まだまだワカッテナイので、[\x80-\xff]ってのは日本語が入ってたら、ってことなのでしょうかね
あとは"とか&とかそゆモノが入っていた時もエンコされてないなー、って方針でいいのでしょうか
>>151
%xxが含まれてたらエンコード済み、と解釈するということでしょうか?
>>150さんのと組み合わせたほうがより完璧を期することができそうです
下2行はよくわかんないですけど、ある鯖でやると、ってことでしょうか?
>>153
IO::Socketモジュールとか使えばいいような気がします
にちゃんねる掲示板の仕様はよくしらないのですが、どっかにスレ一覧を保持してるファイルが有った気がします
でもアクセスごとに結構な大きさのファイルを取りに行くと転送料問題とかで怒られそうな気もします
初心者なのでなんか重大な勘違いをしてるかもしれませんがネ…
0155150
02/12/02 14:17ID:mB0yHtje150は適当に書いちゃったけど、
[\x00-\x20"#;<>?{}|\\\\^~`\[\]\x7F-\xFF]
が含まれていたらエンコードされていない、と見なすのは?
まあ>>151さんのでOKだと思うけど。
0156nobodyさん
02/12/02 14:53ID:???0158nobodyさん
02/12/02 17:07ID:???キボンと言われましても、他のDBをほとんど使ったことがなく
単純に登録、更新、削除くらいしかしないので感想はあまりないです。
ただちょっとデータ量が多そうなのでDBを使ってみるかとなったのです。
0159nobodyさん
02/12/02 17:55ID:fz9HS+5s上記のサイトを参考にして(というかそのままコピペで)、
WEBページを読み込むCGIを作りました。
しかし、CGIにアクセスしてみたところ正常に読み込めないようです。
$errorMessageは、Can't connect to httpとなっています。
メッセージの意味は分かるのですが、解決策が分かりません。
サーバーの環境は、MacOS10.1.4、Perlのバージョンは5で、自宅サーバーです。
掲示板等のCGIは正常に動いています。
解決策が分かる方、お願いします。
0160nobodyさん
02/12/02 17:56ID:VWSOmEHp>↑オマエは頭の悪いバンドマンだなーどうせオールナイトイベントに出てた
>スキムミルクっていうバンドだろ?ライブ中の態度でけーんだよ。
>ツアーバンドはノルマとらないんだよ。それからいい音出すPAも雇ってチラシも
>すってんだよ。金かかってるんだよ。そのくせてめえら客よばね―のか?
>Y野氏の組織はやばいからねーパソコンオタクもいるから調べられて
>そんな事言ってるとCHOKOに本当にカツアゲされるぞ。
>2ちゃんねるキラー組織って知ってるかなー君?
↓ここでこんな書き込みを見つけたんだが
恐らくお祭り状態になる予想。興味のある方は是非見てきてくだされ。
http://music.2ch.net/test/read.cgi/minor/1031619119/74
ちなみにCHOKOというバンドのサイト。
http://choko3.hp.infoseek.co.jp/
2ちゃんねるキラー組織キタ━━━)゚∀‘)・ω・) ゚Д゚)゚∀゚)・∀・) ̄ー ̄)´_ゝ‘)-_)゚∋゚)´Д`)・∀。)━━━━!!!
0164nobodyさん
02/12/02 18:28ID:+ey3nn6hhost->IPが取得できないのでは
0165159
02/12/02 19:12ID:???レス感謝です。
今日は時間切れの為大学から閉め出されてしまうので、
また明日調べてみようと思います。
ありがとうございました。
0166nobodyさん
02/12/02 19:24ID:???0167nobodyさん
02/12/02 21:16ID:???そのファイル内にある.cgiなどをFFFTPでアップするだけでいいんでしょうか?
0168nobodyさん <sage>
02/12/02 21:21ID:???WebprogとかCGIのスレ行ってよ。Perlとぜんぜん関係ないじゃん。
0169167
02/12/02 22:22ID:???0170nobodyさん
02/12/02 23:00ID:afn6SBSE時間表記をできるように、以下の行を足しています。
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time);
@month =('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
@youbi=('Sun','Mon','tue','Wed','Thu','Fri','Sat');
$year += 1900;
if($day < 10){$day = "0$day";}
if($hour < 10){$hour = "0$hour";}
if($min < 10){$min = "0$min";}
$time="$youbi[$wday], $day-$month[$mon]-$year, $hour:$min";
ここで質問なのですが、時間・日を、2時1分が、2:1とならないように、
ifで02:01となるように書きました。
でもこれ、置換処理か何かでもっとスマートに書ける気がするのですが、
具体的にわかりません。どなたか、ご教授願えないでしょうか。
0171nobodyさん
02/12/02 23:06ID:???($day,$hour,$min,$sec) = map {sprintf "%02d", $_} ($day,$hour,$min,$sec);
0172170
02/12/02 23:06ID:???「すぐわかるパール」でした。
古田たかし著の「初めてのCGI&Perl」と混同しました。
今まで読んだ参考書は、上記2冊です。
0173nobodyさん
02/12/02 23:08ID:???@youbi とか、、ダサすぎでしょ。
0175nobodyさん
02/12/03 01:13ID:???if($day < 10){$day = "0$day";}
なんて方法は最悪の部類ですよ。かなりひどい本だと
断定してもいいです。たぶんこれもkent-webのソース
をダサいままぱくってるのかな?
0176nobodyさん
02/12/03 01:18ID:ZhYTYd9Tデータファイルを読み込んで、任意の数字がある場合のみprintしたいと思っています。
for(@log){
if($_ =~ /$num/){
print "$_";
}
}
これでやると、$num=10;とした時、100や101、102....もマッチしてしまいます。
10なら10だけをマッチさせたいのですが可能でしょうか?
0177nobodyさん
02/12/03 01:27ID:???後で必要なのは$timeだけだよね?
($min, $hour, $day, $mon, $year) = (localtime time)[1..5];
$time = sprintf "%s, %02d-%s-%d, $02d:%02d".
qw(Sun Mon Tue Wed Thu Fri Sat)[$wday], $day,
qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[$mon],
$year+1900, $hour, $min;
0178nobodyさん
02/12/03 01:29ID:???区切り文字とかってないの?どんなデータファイル?
いちおう /\D$num\D/ で可能だとは思うが
行頭と行末の場合はヒットしないので注意。
0179176
02/12/03 01:44ID:???データファイルは掲示板の書き込みのような文章です。
その文章中(記事番号とかではなくて)に任意の数字がある場合にマッチさせたいのです。
/\D$num\D/を使ったらうまくいきそうです。
ありがとうございました。
0180nobodyさん
02/12/03 02:26ID:???$t = localtime;
print $t, "\n";
0181nobodyさん
02/12/03 13:18ID:???前スレでおしえてもらったのを使いつつやってみてるんですが、、、
perl書くの初めてなんで全然分からず行き詰まり。どなたか助けてください。
my $output = "aaa.html";
open (OUTPUT, ">$output") || die "Could not open file $output : $!\n";
print OUTPUT "(HTMLヘッダ部〜<table>まで)";
print OUTPUT "<tr><th>No.</th><th>filename</th><th>update</th></tr>\n";
my $now = time;
my %files;
opendir(DIR, '.');
while (readdir(DIR)) {
if (($_ =~ /.txt$/i) && ($_ ne "readme.txt")){
$files{$_} = (stat($_))[9];
}
}
closedir(DIR);
0182nobodyさん
02/12/03 13:18ID:???foreach $key (reverse sort {$files{$a} <=> $files{$b}} keys %files) {
# このへん分からない
my $last_date = $files{$key};
my $ptime = int(eval(($now - $last_date)/86400));
$title = $key;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($last_date);
$year = eval($year + 1900);
$mon = eval($mon + 1);
substr($title,-4,4) = "";
print OUTPUT "<tr>\n<td align=\"center\">$i</td>\n";
print OUTPUT "<td>$title</td>\n";
print OUTPUT "<td align=\"center\">$year年$mon月$mday日</td>\n</tr>\n";
# ??
}
(以下続きがある予定)
print OUTPUT "(タグ閉め)\n";
close (OUTPUT);
0185nobodyさん
02/12/03 15:16ID:???>print OUTPUT "<tr>\n<td align=\"center\">$i</td>\n";
の行はいらないんで、$iは無視してください。
sortしたのをforeachでちゃんと回るようにしたいんですが。
0186nobodyさん
02/12/03 18:16ID:???新しい順に並ばないか?
0188nobodyさん
02/12/03 21:12ID:???プログラミングPerlを買ってきて読め。
それで全て解決。
0189184=186
02/12/03 22:07ID:???このスクリプトなら新しい順に並ぶでしょう?
並ばないなら、どうなるのか教えて欲しい。エラーが出るのか?
で、最終的にどうしたいわけよ。
%filesにどんな値が入るか観察してみるとわかるかもな。
実行して生成されるhtml見ると、この部分(foreach(){ }の中)が抜けてて、
ヘッダとフッタの部分だけになっちゃうんで。。
0191nobodyさん
02/12/03 23:23ID:lLuHX1/s$time(10桁の数値)を出来るだけ少ないバイト数に可逆圧縮したいのですが、
どうすればよいでしょうか。
例えば16進数で表記すると、
1037797479(10byte) → 3DDB8867(8byte)
で2byte縮むことになります。
ただ、圧縮後の数値は aタグにのせてリンクするので、(<a href=test.cgi?i=3DDB8867>)
URLに使えない文字だと駄目なのですが。
よろしくお願いします。
0192nobodyさん
02/12/03 23:33ID:???そんなことをする意味は……それは言わんでおくか。
URLに使える文字のテーブルを作って、仮にそれが50個あった場合は
timeの数値を50進数に変換したあと、テーブル引いて文字化する。
受け取る側では逆のことをやる。これなら5〜6文字ぐらいにできるんでない?
0194nobodyさん
02/12/04 00:01ID:???ありがとうございます。
目的は携帯サイトの2k制限を如何にクリアするか、ということなんです。
その為にHTMLに出力する部分は出来るだけ文字数を落としたいのです。
(0..9,a..z,A..Z,_,-)
仕様上URLでそのまま送れる文字は上記と、'.'、'*'だけみたいですので、
そうなると64進数が限界でしょうか。。
ご意見ありがとうございました。
0196nobodyさん
02/12/04 00:14ID:???あ゛あ゛あ゛恥ミス発見!
ご指摘の通り $time = time; でした。
64^4 = 16777216
で、10桁は表現できないと思うのですが・・
4バイトで表現するにはどうしたらいいんでしょうか?
0197189
02/12/04 00:23ID:???おお。すまん。
foreachと言うのでそこばかり気にしていたよ。
while (readdir(DIR)) {
を>>193のように
foreach(readdir DIR){
とするか
while($_ = readdir DIR){
としてみれば解決すると思うぞ。
0198nobodyさん
02/12/04 01:33ID:???1970年のデータが必要かどうか判りませんが、
もし最近のものならその数字(timeの戻り値)自体を減らしてみてはどうでつか?
$time = time - 946684800;
2000年01月01日午前00時00分00秒を0とするとか。
0199nobodyさん
02/12/04 01:33ID:???>>195は、timeの値が4バイトだと言ってる。つまり32ビット。
で、64通り=6ビットの場合、6文字必要。
でも、何十年も使う訳じゃないだろうから、timeから1000000000を
引いた値を5文字(30ビット)で格納、でどうかな。
0200199
02/12/04 01:34ID:???1時間前のカキコに…笑
0201181
02/12/04 09:10ID:???0202196
02/12/04 11:17ID:???なるほど!理解できました。
確かに最近のものだけなので、timeの戻り値を減らしてみます。
この度はどうもありがとうございました。
またよろしくお願いいたします。
0203nobodyさん
02/12/04 15:23ID:???for (1..10){
print "うんこ\n";
}
こういう書き方はありですか。
0205nobodyさん
02/12/04 18:01ID:7+5xaubmlinuxの設定ファイルでよくある「.conf」ってなにか規格があるの?
perlから簡単に扱えるようなモジュールはありますか?
0206nobodyさん
02/12/04 20:05ID:???意味があまりよく判りませんが、「.pl」や「.cgi」など、AddHandlerで設定した拡張子にしておくと、直接ブラウザで見られたときに、エラーが返ってくるので安心かもしれません。
0207nobodyさん
02/12/04 20:41ID:???Windowsでいうところの.iniやMac OS Xでよく使われているようなplist
みたいに、設定ファイルのデファクトスタンダードな規格はあるのか?
ってことでしょ? 無いと思う。
CPANにいけば、設定ファイルをごにょごにょするモジュールはいっぱい
あるので、検索してみることをお勧め。
0208nobodyさん
02/12/05 02:20ID:???ここに有るものを好きに選ぶよろし
http://cpan.org/modules/by-category/02_Perl_Core_Modules/Config/
02091/2 長文すいません。。
02/12/05 04:48ID:jP9xslt3timethese(1000, {
foreach => sub {
open(FILE, '/test.data');
my @data = <FILE>;
close FILE;
foreach (@data) {
tr/E//;
s/a/e/g;
}
},
while => sub {
open(FILE, './test.data');
while (<FILE>) {
tr/E//;
s/a/e/g;
}
close FILE;
},
});
}
02102/2 長文すいません。。
02/12/05 04:48ID:jP9xslt3foreach: 2 wallclock secs ( 0.19 usr + 1.21 sys = 1.40 CPU) @ 713.78/s (n=1000)
while: 2 wallclock secs ( 0.46 usr + 1.72 sys = 2.18 CPU) @ 457.88/s (n=1000)
Benchmark: timing 1000 iterations of foreach, while...
foreach: 1 wallclock secs ( 0.22 usr + 1.12 sys = 1.34 CPU) @ 745.71/s (n=1000)
while: 2 wallclock secs ( 0.55 usr + 1.59 sys = 2.14 CPU) @ 466.42/s (n=1000)
Benchmark: timing 1000 iterations of foreach, while...
foreach: 1 wallclock secs ( 0.21 usr + 1.19 sys = 1.40 CPU) @ 713.78/s (n=1000)
while: 3 wallclock secs ( 0.52 usr + 1.71 sys = 2.23 CPU) @ 447.63/s (n=1000)
foreach の方が速いんですけど、Benchmark の使い方間違っていますか?
この2つではよく while を使えといわれますが、それは速さではなくて別の要因があるからなんでしょうか?
配列にいれると大きなファイルだとメモリを圧迫するとか。
whileで回すとその心配はないのかな?
0211209-210
02/12/05 04:51ID:???やっぱりwhile のほうが速いですね・・・・。
すいませんでした。。
0213正規表現・・・・
02/12/05 13:08ID:vPIO4lyL$test =<<"TEST";
ここから始まりです。
<FOO>
hogehogehoge
hogehogehoge
hogehogehoge
</FOO>
ここで終わりです。
TEST
という文字列から<HOGE>から</HOGE>までを抜き出したい場合。
Perlでどんな風にかきゃいいんでしょう?
正規表現道場過去ログには
m[<FOO>.*?</FOO>]sのようにすればイイみたいな事が書いてあるんだけど
$test =~ m[<FOO>.*?</FOO>]s;
print $test;
てな感じでやってみると、$testはなにもされてません。
0214nobodyさん
02/12/05 13:14ID:???print $1;
0215nobodyさん
02/12/05 13:15ID:???print $1;
0216正規表現・・・・
02/12/05 13:31ID:vPIO4lyL感謝です。
0217nobodyさん
02/12/05 15:55ID:34DLd1c6ファイルオープンでエラーが出た場合に
処理を続行したいのですがエラーをクリアーする
関数などはあるのでしょうか?
また、読み込みの場合でもファイルロックをかける必要は
あるのでしょうか?
0218nobodyさん
02/12/05 16:19ID:???> 処理を続行したいのですが
開けなかった場合中断するってな風にプログラムしてなきゃ普通に処理を続行しますが。
>また、読み込みの場合でもファイルロックをかける必要は
>あるのでしょうか?
読み込みしかしないファイルなら必要ありません。
更新されるファイルならした方がよいでしょう。
0219nobodyさん
02/12/05 16:58ID:34DLd1c6勉強になりました
0220nobodyさん
02/12/05 18:12ID:x3XgL2vWJcode.pmをniftyで動かす方法を、教えていただけないでしょうか。
0221nobodyさん
02/12/05 22:49ID:???#!/usr/local/bin/perl -T
とするとエラーになって動作ません。
原因としてどんなことが考えられるのでしょうか?
0222nobodyさん
02/12/05 23:03ID:qFEbS8pnこれってプロバイダに言えばインストールしてくれるもんでしょうかね?
諦めて自宅鯖にしたほうがよいですかね?
0223nobodyさん
02/12/05 23:07ID:???Niftyは標準モジュールも入ってないし無理じゃない?
>>221
Tオプションの意味が分かるなら答えもおのずと分かりそうなモンですが。
>>222
プロバイダによってポリシーが違うだろうし、プロバイダに聞けとしか言いようがない。
0227nobodyさん
02/12/05 23:17ID:???エラーメッセージぐらい書いても罰あたらんだろうに。
0228nobodyさん
02/12/05 23:20ID:???0229nobodyさん
02/12/05 23:27ID:???1:自分はこう言う事がしたい。
掲示板のフォームから送られてくるデータの汚染チェックをしたい。
2:それでこんな風にやってみたが・・・
#!/usr/local/bin/perl -T
としてみた。
3:それだとこんなエラーが出て上手く行かなかった。
The script did not produce proper HTTP headers.
Please see the error log to see the detail of the errors.
あと226は多分漏れじゃない誰かです。
0230nobodyさん
02/12/05 23:39ID:???Please see the error log to see the detail of the errors.
適切なHTTPヘッダを吐いてない。
エラーの詳細はエラーログで見れ。
って書いてるじゃん。
0232nobodyさん
02/12/06 00:35ID:???MODULEしか使わないのですが、require 'aa.pl' と use MODULE; では速度や
負荷は変わらないですか?
aa.plの内容
#------↓ここから
packege MODULE;
・・・
1;
package MODULE2;
・・・
1;
#------↑ここまで
0233nobodyさん
02/12/06 00:41ID:???0234nobodyさん
02/12/06 00:46ID:???aa.plをuse MODULE;では呼び出せないと思うが。
0235232
02/12/06 00:50ID:???a.pm
--------------------
package MODULE;
・・・
package MODULE2;
・・・
1;
-------------------
b.pl
-------------------
use MODULE; # または require 'a.pm';
# MODULE2は使用しない。
0236nobodyさん
02/12/06 01:07ID:???use a;
になると思うのですが。
でOOPなら
$hoge1 = new MODULE;
$hoge2 = new MODULE2;
$a = $hoge1->hoge( $xxx );
とかに
単に関数を呼び出すだけなら
$a = MODULE::hoge();
$b = MODULE2::hoge();
■ このスレッドは過去ログ倉庫に格納されています