Perlコーディング初心者質問スレ Part 54
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
2007/02/10(土) 19:21:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >>2-10
前スレ http://pc10.2ch.net/test/read.cgi/php/1164519503/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0002nobodyさん
2007/02/10(土) 19:23:04ID:???[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: ttp://www.site-cooler.com/kwl/perl/
[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
[オンラインマニュアル] (追加)
最新のドキュメント: ttp://search.cpan.org/dist/perl-5.8.8/
perl5.8.xのドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: ttp://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: ttp://www.cpan.jp/search.cgi
perldoc.jp: ttp://www.perldoc.jp/
Perldoc.com: ttp://www.perldoc.com/
0003nobodyさん
2007/02/10(土) 19:23:37ID:???[モジュール]
CPAN.com: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/
[テクニック]
Perlメモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perlの小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm
[Perl5.8Unicodeメモ]
ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004nobodyさん
2007/02/10(土) 19:25:07ID:???CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/
【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/
【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/
★負荷軽減対策委員会(Perl、PHP)★
http://pc8.2ch.net/test/read.cgi/php/1034645635/
CGIに依存しないPerlの話題一般/Part2
http://pc8.2ch.net/test/read.cgi/php/1030548610/
★三 【 スクリプト改造工房 PART 9 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1143834740/
【 スクリプト改造依頼スレ 】(丸投げ) part6
http://pc10.2ch.net/test/read.cgi/php/1157787046/
0005あぼーん
NGNG0006あぼーん
NGNG0009nobodyさん
2007/02/11(日) 11:51:13ID:uXIy6Xmt例
0.57 * 100
0.07 * 100
IE6のJavaScriptだと上の場合 56.99999 となりズレます。
いろんな数値をperlで試しており、今のところズレは起きていないのですが perl は大丈夫なのでしょうか?
0010nobodyさん
2007/02/11(日) 12:07:58ID:uXIy6Xmt以下のようにすると 57, 56 と結果が返されます。
---------------------------------
print 0.57 * 100;
print int(0.57 * 100);
---------------------------------
0.57 * 100 の結果は "57" に見えるけど本当は違うのでしょうか?
0011脱帽
2007/02/11(日) 12:50:44ID:???0012nobodyさん
2007/02/11(日) 14:24:00ID:???0.57 * 100 → 57 * 100 / 100
0013nobodyさん
2007/02/11(日) 16:04:38ID:uXIy6Xmt有難うございます。bignum.pmというのは知らなかったです。
Math::BigFloat をよく使うのですが、大量の計算をする場合にはスピードがだいぶ気になります。
10や100などの計算だけでも..と思ったのですが。
>>12
すいません。私には何が言いたいのか理解できません(>_<)
もう少し教えて頂け無いでしょうか。
0014nobodyさん
2007/02/11(日) 16:06:28ID:???0015nobodyさん
2007/02/11(日) 18:39:39ID:???0016nobodyさん
2007/02/11(日) 22:17:14ID:???放置すればよろし。
0018nobodyさん
2007/02/12(月) 02:02:34ID:???0019nobodyさん
2007/02/12(月) 02:52:50ID:???つ http://docs.sun.com/source/806-4847/ncg_goldberg.html
熟読しとけ。な?
0020nobodyさん
2007/02/12(月) 14:57:27ID:EeKO4sif<INPUT TYPE="text" NAME="data" VALUE="a">
<INPUT TYPE="text" NAME="data" VALUE="b">
<INPUT TYPE="text" NAME="data" VALUE="c">
のようなフォーム内のデータを
@formdata = ('a','b','c');
というように取得したいんですが、
%form = $cgi->parse_form_data();
@formdata = $form{'data'};
だと取得できませんでした。
そもそも配列をそのまま取得することはできないんでしょうか?
情報が載っているサイトだけでも良いのでアドバイスお願いします。
0021nobodyさん
2007/02/12(月) 15:17:31ID:???002220
2007/02/12(月) 15:27:01ID:???レスありがとうございます。
そういうオチはないです。
$formdata = $form{'data'}
にしても
@formdata = $form{'data'}
にしてもも同じ値(リファレンス?)が1つだけ返ってくるだけです。
ちなみに
$formdata = split(/ /,$form{'data'});
とかもやってみましたが、こちらは何も返ってきませんでした(当然ですが)。
0023nobodyさん
2007/02/12(月) 17:09:55ID:???> 同じ値(リファレンス?)が1つだけ返ってくるだけです。
そこまで分かってて何故デリファレンスしないんだ。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html
@formdata = @{ $form{'data'} };
002421
2007/02/12(月) 17:29:44ID:???俺を含めないでくれ。
002520
2007/02/12(月) 20:57:49ID:???あ・・・。お恥ずかしい。
その通りですね。
自分なりにデリファレンスやってみたつもりが
全然違う書き方してたみたいです。
デリファレンスの書き方で混乱しないように勉強します。
ありがとうございました!
0026nobodyさん
2007/02/13(火) 15:50:27ID:Kq8fojs+perlもPostgreSQLの文字コードもEUCで保存しています。
どのように文字をエスケープすればいいのか検索して調べてもわかりません。
よろしくお願いいたします。
0027nobodyさん
2007/02/13(火) 16:14:50ID:???002826
2007/02/13(火) 18:34:04ID:Kq8fojs+よろしければもう少し詳しくお願いできないでしょうか?
0029nobodyさん
2007/02/13(火) 19:14:11ID:???処理中に文字化けしているのか、出力時に文字化けしているのか
そもそも文字化けなのか?DBに入らないのか?
文字化けならJcode::CP932(ただし要Jcode.pm上書き)か
WebだけならEncode::XMLCREFがいいんじゃないかと思いました
0030nobodyさん
2007/02/13(火) 21:14:34ID:???BBQ規制に関してです。
BBQ規制に巻き込まれた人を規制からはずすということをしたいのですが、
そのために
"allowhost.txt"に書き込まれたホストを一行ずつ読み込んで一致すれば規制を抜ける
ということにしたいです。
以下のソースの書き方では
串を入れるとBBQ規制には引っかかるのですが、
同じ串を"allowhost.txt"に書き込んでも規制を抜けません・・・。
どういう描き方が適当なんでしょうか?
0031nobodyさん
2007/02/13(火) 21:17:02ID:???sub checkProxyList {
###ホスト取得###
$RADDR = $ENV{'REMOTE_ADDR'};
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq "" || $host eq "$addr") {
$host = gethostbyaddr(pack("C*", split(/\./, $addr)), 2);
}
if ($host eq "") { $host = $addr; }
### $hostが"allohost.txt"と一致しているか調べる###
open(ALLOWHOST,"allohost.txt");
@allowhost = <ALLOWHOST>;
close(ALLOWHOST);
foreach $allowhost (@allowhost) {
$allowhost =~ s/\r//;
$allowhost =~ s/\n//;
$search = index($host, $allowhost);
if($search >= 0){
$flag = 1;
}
}
0032nobodyさん
2007/02/13(火) 21:17:27ID:???###BBQ規制###
$RADDR =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
$query_addr = "$4.$3.$2.$1.niku.2ch.net";
$address = join('.', unpack('C*', gethostbyname($query_addr)));
if ($address eq '127.0.0.2'){
if($flag == 1){
print "Content-Type: text/html\n\n";
print "規制を抜けました";
exit;
}
else{
print "Content-Type: text/html\n\n";
print "公開Rroxyからの投稿は受け付けていません!";
exit;
}
}
$flag = 0;
return 0;
}
my $Resolve = Net::DNS::Resolver->new(
udp_timeout => 30, # お好きな時間(タイムアウト)に♪
);
# --- BBQ・・・
my $BBQ_Status;
my $query = $Resolve->search(sprintf qq|%s.niku.2ch.net.|, join '.', reverse split( /\./, $IP_Address));
if ($query) {
foreach my $rr ($query->answer){
next unless $rr->type eq "A";
$BBQ_Status = $rr->address;
last;
}
}
print qq|-- BBQ --\n|;
printf qq|\t$IP_Address -> %s\n|, $BBQ_Status
? "Roasted(-_-)"
: 'None(^-^)';
風呂敷確認君より抜粋♪
ほへ?
エスパーさんぢゃないのでよくわかんないけれども、exit;しているからヂャネ?
0036nobodyさん
2007/02/13(火) 23:11:09ID:???にしないと、なんの為にフラグ用意してるのやら
003726
2007/02/14(水) 11:57:59ID:mjFZ4k3U"��"などの文字をDBに入れようとすると、DBからのエラーが帰ってくるんです。
Webminから直接DBのデータを操作して"��"を入れるとすんなりと入るので、
perlで入れるときは文字に何らかの処理をかける必要があるのかと思ったのですが。
入力するデータはCSVファイルで、jcode.plを使ってSJIS→EUCへエンコード後に、SQLコマンドを実行してDBに書き込んでいます。
"��"などの文字が入っていなければ、エラーはないのですが、入っているとエラーが帰ってきてDBへの書き込みができません。
スクリプトの文字コードはEUCで、perlのバージョンが5.6.1なのです。
0038nobodyさん
2007/02/14(水) 12:35:03ID:???0039nobodyさん
2007/02/14(水) 12:39:29ID:???書き込もうとしてうまくいかないバイト列を比較してみてはどうか。
君の変換がおかしいのか、もっと先に問題があるのかの切り分けにはなる。
0040nobodyさん
2007/02/14(水) 14:04:28ID:???0041nobodyさん
2007/02/14(水) 14:27:20ID:???# そもそもeuc-jpをやめて全部utf-8に…ゲフンゲフン
004240
2007/02/14(水) 14:41:35ID:???すまんこ。euc-jp で表現できることを確認しますた。
0043nobodyさん
2007/02/14(水) 14:49:15ID:???はしごだかはIBM拡張文字なのでなんらかの拡張が必要なんじゃない?
拡張したのもeucと呼ぶ人がいるけれども、拡張の方法も一通りでは
ないからどれのつもりで言ってるか気をつけないといけない。
ttp://msyk.at.webry.info/200511/article_2.html あたり参照。
5.6はいい加減捨てて5.8.x+Encode::EUCJPMSを使う方がいいん
じゃないかと思う。
0044nobodyさん
2007/02/14(水) 14:55:18ID:RW6nNThJperlって難しすぎる。
004540
2007/02/14(水) 15:07:46ID:???秀丸で、「高 ��」を euc で保存 (euc.txt)
秀丸で同ファイルを開くと、ちゃんと読める
$ hexdump -C euc.txt
00000000 b9 e2 20 fc e2
以下は、utf-8 な fc6 に ssh して実行。
$ iconv --from euc-jp --to utf-8 euc.txt
高 iconv: 位置 3 で不正な入力シーケンスがありました
$ cat euc.txt | perl -MEncode -ne 'print decode("euc-jp", $_);'
Wide character in print at -e line 1, <> line 1.
高 ?
0047nobodyさん
2007/02/15(木) 00:36:29ID:???どうにも困った事がおきたので質問させてもらいます。
チャットには参加者一覧が表示されます。携帯からチャットにアクセスすると、その
参加者一覧に自分の名前がいくつも表示されるという不具合が起きました。ログを見る
と携帯電話は数分でIPが変わっていて、それをスクリプトが別端末からのアクセスだ
と誤認したのが原因でした。(最終アクセスから5分経つとそのIPの参加者の名前はリ
ストから削除します。)
そういえば2chは携帯で書き込んでも毎回同じIDだなと思い、何度かfusianasan
をしてみるとIPは(たぶん)変わっているにも関わらず、全て"07012360463529_vi"とい
う謎の文字列が出てきました。2chは同一端末からのアクセスをなにかエロい事をして
認識しているらしいです。
参加者リストに同じ名前が複数あるときは一つにまとめようかと考えていますが根本
的には解決していないので、気持ち悪いので、何かいい案を下さい。
# KENT WEBのCOMCHATをベースに改造してつかっています。
# ttp://www.kent-web.com/chat/comchat.html
0048nobodyさん
2007/02/15(木) 00:40:35ID:???教えていただきたいのですが、よろしくお願いします。
use strict;
use warnings;
use CGI::Carp qw/fatalsToBrowser/;
この3行をソースコードのはじめのあたりに加えると
Global symbol "$xxxx" requires explicit package name at ・・・
こういうエラーが出てきました。
・グローバル変数の探し方は、この方法で大丈夫でしょうか?
・この出てきたグローバル変数の中で、”値の変化しないグローバル変数はそのまま”
”値の変化するグローバル変数にmyを付けて”、動作も矛盾しないようなコードに
直せばよいのでしょうか?
マルチスレッドのようなイメージで考えればよいでしょうか。
0049nobodyさん
2007/02/15(木) 01:03:55ID:???0050nobodyさん
2007/02/15(木) 01:28:23ID:KpCoXSAWセッションID(の類)をリロードの時に送信するとか。
リロード方法によってはIDの伝達途切れるから、
名前+UAくらいで判別するのも悪くはないと思う。
2chが何やってるかは知らない
>>48
他言語の経験あるならその方針で大丈夫
0051nobodyさん
2007/02/15(木) 02:02:42ID:???助けてやってください。
さくらのシェルで、viでこんなのを書きました。
#!/usr/bin/perl
print "Hello World!\n";
そしてchmod 755して、ブラウザからhttp://foo.jp/var.cgiとやったらサーバエラーになるんです。orz
私は何か根本的な事を知らないのでしょーか?
0052nobodyさん
2007/02/15(木) 02:11:09ID:???ActivePerlと04WebServerでもダウンロードしてローカルでやんなさい。
0054nobodyさん
2007/02/15(木) 02:34:06ID:???助かったの?
CGIの場合少なくとも最初に
print "content-type: text/html\n\n";なり、
print "content-type: text/plain\n\n";なりの出力が必要。
確かに根本的な事。
ローカルの方が作業もしやすいよ。
0055nobodyさん
2007/02/15(木) 02:50:34ID:???動きますた!
そんな類のこったろうと思いましたが、具体的に何書いて良いかがわかりませんでした。(^^;
これでまっとうな勉強が出来そうです。
>>52
いやーローカルの鯖でシェルからperl ./var.cgiしたら文句なく動いてるのに、cgiとして動かしたら何故動かない!とテンパってたんです。(^^;
生のperlとCGI経由の違いが解ってようやく前に進めそうです。
0056nobodyさん
2007/02/15(木) 06:55:48ID:???VMware server と、適当な Linux でいいんじゃないの?
005753
2007/02/15(木) 08:12:01ID:???SpeedyCGIなんとか入れてみました。ネットで調べたところ、
「使用し終わったグローバル変数がそのまま再利用されるため、
変数にゴミが入った状態になります。 グローバル変数の初期化が前提です。」
とありました。
i=0; i++; i++; i++; i++; i++; print("i");
i=0;と初期化して、5回足しています。
1,2,3,4,5と順調に加算されて、printする瞬間iを参照したら、
5でなくi=3だったということには、ならないのでしょうか。
使用し終わったグローバル変数がそのまま再利用
ということなので、ひとつのプロセスが使用中のグローバル変数は、
他のプロセスで再利用(参照)されないで、新しいプロセスは新しいグローバル変数が
割り当てられるんでしょうか。(わかりづらくてすみません)
初期化するだけで大丈夫、という仕組みが難しいです。
解説しているページやアドバイスなどお願いします。
0058nobodyさん
2007/02/15(木) 09:07:33ID:???それはEZ番号ではないですか。auでEZ番号を通知するモードにしていると、公式サイトでなくても
環境変数$ENV{HTTP_X_UP_SUBNO}から取得できます。端末の同定には都合がいいですが、
他のキャリアでは通用しないと思います。やはり、最初のアクセスの時にセッションIDを発行して
引き回すしかないのでは?
0059nobodyさん
2007/02/15(木) 10:55:43ID:???おっかしいなーとおもったらIPマッチ使ってた
0060nobodyさん
2007/02/15(木) 11:25:12ID:???携帯は固有番号をもっている。2chはそれを取得している。IPアドレスはリクエスト毎に可変で、しかも1ページの取得に複数のIPを使うこともある。
固有番号は、(たしかEzWeb以外は)ユーザが許可したらHTTPヘッダに埋め込まれ、仕様は各ベンダーサイトで見れる。
>>57
#!〜から始まる1行目(名前を忘れた)に変数を初期化するオプションがあったはず
0061nobodyさん
2007/02/15(木) 14:47:43ID:???auのケータイは常に EZ番号 (旧サブスクライバID) という個体識別番号を送信している。
Softbank もデフォで全てのサイトに送信されると思った。
DoCoMoは確か投稿時に確認画面がでて、(,,゚Д゚)∩ハイッ!! を押すと個体識別番号が送信される。
携帯から fusianasan を安易にやることは避けたほうがいいし、
Webアクセスもなるべく自宅に設置したGWなどを使うか、全てのサイトで個人情報を入力しないほうがいい。
これは解約まで基本的に不変な情報であり、極めて危険。
ショッピングサイトの情報が漏洩したら、ワンクリサイトにアクセスしただけで、ワンクリ業者が住所などの個人情報を入手できることになるから。
006247
2007/02/15(木) 21:15:09ID:???固有番号を使うのはいろいろ面倒だったのでセッションIDを実装することにしました。
006353
2007/02/15(木) 23:45:03ID:???レスありがとうございます。
マルチスレッドみたいに、ひとつのグローバル変数を参照している
わけではないんですね。はじめだけ初期化すれば、あとは他のプロセスから
影響ないんですね。ふむふむ。
>#!〜から始まる1行目
さっそく調べてみます。ありがとうございました。
0064nobodyさん
2007/02/16(金) 00:11:07ID:???【質問の概要】
Perlスクリプトを記述する際の文字コード種類をUTF-8とした場合の、文字置換の考え方に対する質問です。
【質問の内容】
下記のソースを書いたとします。
#------------------
$char = "aBc";
$char =~ s/a/a/g;
print $char;
#------------------
上記ソースをShift-JISで記述した場合、全角の"B"の文字コードは"8261"のため、半角の"a"の文字コード"61"で2バイト目が置換されてしまい、文字化けしてしまいます。
これと同一のソースをUTF-8で記述すると、半角の"a"が、全角の"a"に置換されます。
この結果を見る限り、UTF-8でソース記述すると、文字置換の際に、1バイト、2バイト目の誤置換を意識しなくてもいいように思うのですが、この認識は間違っているでしょうか?
もし、認識違いの場合は、UTF-8の場合、どのような文字の並びで誤置換が起こるのか、教えていただけると幸いです。
申し訳ありませんが、ご教授ください。
0065nobodyさん
2007/02/16(金) 00:55:50ID:MoploLOUPerl で、以下のCGIを作りました。
1)CSVファイルをアップロード
2)アップロードしたファイルを処理
3)処理したファイルのリンクを表示してダウンロード。
ところが、2)が重くて待たされるので、(MAX数分)
プログレスバーを表示しようと思うのですが、
どうやったらいいか・・・・。
ちゃちゃっと簡単にできる方法があればよろしくお願いします。m(_ _)m
0067nobodyさん
2007/02/16(金) 01:41:11ID:???その結果を見ただけで意識しなくてもいいと判断する事は出来ないが、
正しいUTF-8ではそのような問題や、EUC-JPで良く発生するような
ずれてマッチする問題は起こらないことが保証されている。
参考資料: RFC2279(obsoleteだがUCS-4の範囲を全て表現できるため), RFC3629
というのもUTF-8というエンコーディングは面白い構造をしている。
まずASCIIの範囲はそのままASCIIのために割り当てられていて、
マルチオクテット文字には出現しない。これはEUC-JPと同じ。
で、問題のマルチオクテット文字の表現なのだけれど、
nオクテットで表現されるUTF-8文字は、最上位ビットから
nビット1が連続した後に0が来るようになっている。
全ての非ASCIIのUTF-8文字は2byte以上で表現されるので、
これは1オクテット目が10xxxxxxにならないということ。
そして、2オクテット目以降は上位2ビットが必ず10になっている。
これらによって、マルチオクテット文字中にASCII文字が登場したり、
他のUTF-8文字にずれてマッチするようなことがないことが保証できるわけだ。
さて、ここまではUTF-8に対する一般的な話だが、実はPerl(5.8以降、5.6は怪しい)は
UTF-8を内部エンコーディングとして正式にサポートしている。
文字列にはUTF-8フラグというものが用意されており、
マルチオクテット文字を1文字として扱うことが出来るようになっている。
この辺の話はテンプレ>>3の[Perl5.8Unicodeメモ]にあるサイトが詳しいので、
必要ならとりあえずそっちを読んでくれ。
0070nobodyさん
2007/02/16(金) 06:38:18ID:MoploLOU数倍ならば高速化できますが、100倍はムリだとおもいます。
処理内容は以下に記載。
1)CSVを1行を読み込み。
2)対応するWEBページのURLを作成。
3)上記URLをもとにWEBページをダウンロード。
4)ダウンロードした情報をCSVに付加。
処理時間は 1行あたり凡そ1秒。
既にダウンロードした情報はDBにキャッシュしていますが、
情報量の関係で
「新規にWEBページをダウンロードしなければならない」場合が
発生するのです。
0071nobodyさん
2007/02/16(金) 09:57:57ID:???例えば、AjaxとかCommetとかFlashで何秒おきかに進捗状態を取得して表示するとか。
かなり面倒なことは確か。
0072nobodyさん
2007/02/16(金) 10:28:08ID:???0073nobodyさん
2007/02/16(金) 14:30:20ID:???007464
2007/02/16(金) 19:29:33ID:???丁寧な説明ありがとうございました。
>その結果を見ただけで意識しなくてもいいと判断する事は出来ないが、
その通りですね、すみません・・・
007565
2007/02/16(金) 23:38:29ID:MoploLOUどうもです。
やはり ajax ですか・・・、調べてみます。
0076nobodyさん
2007/02/17(土) 01:22:16ID:???使ったことないけど、シンプルな進捗表示でいいなら
multipart/x-mixed-replace でさくっとできそうな気がする
007776
2007/02/17(土) 01:32:05ID:???やったことある方法では「<script> statusbox.value = "現在5件処理完了"; </script>」
的な1行javascriptをautoflushでprint。
0079nobodyさん
2007/02/17(土) 20:47:43ID:???my @file = <FILE>;
これより効率の良い方法ありますか。
ファイルの中身は最大で100KBです。
共有鯖なので心配で使えません。
0080nobodyさん
2007/02/17(土) 21:23:25ID:???0081nobodyさん
2007/02/17(土) 21:33:47ID:???最終的に何がしたいのか、および何の効率かによる。
メモリ効率を気にしていて、「ファイルの中身を」丸ごと「配列に入れたい」のなら、
その方法だとデータサイズの2倍程度メモリを消費して、
1行ずつpushで代入する方法だとデータサイズと同じ程度だったが。
(perl5.8.7 on FreeBSD5.4調べ)
本当にやりたい事を考えずに配列に代入する効率だけ考えるのは本末転倒というものだ。
0082nobodyさん
2007/02/17(土) 21:44:02ID:???0083nobodyさん
2007/02/17(土) 21:55:29ID:???(ファイルのフォーマットは先頭が数字で固定)
my @log = <FILE>;
my($start,$end) = hoge(); #ユーザーの入力による数字
my $new = ( $log[$#log] =~ /^\d+/s ) ? $& : 0;
my $old = ( $log[0] =~ /^\d+/s ) ? $& : 0;
$start = $old if( $old > $start );
$start = $new if( $start > $new );
$end = $old if( $old > $end );
$end = $ned if( $end > $new );
$end = $start if( $start > $end );
my @choice = print_request_lines(\@log,$start,$end);
sub print_request_lines {
my($log,$start,$end) = @_;
my $count = $start;
$end = $count unless($end);
foreach ( @$log ) {
if ( /^\Q$count\E/s ) {
print;
if ( $count >= $end ) {
last;
}
else {
$count++;
}
}
}
}
あとあとはこんな処理です。長いので一応簡潔にまとめたつもりです。
read(FILE,my $hoge,-s FILE);とか?
気になるのは鯖の負荷です。一日2万弱アクセスあります。
008481
2007/02/17(土) 22:00:24ID:???my @choice = ...
あたりはまとめミスですorz
0085nobodyさん
2007/02/17(土) 22:02:22ID:???83でした。すみません
0086nobodyさん
2007/02/17(土) 22:28:50ID:???指定される範囲は通常データ全体に比べて非常に小さいものかな?
番号がソートされて並んでいるなら二分探索が有効。O(log n)に出来る。
行頭探すのがちょっと面倒だがなー。データ構造を変えることが可能ならば、
あらかじめ番号に対してオフセットを記録しておくような簡単なindex付けを行っておくのが吉。
0087nobodyさん
2007/02/17(土) 23:07:21ID:???指定される範囲は予想ではデータ量の2割りくらいがメインです。
10割りの時もありますが。
二分探索を調べて見ましたが使いまわしできなくなりそうなのでやめました。
結局ファイルを小刻みに分割することにしました。
index付けとは言えませんが、
先に位置情報ファイルを読み込んで該当ファイルを探すといった感じです。
>>81 >>86 大変勉強になりました。ありがとうございました。
0088nobodyさん
2007/02/18(日) 04:57:02ID:???行頭についてる整数値を取得すれば1行読みの1パスで行けるんじゃない?
>if ( /^\Q$count\E/s ) {
の行、$count=10のとき行頭が"100"でもマッチするね
データ構造上無いのかも知れないけど
ちなみに小分けしたファイルのどれから読み込むのかを
要求された値から機械的に算出できるようにするという工夫もあるよ
0089nobodyさん
2007/02/18(日) 09:12:59ID:???>1行読みの1パス
ファイルが100KBを超えるたびに先頭の1行を削除していたので
$new,$oldをどうやって取得するかが問題でした。
>if ( /^\Q$count\E/s ) {
if ( ^\Q$count\t\E/s )にしました。
>機械的に算出
(ファイルを100件刻みで小分け)
my $file = './log/*.dat';
my $fle_numbe = int($start / 100) + 1; #+1は必ずtrueにする為
$file =~ /\*/$file_number/e;
とりあえずこんな感じにしました。
ファイルをまたぐ方法を考え中です。
なんとなくpipeを勉強(`・ω・´)
009065
2007/02/18(日) 17:02:29ID:qiEEvOwU>そんな事、CGIでやるべきではないと気付け。
CSV処理サービスを多数に公開する趣旨にもとづき、CGIで試作しています。
CGI以外で、多数のユーザーに処理サービスを公開する方法がありましたならば、
ご教授願います。
0091nobodyさん
2007/02/18(日) 17:24:45ID:???簡単な方法としては、
(1) HTTP response header を返す。
(2) HTTP body の先頭を返す。
ここで総処理件数を表示しても良い。
(3) 時間の掛かる処理を開始する。
(4) 1件処理毎に何らかのデータを返す。
(プログレスバーのような格好の良い物の代替として)
(5) できあがったCSVをダウンロードするためのリンクを出力。
つまり、プログレスバーの代わりに、(4) で何らかのデータを
返すだけだけどね。
垂れ流し的に「n件目、処理中」ってのが同じページに繰り返し
出ちゃったり、ちょっとかっこわるいけど。
0092nobodyさん
2007/02/18(日) 17:34:02ID:???時間の掛かる処理を開始する前に
<meta http-equiv="Refresh" content="10;URL=hoge.cgi?jobid=123">
みたいなページを返して、定期的に hoge.cgi を呼び出させる。
上記のページをクライアント側へ返したらSTDOUTとSTDERRはcloseする。
hoge.cgi は与えられたパラメータ(例示のjobid=123みたいな)でどの処理か
特定し、処理途中なら進捗具合を返す、の繰り返し。
処理完了なら、CSVダウンロードのためのリンクを返す。
で、どうだろ。
0093nobodyさん
2007/02/18(日) 17:58:06ID:???十分だろ
0094nobodyさん
2007/02/18(日) 18:05:14ID:???割り切って人間に対してはそれでも良いかもね。
しかしHTTP通信上、一定時間データが流れないと、ブラウザ側が
エラーと見なしてしまうことがあるからね。
009565
2007/02/18(日) 20:30:00ID:qiEEvOwUCGI の神のご教授、感謝です。
いままでは local 環境でのプログラミング( kernel層)ばかりだったので、
CGI は可也勝手が違います。
0096nobodyさん
2007/02/19(月) 05:29:32ID:???ちょっとだけファイル書き出しておけばよさそうに感じるけど、そういう感じって出来ないのかね。
処理してるのと別の工程でそのファイル読み出して進展状況とするみたいな感じで。
0097nobodyさん
2007/02/19(月) 07:55:57ID:vpFQD8kwできるよ。一度ユーザに画面遷移してもらうという点では>>92と同じ考え方。
実装では>>92もファイルを書き出すことになるだろうけど。
0098nobodyさん
2007/02/20(火) 02:04:21ID:???use CGI;
$q = new CGI;
foreach($q->param){
といった形のソースで、POSTされたデータをハッシュで受けたいのですが、keyにあたる部分にHTMLでいうところのID要素を与えたいと思います。
ループ内でVALUEは$_で受け取れますが、ID要素に当たる部分を取得する方法はありませんか?
0099nobodyさん
2007/02/20(火) 08:31:07ID:???http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
「スクリプトの渡された全てのパラメータの名前の取り出し」から
「パラメータリストのハッシュでの取り出し」まで読もうな。
0101nobodyさん
2007/02/20(火) 10:36:15ID:???0102nobodyさん
2007/02/20(火) 11:28:45ID:6AwpaKJsApache のアクセスログで、Mozillaが含まれる行だけを削除して他のファイルに出力しようとしています。
以下のようにやったのですが、
syntax error at access_log.pl line 13, near ")
print"
access_log.pl had compilation errors.
と言われてしまいます。どこがいけないのか教えていただけますか?
以下ソース。
#!C:/Perl/bin/perl
$in = 'access_log';
$out = 'access_log_out';
open(IN, $in) or die "$!";
open(OUT, ">$out") or die "$!";
while (<IN>)
{
chomp($_);
if ($_ !~ /Mozilla/i)
print(OUT "$_\n");
}
close(IN);
close(OUT);
0103nobodyさん
2007/02/20(火) 11:32:45ID:???よく見るんだ!!
0104nobodyさん
2007/02/20(火) 11:36:24ID:???それが何か?
>>102 入れ替える。
print(OUT "$_\n")
if ($_ !~ /Mozilla/i);
0105102
2007/02/20(火) 11:38:33ID:???if ($_ !~ /Mozilla/) {
print(OUT "$_\n");
}
と括弧つけたらコンパイル通りました・・・
式が一文だから括弧つけなくてもいいと思ってたのに、
ダメなんでしたっけ?
0108nobodyさん
2007/02/20(火) 11:50:45ID:???Perlでは必ず必要。Cとは違うのです。
以下perlsyn(1)の該当部分。Note that以降に注目。
The following compound statements may be used to control flow:
if (EXPR) BLOCK
if (EXPR) BLOCK else BLOCK
if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK
LABEL while (EXPR) BLOCK
LABEL while (EXPR) BLOCK continue BLOCK
LABEL until (EXPR) BLOCK
LABEL until (EXPR) BLOCK continue BLOCK
LABEL for (EXPR; EXPR; EXPR) BLOCK
LABEL foreach VAR (LIST) BLOCK
LABEL foreach VAR (LIST) BLOCK continue BLOCK
LABEL BLOCK continue BLOCK
Note that, unlike C and Pascal, these are defined in terms of BLOCKs,
not statements. This means that the curly brackets are required--no
dangling statements allowed.
0109102
2007/02/20(火) 12:50:14ID:???入れ違いになってしまいました。ありがとうございます。
>>107,108
なるほどそうなんですね、
Cあがりなので後置というのがすごく違和感あるのですが
頑張ります。
ありがとうございました。
0110nobodyさん
2007/02/20(火) 13:03:25ID:???当たり前の事をあえて書いているので、nameとvalueからidを生成する画期的な技でも隠しているのかと。
0111nobodyさん
2007/02/20(火) 13:05:23ID:???俺はほとんどイディオムと化している next if 〜ぐらいしか後置は使わないな。
いろいろ、好みもあるとは思うがね。
0112nobodyさん
2007/02/20(火) 13:05:26ID:???0113nobodyさん
2007/02/20(火) 13:30:25ID:???0114nobodyさん
2007/02/20(火) 13:37:37ID:???渡しは、より順位が下という理由だけで、ほとんどorを使ってるけど。
0115nobodyさん
2007/02/20(火) 13:52:16ID:???valueが可変なのはtextかtextareaかpasswordぐらいっしょ
その他ならできるんじゃね?
っつーかあんた陰でイヤミって呼ばれてるっしょ?
0116nobodyさん
2007/02/20(火) 13:56:54ID:???漏れは必要なときだけorかな
・条件文の中では||
・式をショートサーキット評価するときも||
・文をショートサーキット評価するときはor
while ($x || $y) {
my $hoge = $fuga || parse() or die 'Parse error';
...
}
実際にこんな組み合わせて書くことはないけれどこんな感じで
0117nobodyさん
2007/02/20(火) 14:12:04ID:???どうでもよくて制御構造っぽく使うときだけ。
0118nobodyさん
2007/02/20(火) 14:22:08ID:???0119nobodyさん
2007/02/20(火) 14:45:36ID:???ロクな検討もしていない思いつきを垂れ流されると振り回されて迷惑。
nameとvalueが予め列挙できている事で可能になる、idの生成方法なんて考えて無いでしょ?
0120nobodyさん
2007/02/21(水) 18:22:26ID:???スクリプトの記述は、cgi呼び出されたら、
・wgetで、hoge.txtを指定して実行
・カウントをひとつ足して記録
こんな感じでしょうか?
wgetでダウンロードできるでしょうか。
0121nobodyさん
2007/02/21(水) 18:23:28ID:u+1RH8XXhoge.txtがどこにあるかしらないが、同じサーバ上にあるなら普通にopen()して読み取ればいいんじゃないの?
0122nobodyさん
2007/02/21(水) 21:25:39ID:???待たずに即座に終了させたい。
↓こんなサブルーチン作ったけど確認できないのでご教授ください。
sub FileLockEX {
# use Fcntl ':flock';
my($fh,$lockfile) = @_;
open($fh,"> $lockfile") or die;
if ( flock($fh,LOCK_EX|LOCK_NB) ) {
return $fh;
}
else {
die;
}
}
0123nobodyさん
2007/02/21(水) 23:08:58ID:???以上
次どうぞ
0124nobodyさん
2007/02/21(水) 23:34:29ID:???0125nobodyさん
2007/02/21(水) 23:41:16ID:???0126nobodyさん
2007/02/21(水) 23:56:26ID:???【Perl】ファイルロック(排他処理)について語ろう
http://pc10.2ch.net/test/read.cgi/php/1024795138/
0128nobodyさん
2007/02/22(木) 19:13:48ID:???レス遅くなりました。
いただいたアドバイスの意味がわからなくて、
時間かかってしまいました。
print "Content-type: application\/download\n";
print "Content-disposition: filename=\"$filename\"\n\n";
open(FILE,"< $filename") || die "$filename open失敗しました";
binmode(STDOUT);
binmode(FILE);
while (<FILE>) { print; }
close(FILE);
いろんなページ見ながら、上記のようになりました。
Content-type:
は、ダウンロードするファイルの種類によって、変えるんでしょうか。
意味がわからなかったりしますが、ちょっとずつ勉強したいと思います。
ありがとうございました。
0129nobodyさん
2007/02/22(木) 21:18:05ID:???0130nobodyさん
2007/02/23(金) 01:48:29ID:zpF2/r1popen(FILE, '>:encoding(cp932)', $fn) or die;
のようにしてUTF-8の文字を、Shift-jisに変換しています。
UTF-8には存在する文字でShift-jisに存在しない文字の場合、
エラーが発生し、UTF-8の文字コードが表示されてしまうの
ですが、Shift-jisに存在しない文字コードの場合は表示を
しないようにする(空白に変換する等)にはどのようにしたら
よいでしょうか?
0131nobodyさん
2007/02/23(金) 02:49:49ID:???perldoc Encode して
Handling Malformed Data
のあたり読んでみそ。
お好きなように選択してくださいな。
0132nobodyさん
2007/02/23(金) 21:26:44ID:vPX/8GZG$urlが存在しない場合、(http://fugahoge.zubazubaとか)
以下のコードで、(A)に対して3秒タイムアウトが効きません。
(B)には効きます。
$request = GET($url);
eval{
local $SIG{ALRM} = sub { die "timeout\n" };
alarm (3);
$res= $ua->request($request);--------------(A)
# sleep 10;---------------------------(B)
alarm 0;
};
alarm 0;---------(C)
if($@) {
if($@ =~ /timeout/) {
# タイムアウト時の処理
#fugafuga
} else {
# その他例外時の処理
}
}
}
もう死にそうです。5時間ほど寝てません。
0133nobodyさん
2007/02/23(金) 21:35:25ID:???0134nobodyさん
2007/02/23(金) 21:40:39ID:vPX/8GZG存在しないマシンをさっさと検知したいのです。
ちなみに対象ホストはpingかけても無応答が20秒くらい続くようなマシンです。
0135nobodyさん
2007/02/23(金) 22:08:15ID:???or
LWP + fork
ttp://www.gac.jp/article/index.php?stats=question&category=12&id=16922&command=msg
0136nobodyさん
2007/02/23(金) 23:24:55ID:???ならば、Net::DNSで自分で引く。
0137nobodyさん
2007/02/24(土) 02:30:49ID:???0138nobodyさん
2007/02/24(土) 02:39:06ID:???0139nobodyさん
2007/02/24(土) 15:19:31ID:8+oB65y+整数だけの四則計算を数万回繰り返して結果を返すというのを作っているので
すが(÷は小数点以下切捨て)、結果が変になる場合がありました。
調べてみると、途中に非常に大きな数値が一つでもあるとそこでずれるというの
までは分かったのですが、正常に計算できる限界というのはどこまでなのでしょうか?
(perl v5.8.5, kernel-2.6.9-34)
0140nobodyさん
2007/02/24(土) 15:41:17ID:???有効桁数については前スレで既出。まだ落ちてないようだから行ってらっしゃい
http://pc10.2ch.net/test/read.cgi/php/1164519503/641-681
計算方法を見直すか、根本的に解決するにはMath::BigInt
0141nobodyさん
2007/02/24(土) 16:33:44ID:8+oB65y+あと、BigInt も軽くテストしてみてokだったので、実際に組み込んで
動かしてみましたが、結構遅いのですね。計ってみましたが300倍ぐら
い遅いです。
正確さをとるか速さをとるかのトレードオフなんですね。
0142nobodyさん
2007/02/24(土) 16:55:27ID:8+oB65y+0143nobodyさん
2007/02/24(土) 16:56:46ID:???Math::BigIntはPurePerlな実装だからね…
Math::BigInt::GMPとかXSによる実装があるから、
コンパイルできるならこれらを使うとそれなりに速くなると思うけれど。
http://search.cpan.org/search?query=Mathh%3ABigInt&mode=dist
0144nobodyさん
2007/02/24(土) 17:10:20ID:K7bQHZEYopen(FH,"$hoge");
@hoge=<FH>;
close(FH);
foreach $hoge (@hoge){
($Hoge,$HOge,$HOGe,$HOGE)split($hoge)
#その他処理
}
というのがあるんですが、上のを下記の記述に変更した場合、
サーバーへの負荷とかどのように変わってくるか、具体的な数字は分かりますか?
open(FH,"$hoge");
while(<FH>){
($Hoge,$HOge,$HOGe,$HOGE)split($_)
#その他処理
}
close(FH);
下の方が無駄に変数やリストを使わなくなるので軽いような気はしてるんですが、
イマイチ確信がもてないのです、実際どうなんでしょう?
0145nobodyさん
2007/02/24(土) 18:11:51ID:???0146nobodyさん
2007/02/24(土) 18:42:29ID:8+oB65y+有難うございます。
すぐコンパイルが出来ず確認できないのですが、今度やってみます。
0147nobodyさん
2007/02/24(土) 18:58:10ID:???0148nobodyさん
2007/02/24(土) 20:14:03ID:8+oB65y+45 / 20 = 2.25 (割り切れる)
45 / 21 = 2.1428.. (割り切れない)
0151nobodyさん
2007/02/24(土) 20:57:13ID:???割り切れるか否かは基数によって変わるわけであって、
コンピュータでの小数表現は2を基数とするのが一般的。
つまりコンピュータにとっては1/5は「割り切れない数」なわけだが、>>148はどうしたいんだろうね。
まあともかくnを基数としたときに割り切れるかは、
その分数を約分した分母がnの素因数の積で構成されているかを判定すればOK
0152nobodyさん
2007/02/24(土) 20:57:37ID:???m,nの最大公約数を求める。lとする。
n/lが2^x * 5^y(x,yは0以上の整数)という形ならOK
最大公約数の求め方はユークリッドの互除法でも調べてください。
後半は2と5でそれぞれ割り切れるだけ割っていって最後1になるか判定
という感じでいけるんじゃないか?
0153nobodyさん
2007/02/24(土) 21:51:38ID:Iwese7yM∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧
______ < 踏んだら孕んだ!抱いたら揉んだ!
/:::::::::::::::::::::::::::::ヽ < 孕んだ振る降る般若だ!
/::::::::::::::::::::::::::::::::::::ヽ < ティムポ擦る無駄、フン出る春巻きはむ無理!
|::"´ ̄ ̄ ̄ ̄ ̄ヽ:::| < チン毛ちぎり、看板塗る飛騨!
|:::| |:::| < 陰毛臭いんだ!モッコリ膨らんだ!
ヽ/ -=.、 _,=- ゾ < 安打!?半田ゴテ適時打!!
| | -ェゝ ";ュ- |ヽ < 原チャリ盗んだ!あんだとこら!?
ヽト、 ´i ` ,.イ/ < よくちょん切れるハサミだ!
〈 i /L_、 i 〉 _ノ∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨
__,. -‐ヘ -=三=- /──、
_ -‐ ''" / \ /\  ̄゛ー- 、
ハ / |ヽ ̄ ̄// ヽ、 ∧
| ヽ く ! .>ーく / > / !
| | _> ∨-、r‐/ <_ / !
∧ ! ヽ | 厂L/ ■/ i .∧
/ \ | \ ∨ ! / | / ハ
0154130
2007/02/24(土) 23:31:04ID:WjAlsxOjは「?」に変換したいと考えてます。
この場合どのようになコーディングをしたらよいでしょうか?
せっかく131の方が答えてくれたんですが、
よくわかりませんでした。。すみません。。。
0155nobodyさん
2007/02/25(日) 00:25:19ID:???$CGI::POST_MAX = 1024*1024;とせずに
ファイルサイズを調べて1MBより大きい場合にはじくのとでは
サーバへの負担が違いますか?
あと、POST_MAXを指定してサイズがオーバーしていた場合に
処理が取り消されたという情報はどこかに入るのでしょうか?
0156155
2007/02/25(日) 00:29:49ID:???最初にやってみるべきでした。
スレよごし、すいません。
0159nobodyさん
2007/02/25(日) 07:00:21ID:???$hoge = 11 ;
$foo = 3 ;
if ( $hoge % $foo == 0 ){
}
0160nobodyさん
2007/02/25(日) 07:31:31ID:???結局質問には一応だけど答えてるツンデレなんだし。
0161nobodyさん
2007/02/25(日) 08:41:45ID:???>>148をもう一回よく読んでみ
45 % 20 は0じゃないが割り切れると判断するんだぞ
0162nobodyさん
2007/02/25(日) 09:25:01ID:???0163nobodyさん
2007/02/25(日) 09:26:01ID:???0164nobodyさん
2007/02/25(日) 09:38:58ID:???0165148
2007/02/25(日) 10:16:04ID:k71AVSTb>>149,159,160
% で解決できるなら助かるのですが(>_<)
質問は理解し易く『 45 / 20 = 2.25 』と書いたつもりだったのですが、
難しかったようで、失礼しました。
>>152
有難うございます。
難しい・・・。もうちょっと勉強します。
>>162,163
有難うございます。10倍しても、1億倍してもどこで諦める瞬間を作らないと
いけないですよね。もしかしたら1億1倍のところで割り切れるかもしれない。
>>161 thank you...
0167nobodyさん
2007/02/25(日) 13:02:07ID:???0168nobodyさん
2007/02/25(日) 13:02:55ID:???0169nobodyさん
2007/02/25(日) 13:04:45ID:???0170nobodyさん
2007/02/25(日) 13:13:05ID:???数IIIは履修してるけど数ABCを履修してねぇww
0171nobodyさん
2007/02/25(日) 13:41:55ID:???use bignum (a => 50);
sub is_terminating($) {
(my $n = shift) =~ s/0*$//;
return not ($n =~ /\.\d*(\d+)\1/);
}
for my $i (1..25) {
my $n = 45 / $i;
my $s = is_terminating($n) ? "terminating" : "non-terminating";
print "45/$i is $s.\n";
}
というのはどーお?
0172148
2007/02/25(日) 14:24:42ID:k71AVSTb有難うございます。
なんか出来そうですけど、2323 / 1000 なんて場合にちょっと無理ですね。
でもそうしたら今度は元の数字が循環してるかを調べればいいのかな?
ん?でも2つの値が関連するし...。どうだろ、無理かな?
もうちょっと試してみます。有難うございます。
0173nobodyさん
2007/02/25(日) 18:42:00ID:???やってた頃の成績はやたら良かったけど。
0174nobodyさん
2007/02/25(日) 22:31:59ID:???0175nobodyさん
2007/02/26(月) 05:06:09ID:1VnrxNPdレンタル鯖に、欲しいモジュールが入っていないときには
どうすればいいでしょうか。
鯖管理者に要望を投げても無視されて、
「欲しいモジュール」を自力でコーディングするのもカッタルイというときです。
「hogehoge モジュールを CPAN からダウンロードしてインストールするなんて技はアリですか?」
(管理者権限の関係からムリっぽい気が・・・)
0176nobodyさん
2007/02/26(月) 05:54:19ID:???0177nobodyさん
2007/02/26(月) 06:41:20ID:???Jcode.pm/jcode.plみたいに。
0178nobodyさん
2007/02/26(月) 06:52:35ID:???0179nobodyさん
2007/02/26(月) 08:24:24ID:???0180nobodyさん
2007/02/26(月) 13:35:52ID:QboTsacU「b.cgi」内のサブルーチン「second」を実行するにはどうすれば良いでしょうか?
0181nobodyさん
2007/02/26(月) 13:44:05ID:???悪いことは言わないのでsecondはb.cgiから外に出して別ファイルにして、
a.cgiとb.cgiからuseかrequireするようにしとけ。
0183nobodyさん
2007/02/26(月) 14:48:32ID:aE2N5fUYという配列があったとして、例えば3番目の要素を削除して
@hoge = ('a','b','d','e');
とする方法が分かりません。
foreachで特定の要素を「空」にすることはできるんですが
その要素自体を削除するような方法はないでしょうか?
0185183
2007/02/26(月) 15:06:54ID:???ズバリな関数があったんですね…勉強不足です。
foreachで「空以外なら」という条件式でゴリ押ししてた現状から抜け出せます。
ありがとうございました。
0186nobodyさん
2007/02/26(月) 15:38:34ID:04bnguupファイル内容が垂れ流されてきてしまいます。
print "Content-type: application/x-gzip; name=archive.gz";
print "Content-Transfer-Encoding: base64";
print "Content-Disposition: attachment; filename=archive.gz";
ヘッダーの設定が間違ってるようですが、どう直せばいいでしょうか?
よろしくお願いいたします。
0187nobodyさん
2007/02/26(月) 15:45:12ID:???で、ヘッダーの終了部分には連続改行が必要
これ常識ね
0188nobodyさん
2007/02/26(月) 15:46:32ID:???あ、抜け落ちてるみたいですが
\\n これででるかな(改行)
をつけ、最後のprint には 連続改行をいれております
もうしわけありません
0189nobodyさん
2007/02/26(月) 15:47:39ID:???0190nobodyさん
2007/02/26(月) 15:51:58ID:???0191nobodyさん
2007/02/26(月) 15:53:52ID:???0192nobodyさん
2007/02/26(月) 15:54:29ID:04bnguup#mine.type
application/x-gzip gz
#httpd.conf(apache)
AddEncoding x-gzip .gz .tgz ← これいらない?
AddType application/x-gzip .gz .tgz
の設定をしてあります
しかし、 >>186 のヘッダがあるものを呼び出すと
Content-type: application/x-gzip; name=archive.gz
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=archive.gz
・ ハ・Eワスロrc9懲{ュシ姨ヒ`J、ホ�賜籌Rー%Eeeオオオ1(F・畑ヲ、ャP=~,8 ・・・・
というような出力になってしまいます。
0193nobodyさん
2007/02/26(月) 15:58:00ID:???ソースを見返したら、先頭に
print "Content-type: text/html\n\n";
の一行が入っていました
大変お騒がせいたしました。
申し訳ありませんでした・・・・
0194nobodyさん
2007/02/26(月) 17:18:08ID:???0195nobodyさん
2007/02/27(火) 22:15:55ID:LieiSn0Nperl から Windows アプリケーションを制御したいんですが、
そういうモジュールはありませんか?
たとえば、アプリケーションを起動したのち、
Alt-F でファイルメニューを開いて・・・とか、
アプリケーションを perl スクリプトで操作したいのです。
いや、コマンドラインで制御できるとよいのですが、
コマンドラインの引数を解釈してくれないアプリなのです。
0196nobodyさん
2007/02/28(水) 01:50:24ID:???0197nobodyさん
2007/02/28(水) 02:21:12ID:???とかで自動的にfoo.txtを読み込んでくれないよーなアプリってことかな。
0198nobodyさん
2007/02/28(水) 06:08:06ID:???そんなことをするなら最初からJScriptやVBScriptでやったほうが楽だけど。
0199nobodyさん
2007/02/28(水) 06:32:17ID:wbAOzWAx中身は aaaaa bbbb ccc ddd adwg
なら、5となります.重複は考えなくもいいです。半角英文字です
どのようにすればよいでしょうか? (*- -)(*_ _)ペコリ
0201nobodyさん
2007/02/28(水) 08:41:36ID:???while($comment =~ /([a-z0-9']+)/gi) #英単語数のカウント
{
$count++;
if($count > 10000){last;} #無限ループ対策
}
0202199
2007/02/28(水) 09:06:30ID:???最近、乱打無な栄単語を打ち込むスパマーやろうがいまして。。
ありがとうございます
0206nobodyさん
2007/02/28(水) 15:34:08ID:BEaWUL0P今はwgetをひたすら呼んでました。javascriptのページはよめないです。
CPAN探したのですが、LWPってので、できるのかはっきりしませんでした。
0207nobodyさん
2007/02/28(水) 15:40:23ID:???0208nobodyさん
2007/02/28(水) 19:43:20ID:Oefi/gxXとりあえず試したところでは、第一引数を「ファイルー開く」の入力としては解釈するようです。
その他のコマンドラインオプションは皆無。
アプリは「英和翻訳ソフト」です。
特殊辞書を使う翻訳なのと、翻訳内容が極秘なんで excite.co.jp 等は使いたくないのです。
>>198
WSH でぐぐった所、これですよ! ありがとうございました。
0209nobodyさん
2007/03/01(木) 12:17:01ID:???一部のURLの場合は変換をして表示 という処理を考えてます。
# リファラをindexで調べ含まれる場合は該当サイト名に変換
if (0 <= index($referer,'http://search.yahoo.co.jp/')) { $search = 'Yahoo'; }
elsif (0 <= index($referer,'http://www.google.co.jp/')) { $search = "Google"; }
# 上記以外にもelsifが続く
と上記のような冗長なコードになったのですが、
もっといい方法などありましたら御教示お願いします。
0210nobodyさん
2007/03/01(木) 13:02:53ID:???あんまり変わらないかもしれないけど・・
my @SEARCH = ('http://search.yahoo.co.jp/<>Yahoo','http://www.google.co.jp/<>Google');
map{my($u,$n)=split/<>/;$search = $n if 0 <= index $referer,$u;}@SEARCH;
もっとスマートな方法あるんだろうけど漏れにはこれが限界..
0211nobodyさん
2007/03/01(木) 13:13:18ID:???auで動作不良があるんです。
まずは簡単に状況説明します。
◎検索ページ(フォーム入力後動作)
→検索条件をフォームで入力後、サブミット
→検索結果のページが表示されずエラーメッセージが出る
◎表示データを一定数で区切って次ページに行く(フォーム入力後動作)
→プルダウンで飛ぶ先のページ数を選択後、サブミット
→ページが表示されずエラーメッセージが出る
エラーメッセージは共通で以下の通りです。
---------------------------------------------
cgi-lib.pl:Unknown Content-type:application/
x-www-form-urlencorded; charset=shift_jis
---------------------------------------------
なんだろう。docomoは何ともないんだけれど。
0212209
2007/03/01(木) 13:23:34ID:???すんませんw 一行プログラミングのように単に短くしたいって意味ではなかったです。
解析部分を関数で別ファイルにする予定なので、
elsif行が続くのは別にいい(しょうがない)と思ってるのですが、
Perl歴が少ないので処理方法自体には問題ないか不安です
0213nobodyさん
2007/03/01(木) 13:52:05ID:???ttp://sb.xrea.com/archive/index.php/t-10224.html
ぐぐってみるとココでも話題になってるね
cgi-lib.plのソースを見てみたけど、AUの場合環境変数のCONTENT_TYPEが
ちょっと変わっててエラーになるようだから
cgi-lib.plの81行目の
$type eq 'application/x-www-form-urlencoded') {
を、以下に変えるといけるかも・・
$type eq 'application/x-www-form-urlencoded' || $type =~ /application\/x-www-form-urlencorded/) {
もしくは以下
$type eq 'application/x-www-form-urlencoded' || $type =~ /x-www-form-urlencorded/) {
cgi-lib.plはform-urlencodedで処理してるけど、
AUはx-www-form-urlencordedだから一致しなくてエラーになってるんだと思う・・たぶん..
0214211
2007/03/01(木) 15:30:30ID:???ありがとうです! 自分もぐぐってみて、
”cgi-lib.plがエージェントのうちCHARSETに対応していない”とかなんとか、
81行目までは見当を付けられたんですが、具体的な書き換え記述が見あたらなくて参ってました。
まず213さんの書き換えで試してみます。
AU手元にないんで、確認後結果報告に参ります。
ようするに、HTTP_REFERERに含まれる文字列によって、変数$searchに特定の文字列を代入するって事かしら?
my $search;
my %Exchange_Strings = (
'yahoo', 'http://search.yahoo.co.jp/',
'Google', 'http://www.google.co.jp/',
);
for my $hash_key (keys %Exchange_Strings){
next if index($referer, $Exchange_Strings{$hash_key}) != $[ - 1;
$search = $hash_key and last;
}
0216nobodyさん
2007/03/02(金) 00:28:43ID:???Net::telnetモジュールを利用し、サーバーへTelnet接続し
取得したデータをhtmlで返すCGIをコーディングしています。
telnetログインする側のサーバのレスポンスが遅い為、一度に
複数のコネクションを確立し、接続した全てのサーバへリクエストを
投げて応答を待つシステムを構築したいのですが方法がわかりません。
現在は単一のサーバに対してアクセスを実施し(timeout->120程度)
forループで順次接続しなおす構成になっています。
なにか良い方法があれば是非ご教示下さい。
0217nobodyさん
2007/03/02(金) 02:51:40ID:???0218nobodyさん
2007/03/02(金) 11:40:00ID:???とりあえず糞トリ目障り
0219nobodyさん
2007/03/02(金) 13:00:32ID:???目障りなら NG ネームに指定すればいいでしょ
トリップ無しだと NG 指定することができないから、余計目障りだよ?
0220nobodyさん
2007/03/02(金) 13:19:36ID:???0221nobodyさん
2007/03/02(金) 16:33:38ID:ShHoFtwt変換したいのでですがうまくいきません。
例えば「12x20」を「12×20」にする、といった感じです。
当然ですが、
s/\d+x+\d/\d+×+\d/
では無理でした・・・。
どなたかアドバイスお願いします。
0223nobodyさん
2007/03/02(金) 16:50:46ID:ShHoFtwt即レスありがとうございます。
カッコでグループ化したものを呼び出せるんですね。
s/(\d)+x+(\d)/\1×\2/
ということでしょうか。
ただ、これだと
「12x20」が「2×20」になってしまいました。
\dは数字1文字のはずなのになぜ??
0224nobodyさん
2007/03/02(金) 17:18:44ID:???としてないのはなぜ?
0226nobodyさん
2007/03/02(金) 17:22:59ID:???前後の数字だけ保存すればいいんだから(¥d)x(¥d)で十分。
xにも+が付いてるあたり、理解が怪しくはある。
0227221
2007/03/02(金) 17:36:02ID:???225さん、226さんがご指摘の通り、
「+」の意味を間違えて捉えていました・・・。
自分がやりたかったkとは(\d)x(\d)でした。
224さんの方法でもできました。
正規表現の外で呼び出すことはないので、
s/(\d)x(\d)/\1×\2/
を使おうと思います。
レスを下さった方、親切に教えて下さり本当にありがとうございました。
とても勉強になりました。
0228nobodyさん
2007/03/02(金) 18:32:23ID:5GKaYECYトップページからindex.cgi?lang=ja と index.cgi?lang=en で下記のsub ja と sub enのそれぞれへ移動するようにしたいのですが、どのように処理したらよろしいのでしょうか?
#!/usr/bin/perl
$script = "index.cgi";
################################
#↓の処理の仕方を教えてください。
################################
if ($lang eq "ja") { &ja; }
elsif ($lang eq "en") { &en; }
################################
print "Content-type: text/html; charset=EUC-JP;\n\n";
print <<EOM;
<a href="$script?lang=ja">日本語</a> <a href="$script?lang=en">英語</a>
EOM
#日本語訳
sub ja {
print <<EOM;
日本語訳ページ
EOM
exit; }
#英語訳
sub en {
print <<EOM;
英語訳ページ
EOM
exit; }
0229nobodyさん
2007/03/02(金) 18:52:39ID:???>>1を読んでちょ
print "Content-type: text/html; charset=EUC-JP;\n\n";
を条件文の前にしてみたらどうかな
0230nobodyさん
2007/03/02(金) 19:50:22ID:5GKaYECYindex.cgiで表示されているリンクをクリックしても、URLがindex.cgi?lang=jaと
なるだけで、下記の
if ($lang eq "ja") { &ja; }
elsif ($lang eq "en") { &en; }
条件式では、sub jaやsub enには移動しない状態です。
index.cgi?lang=enでsub enの内容を表示させるためには、
何が足らないのか、間違っているのかわからない状況です。
0231nobodyさん
2007/03/02(金) 19:55:29ID:???フォームの内容はどこかで取得してるのかな?
0232nobodyさん
2007/03/02(金) 20:31:35ID:???0233nobodyさん
2007/03/02(金) 22:29:38ID:???http://pc11.2ch.net/test/read.cgi/tech/1166708139/
PATH_INFOをHTMLに出力する場合、以下のエスケープ方法で大丈夫でしょうか。
2バイト文字の処理行っていない点が気になるのですが。
$path = $ENV{'PATH_INFO'};
$path =~ tr/+/ /;
$path =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$print_path = $path;
$print_path =~ s/&/&/g;
$print_path =~ s/>/>/g;
$print_path =~ s/</</g;
$print_path =~ s/"/"/g;
$print_path =~ s/'/'/g;
print $print_path;
0234nobodyさん
2007/03/02(金) 23:07:02ID:???#!/usr/bin/perl
use strict; use CGI;
my $script = "a.cgi";
my $in = new CGI; my $lang = $in->param('lang'); $lang = 'none' if (($lang ne 'ja') && ($lang ne 'en'));
my %pagetitle = ('ja' => '日本語のページ', 'en' => '英語のページ', 'none' => 'いんでっくす');
print "Content-type: text/html; charset=euc-jp;\n\n";
print "<html><head><title>$pagetitle{$lang}</title></head><body>";
if($lang eq "ja"){ &page_ja; }
elsif($lang eq "en"){ &page_en; }
else{ &none; }
print "</body></html>";
exit;
#########################
sub none{ print "<a href=\"$script?lang=ja\">日本語</a> / <a href=\"$script?lang=en\">英語</a><br>"; }
sub page_ja{ print "日本語訳ページ"; }
sub page_en{ print "英語訳ページ"; }
0235nobodyさん
2007/03/02(金) 23:44:30ID:???$hash{$n} = $v;
のようなことをよくやるのですが、
もっとスマートィな書き方はないでしょうか?
0236nobodyさん
2007/03/02(金) 23:57:38ID:???リストは1次元に展開されてしまう
の2つを利用して、
%hash = (%hash, split(/,/, $line))
でいいのかな。
0238nobodyさん
2007/03/03(土) 00:24:52ID:???ループの中で繰り返しやってる場合、ハッシュを作っては捨て
作っては捨てになるから、splitの結果だけテンポラリなリスト
にpushしていって、最後にハッシュ化したほうがいいかも。
0240nobodyさん
2007/03/03(土) 11:39:50ID:???ありがとうございます。遅くなって申し訳ないです。
色々読んで、myでローカル変数化する
ハッシュに対応するkeyとvalueを代入して、forでループさせてlastで終了
とかは理解できたのですが、
next ifの行で比較している $[ - 1 は数値でしょうか?
あとは他にもこういうループで
foreach $key ( keys %hash ) や while ( ($key, $value) = each(%hash) )
などの方法がありますが、どれが適してますでしょうか?
0241nobodyさん
2007/03/03(土) 11:51:27ID:???indexは見つからなかった場合に $[ より1小さい値を返す。
普通は $[ = 0; した状態だが、世の中には $[ = 1; としている人もいる。
$[ - 1 と書いてあれば両対応できる。
eachで返される値は制御が出来ないけど、keysでキーを取ってくるなら
sortするなどの制御が可能。
それ以外はここではfor keysでもwhile eachでもあんまり変わらん。
0243240
2007/03/03(土) 12:33:09ID:???ありがとうございます。
$[ は検索できず困ってたのですが、おかげさまで何となく分かりました。
ttp://www.rfs.jp/sb/perl/02/05.html
ハッシュのループ方法に関しては↑などを見たのですが、
DBでORDER BYを使い、順序も正確に欲しい場合はどうすればよいでしょうか?
今回の場合は、訪問が多いリファラを最初に比較したほうがループを少なくできるのですが
0244240
2007/03/03(土) 13:31:13ID:???下記のような感じにしてみましたが、これは変だという箇所ありますでしょうか?
my $referer = $ENV{'HTTP_REFERER'};
my $search;
my @url = (
'Yahoo', 'http://search.yahoo.co.jp/',
'Google', 'http://www.google.co.jp/',
'Google', 'http://www.google.com/'
);
for ( $i=0; $i<=$#url; $i++ ) {
my $tmp = $url[$i];
next if ( index($referer, $url[++$i]) < 0 );
$search = $tmp and last;
}
→今回の場合は、訪問が多いリファラを最初に比較したほうがループを少なくできるのですが
多い少ないが判っているようでしたら優先順位を付与してあげると良いかもですね♪
my %url = (
'Yahoo' => {
'priority' => 1
'referer' => 'http://search.yahoo.co.jp/'
},
'Google1' => {
'priority' => 2
'referer' => 'http://www.google.co.jp/'
},
'Google2' => {
'priority' => 3
'referer' => 'http://www.google.com/'
}
);
for my $temp (sort $url{$a}->{priority} <=> $url{$b}->{priority} keys %url) {
next if index($referer, $url{$temp}->{referer}) != $[ - 1;
$search = $temp and last;
}
そろそろ頭の中がこんがらがってきました(哀)
0247nobodyさん
2007/03/03(土) 14:59:57ID:???1) $[は@hogeの時の$hoge[0]?
2) それとも0?別の例だと$hoge[9]だった場合の9?
3) もしくは配列が@mage = (undef,undef,222,undef,444,);の場合の$mage[2]になる?
(こんな風に配列にundef入れた事無いから、そもそもやっていいのかさえわからないけどw)
調べてみたけど、ろくに検索に引っかからないから厳しいわ。
0248nobodyさん
2007/03/03(土) 15:30:11ID:???それだとGoogleが分かれてしまうのと、後でパターンを増やすのが面倒なので×
処理速度も遅そうかな
( index() != $[ - 1 ) と ( index() < 0 ) は等価じゃないの?
0249nobodyさん
2007/03/03(土) 16:21:57ID:???$[は、リストの先頭の要素を指すために使う「添え字の値」。
$[ = 0; (デフォルトはこれ)
と代入すると、要素数5の@fugaの各要素は
$fuga[0], $fuga[1], $fuga[2], $fuga[3], $fuga[4]
で参照される。
先頭の要素である$fuga[0] は $fuga[$[]でも参照できる。
$[ = 1;
と代入すると、要素数5の@fugaの各要素は
$fuga[1], $fuga[2], $fuga[3], $fuga[4], $fuga[5]
で参照される。
先頭の要素である$fuga[1] は $fuga[$[]でも参照できる。
>>248
indexが、要素が見つからなかったときに返すのは、-1ではなく
そのときの $[ より1小さい値。
$[ = 1;していると、見つかれば1以上の値、見つからなければ0を返す。
以上のことは
$ perldoc perlvar
$ perldoc perlfunc
で調べました。
0250nobodyさん
2007/03/03(土) 16:35:41ID:???$[ は配列の先頭の添え字を何にするか決めているってことですね?
デフォルトは通常 0 と。
0251nobodyさん
2007/03/03(土) 16:46:46ID:???perldoc perlvar でもいいけど。
重複させないようにとなると、DB_FileあたりのR_DUPが必要になるかなぁと。
あと、頻度が多い順っていう優先順位を付けることで処理速度の低下を余計なループを減らす方向で防いでみようと思ったものでして。
このあたりは実際に回してみてベンチなりを取ってみなきゃですね。
ってことでこの辺りの手法はRock54回路でも悩んでいたりしました。
0253nobodyさん
2007/03/03(土) 18:16:00ID:???うーん、わざわざプライオリティのフィールド作るより
ハッシュじゃなく配列で先頭から頻度順に並べて処理じゃスマートじゃないかな?
0257nobodyさん
2007/03/03(土) 20:59:50ID:???index() にこだわらなけりゃもっと簡単且つ柔軟になるけどな。
my @referer = (
Google => qr|^http://www\.google\.co(?:m|\.jp)/|,
Yahoo => qr|^http://search\.yahoo\.co\.jp/|,
Yahoo => qr|^http://search\.yahoo\.com/|,
);
for (my $pos = 0; $pos < $#referer; $pos += 2) {
$referer =~ /$referer[$pos + 1]/
and $search = $referer[$pos], last;
}
0258nobodyさん
2007/03/04(日) 01:36:11ID:???0259nobodyさん
2007/03/04(日) 12:19:16ID:???>>258のヒントを元にしたんだがこれでどうかな
my $referer = $ENV{'HTTP_REFERER'};
my $search;
my %url = (
'http://search.yahoo.co.jp/' => 'Yahoo',
'http://www.google.co.jp/' => 'Google',
'http://www.google.com/' => 'Google',
);
if ($url{$referer}){
$search = $url{$referer};
}
0260nobodyさん
2007/03/04(日) 13:41:29ID:Zr7BSS6Zmy $referer = $ENV{'HTTP_REFERER'};
my $search;
@referer_element = split ".",$referer;
if($referer_element[@referer_element-1] eq "com" ) {
$search = $referer_element[@referer_element-2];
} else {
$search = $referer_element[@referer_element-3];
}
0261nobodyさん
2007/03/04(日) 13:44:51ID:Zr7BSS6Zしまった、
'http://search.yahoo.co.jp/hoge.hoge の場合の処理が抜けてた
my $referer = $ENV{'HTTP_REFERER'};
my $search;
@referer_element0 = split "/",$referer;
@referer_element = split ".",$referer_element[2];
if($referer_element[@referer_element-1] eq "com" ) {
$search = $referer_element[@referer_element-2];
} else {
$search = $referer_element[@referer_element-3];
}
0262nobodyさん
2007/03/04(日) 18:25:42ID:hNT7iFvKhttp://abc/abc.cgi?a=10&b=20&c=30
みたいな感じでリンクした先のページが、au携帯だけうまく表示されません。
PCやドコモ携帯はちゃんと表示されるのですが、auは特殊な仕様なのでしょうか?
0264216
2007/03/04(日) 21:04:47ID:cYBOup8B0266nobodyさん
2007/03/05(月) 09:19:57ID:???ソースはこんな感じです。
$message =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<a href="$2" rel="nofollow">$2<\/a>/g;
(質問1)
([^=^\"]|^) についてです。
前者の ^ は 「を含まない」 を意味し、後者の ^ は行の先頭を意味するものだと思います。
(ただ、1行ずつ処理しているわけではなく $message には記事の全てが入っているので、記事の最初という意味になります。)
そして、[^=^\"] の 2番目の ^ は、単なる リテラル(普通の文字) として扱われますよね。
これは、'=' と '^' と '"' を含んでいないという意味になるはずですが、記事の最初に '=' とかがあったとしても、
正しくリンク処理されます。
これは何故でしょうか?
(質問2)
Firefox だと 長いURLが折り返されないので、URL が 81文字以上になった場合に、
$2 の部分を80文字 + "..." に省略したいと考えています。
このような場合には、どのように改造すれば良いでしょうか?
ご教示いただけると幸いです。
0267nobodyさん
2007/03/05(月) 09:58:22ID:???@tests に色々入れて、試してみよう。
#!/usr/bin/perl use strict;
my @tests = (
"http://foo/bar/a.html",
"unko\nchinko\nmanko\nhttp://foo/bar/a.html",
);
for my $message (@tests) {
$message =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<a href="$2" rel="nofollow">$2<\/a>/g;
print "message: $message\n";
}
0268nobodyさん
2007/03/05(月) 10:17:11ID:???> 質問1
> 記事の最初に '=' とかがあったとしても
「記事の最初」がどこを指しているのかよくわからないけど、
URL の直前が行頭か '=' '^' '"' 以外ならマッチする。
http://www.google.co.jp/ や
Google:http://www.google.co.jp/ なんかだと、マッチするけど
Google=http://www.google.co.jp/ や
href="http://www.google.co.jp/" だとマッチしない。
> 質問2
$2 を省略すると href="$2" の中の URL まで省略されちゃうから
自分だったら、こんな関数を定義しておいて
sub make_link {
my $url = shift;
my $text = shift || $url;
my $maxlen = shift || 80;
if (length($text) > $maxlen) {
$text = substr($text, 0, $maxlen) . '...';
}
return qq{<a href="$url" rel="nofollow">$text</a>};
}
んで /e オプション使って
$message =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1 . make_link($2)/eg;
にするかなぁ
0269266
2007/03/05(月) 10:19:40ID:???回答ありがとうございます。
いろいろいれて試してみます。
とりあえず、最初から 267 さんがいれていた2つのものは、両方ともリンクになっていました。
"=http://www.example.com/" はリンクにはならず、"=\nhttp://www.example.com/" はリンクになりました。
改行記号が入ると、別物として処理してるのかなー。
0270266
2007/03/05(月) 10:23:14ID:???> 「記事の最初」がどこを指しているのかよくわからないけど、
> URL の直前が行頭か '=' '^' '"' 以外ならマッチする。
なるほど。
納得しました。
正規表現の最初に "^" が来ると、$message の最初という意味になりますが、 "[" が入ったあとだとそれとは無関係になるんですね。
そして、([^=^\"]|^) とあるので、 = や " 以外の次に http … がマッチするということになるわけですか。
質問2についての回答は非常にためになりました。
ありがとうございました。
0271nobodyさん
2007/03/06(火) 09:39:12ID:???for($foo = int(rand(100));-z "$foo.dat";$foo = int(rand(100))){
if(-e "foo.dat"){
open($foo.dat);
中略
}
}
とやってみたら動作しませんでした。
・最初にランダムの$fooを与え
・その$foo.datが存在すれば、展開
・$foo.datが存在しない限り、ランダムで$fooを与え、存在しているかを探す
何か根本的に勘違いしてますでしょうか?
スマートなやり方など御座いましたらお教え下さい。
0272nobodyさん
2007/03/06(火) 09:53:26ID:???>・$foo.datが存在しない限り、ランダムで$fooを与え、存在しているかを探す
どうみてもそういう風に書いているようには見えないのだが。
実際には
$foo.dat が存在してサイズが0であればランダムで$foo取り直して繰り返し。
存在してサイズが0でなければなんか処理
存在しなければなにもせずに終わり
になっている。
0273nobodyさん
2007/03/06(火) 09:57:46ID:???$foo.dat が存在してサイズが0であれば(-z なら -eも自動的に成立するので)
そのファイルを開いてなんかする。そして$fooをランダムにとりなおして繰り返し。
$foo.dat が存在しないかサイズが0以外なら終了
0274nobodyさん
2007/03/06(火) 10:55:03ID:???ファイルが存在しないかサイズが1以上のファイルが存在して、終了しているだけだろ。
あと、ここはwebprog板なので排他制御を行わないと落第。
0275nobodyさん
2007/03/06(火) 14:03:48ID:???3時間 = 3 * 60 * 60 = 10800
14分 = 14 * 60 = 840
3時間14分 = 11640秒
そこでこれを作ったのですがうまく動作しません。
どう書き換えれば良いでしょうか?
# 秒数変換 Sec_trans($jikan)
sub Sec_trans {
my $rest = $_[0];
my($h,$m);
while($rest > 3600){
$rest - 3600;
$h++;
}
while($rest){
$rest - 60;
$m++;
}
sprintf("%d時間 %02d分です", $h ,$m);
}
0276nobodyさん
2007/03/06(火) 14:11:06ID:???0277nobodyさん
2007/03/06(火) 14:20:15ID:???$restはマイナスでも真じゃないかね?
localtimeは使いたくないの?
$h = int( $rest / 3600 );
$m = int( ( $rest % 3600 ) / 60 );
でいいような気もする
0278nobodyさん
2007/03/06(火) 14:40:05ID:???while($rest){
$rest - 60;
$m++;
}
つまり、この部分が無限ループになっていたわけですか。
$restはマイナス値でも真なんですね。勉強不足でした。
$jikan = 11640;
$jikan = Sec_trans($jikan);
sub Sec_trans {
my $rest = $_;
my($h,$m);
$h = int( $rest / 3600 );
$m = int(( $rest % 3600 ) / 60 );
sprintf("%d時間 %02d分です", $h,$m);
}
これを試したら、動かずに
$jikan = Sec_trans($jikan,1);
my $rest = $_[0];
と変更ところ無事動作しました。
$_と$_[0]って挙動が違うのですか?
0279nobodyさん
2007/03/06(火) 14:50:16ID:???まったく別のものです。$_[0]は配列@_の0番目の要素。
0280nobodyさん
2007/03/06(火) 14:54:16ID:???あとlocaltimeについてもぐぐってみ
先に「数値.dat」の形式のファイルを取得してからで良さそうな。。。
opendir my $dir_handle, './' or die;
my @dat_files = grep /^\d+\.dat$/, readdir <$dir_handle>;
closedir $dir_handle;
open my $file_handle, '<', $dat_files[int rand scalar @dat_files] or die;
中略
close $file_handle;
0282nobodyさん
2007/03/07(水) 15:28:55ID:JqPAOgE9foreach my $tmp (@array) {
if( $tmp eq 'P' ) { $flag = 1;last;}
}
if($flag) { print 'GA!' }
↑の文を↓のように1〜2行に収める事はできないでしょうか?
if( xxxxxxxx ) { print 'GA!' }
やりたい事は配列の中に任意のデータの有無をチェックしたいのです。
(配列の中身はデータが重複してない事が前提)
できれば、見つかった場合の要素数もわかるとありがたいです。
0283nobodyさん
2007/03/07(水) 15:54:12ID:???つgrep
>(配列の中身はデータが重複してない事が前提)
>できれば、見つかった場合の要素数もわかるとありがたいです。
要素が重複してないのなら見つかった場合の要素数は必ず1だと思うのだが...
0284nobodyさん
2007/03/07(水) 15:58:54ID:???grepという事は
if(grep(/P/, @array)) { print 'GA!' }
という感じでしょうか?
要素数というのは、配列の何番目の要素か?という事です。
0285nobodyさん
2007/03/07(水) 16:11:20ID:???同等のsubを自前で定義する方向で。
0286nobodyさん
2007/03/07(水) 16:17:35ID:???いやそれ「要素数」とは言わないし。
if (($index)=grep {$array[$_] eq 'P'} 0..$#array) { print "GA! at $index" }
0288nobodyさん
2007/03/08(木) 04:27:59ID:???$query = new CGI;
とすると、止まってしまいます。
解決方法をお願いします。
XPのIISでCGIとして動かしています。
Active Perl 5.8.7を使ってます。
0290nobodyさん
2007/03/08(木) 15:02:49ID:???記号やひらがななどを入力する人がいるので、JIS漢字以外の文字が
入力されたらエラーを表示したいのですがどうすればいいでしょうか
0291nobodyさん
2007/03/08(木) 16:05:39ID:???>>1
> 1: 自分はこういう事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
1はわかったから2と3を書いてくれる?
0292nobodyさん
2007/03/08(木) 16:12:32ID:???m/[一-龠]/で試したのですがいくつかの記号が漏れてしまいます。
0293nobodyさん
2007/03/08(木) 16:54:41ID:???その順序とJISの並びは同じなのかな。
0294nobodyさん
2007/03/08(木) 16:54:42ID:???InCJKUnifiedIdeographs
とかで検索すると幸せになれる
0295nobodyさん
2007/03/09(金) 02:16:19ID:???レベルは正規表現、ハッシュ、リファレンス等テキスト加工に必要な事は出来ますが
Webからの情報入手、Webへの出力などは未経験という感じです。
そこで、せっかくperlを使ってるならとCGIを勉強しようと思い、
まずはテキスト処理がメインになりそうな2chのスレッド検索CGIでも作ろうと考えています。
素人考えでWebページからテキストを配列に渡せれば、あとはテキスト処理なんでそこそこ簡単かなと
考えていますがこれって結構難しいのでしょうか。
また、どこかに勉強になるサイト何かあったら教えてください。
0296nobodyさん
2007/03/09(金) 02:51:20ID:???>>2-3
特に perlfaq9 と CGI.pm
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq9.html
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
monazilla Part 5
http://pc11.2ch.net/test/read.cgi/tech/1057329161/
0297nobodyさん
2007/03/09(金) 02:52:35ID:???無理しないで辞表を出すってのも手じゃね?w
0298nobodyさん
2007/03/09(金) 14:56:13ID:???statだとアクセス日と更新日しか調べられないみたいなのでorz
0299nobodyさん
2007/03/09(金) 15:24:43ID:???0300nobodyさん
2007/03/09(金) 15:35:38ID:???0301nobodyさん
2007/03/09(金) 15:43:22ID:???記録がないのが普通なのでとりようがないはず。
ctimeで代用するのは、ctimeが更新されることは比較的少ないのでファイル
作成のときのままになってることが多いからってだけで確実ではない。
ファイルの所有者やパーミッション変えると更新だっけ。
0302nobodyさん
2007/03/09(金) 19:01:53ID:???0303nobodyさん
2007/03/09(金) 19:24:27ID:???0304nobodyさん
2007/03/09(金) 19:27:39ID:???0305nobodyさん
2007/03/09(金) 19:34:06ID:???% touch a
% stat a
File: `a'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 2342931 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ matsui) Gid: ( 1000/ matsui)
Access: 2007-03-09 19:31:39.000000000 +0900
Modify: 2007-03-09 19:31:39.000000000 +0900
Change: 2007-03-09 19:31:39.000000000 +0900
% mv a b
% stat b
File: `b'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 2342931 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ matsui) Gid: ( 1000/ matsui)
Access: 2007-03-09 19:31:39.000000000 +0900
Modify: 2007-03-09 19:31:39.000000000 +0900
Change: 2007-03-09 19:31:45.000000000 +0900
0306nobodyさん
2007/03/09(金) 19:36:05ID:???0307nobodyさん
2007/03/09(金) 19:42:20ID:???> Change: 2007-03-09 19:31:45.000000000 +0900
どこ見てんだよ。変ってるだろ。
0308nobodyさん
2007/03/09(金) 19:45:05ID:???0309nobodyさん
2007/03/09(金) 19:56:17ID:???cp -pでもctimeは変わるんだろうな。
0311nobodyさん
2007/03/10(土) 01:34:17ID:???Access … アクセス
Change … 変更
は分かるけど、「Modify」 って何だろう。
http://dictionary.goo.ne.jp/search.php?MT=Modify&kind=ej&from=Mozilla/Firefox
0312nobodyさん
2007/03/10(土) 02:29:19ID:???<q cite="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html">
time_t st_atime; /* 最終アクセス時刻 */
time_t st_mtime; /* 最終修正時刻 */
time_t st_ctime; /* 最終状態変更時刻 */
</q>
0313311
2007/03/10(土) 02:50:41ID:???なるほど。
Access: 最終アクセス時刻: 最後にファイルにアクセス (開くなど) した時刻
Modify: 最終修正時刻: 最後にファイルを修正 (中身の書き換え) をした時刻
Change: 最終状態変更時刻: 最後にファイルのパーミッション等の状態を変更した時刻
いうことか…。
ありがとう。
0314nobodyさん
2007/03/10(土) 04:43:30ID:???0315nobodyさん
2007/03/10(土) 06:39:28ID:???0316nobodyさん
2007/03/10(土) 06:54:02ID:???まあどうでもいいや
0317nobodyさん
2007/03/10(土) 22:04:20ID:???このCGIを設置してみたのですが
http://dioaerts.hp.infoseek.co.jp/cgi-bin/wakuwaku.htm
http://dioaerts.hp.infoseek.co.jp/cgi-bin/wakuwaku.csv
このように検索されるものと検索されないものがあります
どうしてだか教えてください
0318nobodyさん
2007/03/10(土) 22:25:34ID:???自己解決しました吸いませんでした
0320nobodyさん
2007/03/11(日) 11:29:14ID:???これから学ぶなら何がよいのかね?
0321nobodyさん
2007/03/11(日) 12:02:16ID:SYPe8N9hPython.
0322nobodyさん
2007/03/11(日) 13:11:23ID:???初めからRubyでもいいかもしれないけど、ウェブアプリとかちょっとしたツールを作るスクリプト言語にオブジェクト指向の必要性は感じない。
それ以外の分野ならJavaとかCになるだろうし。
0323nobodyさん
2007/03/11(日) 14:05:33ID:???何をやらせても低脳
0324nobodyさん
2007/03/11(日) 15:05:02ID:???0325nobodyさん
2007/03/11(日) 16:45:41ID:???JavaやC++のような重量級言語以外に、ね。
0326nobodyさん
2007/03/11(日) 17:00:00ID:t1Paw2Qeprint "<a href=\"$ENV{'SCRIPT_NAME'}?page=$id\" target=\"_blank\">スレタイ</a>"
みたいな感じでスレタイをクリックするとそのスレッドの内容の別ページが
開くようにしたいのですが、$ENV{'SCRIPT_NAME'}?page=1 になってるところを
クリックされた場合は$ENV{'QUERY_STRING'}にpage=1として返ってくると思うのですが、
それを分解して$form{'page'}=1 となるようにして、条件で
if($form{'page'}){ printPage() ; }
としてもひっかかってくれません。。なぜかわからないでしょうか・・
0327nobodyさん
2007/03/11(日) 17:01:08ID:t1Paw2Qesub loadFormdata
{
my ($query,$pair) ;
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN,$query,$ENV{'CONTENT_LENGTH'}) ;
}
else{
$query = $ENV{'QUERY_STRING'} ;
}
foreach $pair (split(/&/, $query)) {
my ($key, $value) = split(/=/, $pair) ;
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg ;
$value = jcode::sjis($value) ;
$value =~ s/&/&/g ;
$value =~ s/</</g ;
$value =~ s/>/>/g ;
$value =~ s/\x0D\x0A/<br>/g ;
$value =~ tr/\t/ / ;
$form{$key} = $value ;
}
}
になっています。
0328nobodyさん
2007/03/11(日) 17:22:11ID:???0329nobodyさん
2007/03/11(日) 17:35:20ID:???PHPとかもやってると$_GET['page']ってやりたくなるよな
>>327
cgi-lib.plをrequireして&ReadParse;とかでもOK
0330nobodyさん
2007/03/11(日) 21:49:08ID:???0331nobodyさん
2007/03/12(月) 02:10:14ID:???0332nobodyさん
2007/03/12(月) 11:05:45ID:???>>326
まず$form{'page'}をprintしてみては?ちゃんと入ってる?
0334nobodyさん
2007/03/12(月) 21:46:55ID:???どんなデメリットあるんだろう・・
0335nobodyさん
2007/03/12(月) 22:41:31ID:???古いコードの保守ならともかく、これから新規で書くんならCGI.pmがオススメ
0336nobodyさん
2007/03/12(月) 23:33:07ID:???0337nobodyさん
2007/03/12(月) 23:59:28ID:???0338nobodyさん
2007/03/13(火) 00:12:24ID:???0339nobodyさん
2007/03/13(火) 00:12:38ID:???CGI::Minimalあたり使ってろよ
0340nobodyさん
2007/03/13(火) 00:37:46ID:7SHHDDju色々調べたけどお手上げ…
0341nobodyさん
2007/03/13(火) 00:43:35ID:???0342nobodyさん
2007/03/13(火) 00:59:27ID:???単純なテーブルならデータにdel_flgとか持たせとくとか
別にテーブル作ってIDとdel_flgで状態を管理とか
0343nobodyさん
2007/03/13(火) 01:21:54ID:7SHHDDjupackage Item;
__PACKAGE__->columns(Primary => qw/id/);
__PACKAGE__->columns(Others => qw/name maker note del_flag/);
__PACKAGE__->has_many(groups => 'Group');
package Group;
__PACKAGE__->columns(Primary => qw/id/)
__PACKAGE__->columns(Others => qw/name del_flag/);
・・・
CDBIでリレーションしてる他のテーブル(例えばGroup)
にもdef_flagのようなフラグをつけていて、
@data = Item->search_like(name => 'pc');
みたいな時に、Groupが論理削除されている場合は拾って来ないようにして、
Item->groups->name
には生きているデータだけ持ってきたいのだけど…
0344nobodyさん
2007/03/13(火) 01:27:58ID:7SHHDDjupackage Group;
__PACKAGE__->columns(Primary => qw/id/)
__PACKAGE__->columns(Others => qw/name item del_flag/);
・・・
でした。因みに出力はTTです。
0345nobodyさん
2007/03/13(火) 01:31:58ID:7SHHDDjuとかだと、Itemの削除したものはあがってこないが、
Groupの方は関係ないから普通に拾ってきてしまうのよね…
>>342 <早速のレスありがとうございます。
0346nobodyさん
2007/03/13(火) 04:25:58ID:???0347nobodyさん
2007/03/13(火) 07:08:26ID:???0348nobodyさん
2007/03/13(火) 10:54:37ID:???0349nobodyさん
2007/03/13(火) 12:59:08ID:RaCGoxpM$in{'name'}ってのを$in{'$rand'}ってやって乱数にしたいんだけど
どうやってやればいいんでしょうか?
ちなみに$randは乱数です。
0350nobodyさん
2007/03/13(火) 13:14:50ID:???$in{$rand} = 'hogehoge';
0351nobodyさん
2007/03/13(火) 13:20:42ID:RaCGoxpM動きません・・・・
0352nobodyさん
2007/03/13(火) 13:26:14ID:RaCGoxpM<input type=text name="OMbqcVSSOZkugP167bljsl3zHt5uVk" size=28 value="">
書き込みのフォームがこんな感じになっていて、name"$rand"ってなっています。
ですが$in{'name'}を$in{'$rand'}にしても書込みをさせてくれません・・・。
どうすればできますでしょうか?
0353nobodyさん
2007/03/13(火) 13:28:17ID:???0354nobodyさん
2007/03/13(火) 13:30:12ID:???$randにしかるべき文字列が設定されているのが前提だが。
0355nobodyさん
2007/03/13(火) 13:34:38ID:RaCGoxpMですが$in{$rand}ってやっても全然書き込み出来ません・・・。
0356nobodyさん
2007/03/13(火) 13:41:49ID:???0357nobodyさん
2007/03/13(火) 13:42:19ID:RaCGoxpM0358nobodyさん
2007/03/13(火) 13:43:39ID:???0359nobodyさん
2007/03/13(火) 13:46:07ID:RaCGoxpM0360nobodyさん
2007/03/13(火) 14:05:26ID:???たとえば、$i に 1234567890 が入っていたら、 1A234A567A890 とか、1 234 567 890 といった感じです
いい方法あったら教えてもらえませんか?
0361nobodyさん
2007/03/13(火) 14:05:53ID:???コーディングでエラーが出たら質問するといい
0364nobodyさん
2007/03/13(火) 14:11:09ID:???@ck = ("a", "b", "c", "d", "e");
for($i = 0; $i < 5; $i++){
$array[$i] =~ s/([^\w\=\& ])/'%' . unpack("H2", $1)/eg;
$array[$i] =~ tr/ /+/;
print "Set-Cookie: $ck[$i]=$array[$i]; expires=Tue, 01-May-2008 11:32:58 GMT;<br>\n";
}
とやると最初のaしか書き込まれません。
全て書き込むためにはどのようにすればいいのでしょうか?
(@arrayには正しく値が入っています)
0366nobodyさん
2007/03/13(火) 14:12:24ID:???0368nobodyさん
2007/03/13(火) 15:39:13ID:???「スレッド一覧を表示する」のと、「1スレッドの投稿内容を表示する」のは、
別々のcgiで分けた方が良いのでしょうか?それとも一つのcgiファイルで
場合分けした方が良いのでしょうか。
この様な掲示板を作ったことがない素人なので、かなり迷っています。
普通は分けるもんなんでしょうか?
0369nobodyさん
2007/03/13(火) 15:52:30ID:???フリーで配布してるやつの中身見てみたら?
コーディングスタイルはおすすめできないけど。
0370nobodyさん
2007/03/13(火) 16:00:28ID:???と思ったんですが、どうなんでしょうか。
0371nobodyさん
2007/03/13(火) 16:12:51ID:???0372nobodyさん
2007/03/13(火) 16:41:42ID:???複数ファイルでファイルごとに処理を分けるか
どちらもメリット/デメリットあるのでお好きに。
0373nobodyさん
2007/03/13(火) 17:22:38ID:???小分けして複数ファイル管理のほうがUNIX的だな
0374nobodyさん
2007/03/13(火) 18:12:46ID:???0375nobodyさん
2007/03/13(火) 23:17:29ID:???0376nobodyさん
2007/03/13(火) 23:29:41ID:???0377nobodyさん
2007/03/13(火) 23:34:43ID:???0378nobodyさん
2007/03/14(水) 02:26:48ID:???IPアドレスだったら正規表現で入力段階で正当なものかを確認。正当じゃなったらサニタイズじゃなくて、エラー処理な。
基本的にIPアドレスは安全だけど、サーバソフトの脆弱性などで不適切なデータが来る可能性は完全に否定できないから、リスクは最小限にすべき。
ついでに、リモートホストはもろ好きな文字列を指定できるから超注意。
殆どの配布CGIでは何の対策もしていないが、DNS登録権限があれば、リモートホストにタグいれることだって出来る。
そして、出力時には、全ての変数 (汚染の可能性があるかないかは別にして) に対してHTMLタグの無効化処理を行うか、
出力文字列も全部無効化するサブルーチン通して、タグが必要な場合には、別サブルーチンを通すべき。
たかが、XSSであっても、同じサーバ上のすべてのサービスに影響がでるし、Cookie漏洩したらセッションハイジャックされるのだから。
0379nobodyさん
2007/03/14(水) 10:33:43ID:???0381nobodyさん
2007/03/14(水) 12:43:20ID:DiCI2BZs<a href="2ch.cgi?page=2">2ch</a>
のように2ch.cgiにpage=2というようなパラメータを渡すときなのですが、
渡すパラメータを数種類もためせたい場合はどうやればいいのでしょうか?
0382nobodyさん
2007/03/14(水) 12:53:48ID:???ただし XHTML なら & じゃなくて &
0383nobodyさん
2007/03/14(水) 12:55:05ID:DiCI2BZsありがとうございます!たすかりました!
0384nobodyさん
2007/03/14(水) 13:55:05ID:???0385nobodyさん
2007/03/14(水) 15:23:52ID:???0386nobodyさん
2007/03/14(水) 19:55:54ID:???2chも/なんだっけか
0387nobodyさん
2007/03/14(水) 19:59:38ID:???0388378
2007/03/14(水) 23:35:50ID:???XSS対策に限って言えば、出力時のHTMLタグの無効化処理だけで問題無いし、入力時にサニタイズ(文字列の変換)をするといったトリッキーな処理はすべきじゃない。
IPアドレスの形式のチェックが必要というのは別の意味で。
IPアドレスというのは掲示板に犯罪予告が書き込まれた場合に警察に情報提供する場合などに必要な情報。
例えば、WebサーバのバグやWebサーバとの連携障害などで、サーバから本来送られてくるべき変数が送られてこなかったり受信できなかったりすることは想定される範囲。
なので、$ENV{'REMOTE_ADDR'} の内容をそのまま記録するのではなく、
・データが送信されてきたこと
・少なくとも型が正当であること
を正規表現で確認し、エラーだったらそこで弾くべき。
ちなみに、Kent Web で配布されている Web Patio などのCGIには、投稿者情報記録機構に重大な欠陥がある。
それは、$ENV{'REMOTE_ADDR'} じゃなくて $ENV{'REMOTE_HOST'} をそのまま記録していること。
$ENV{'REMOTE_HOST'} は 実は詐称できる情報。
一般家庭のようなISP契約じゃあ詐称できないが、漏れが契約しているような企業向けの回線だと、DNSの登録権限が譲渡される場合がある。
ってことで、2cher.example.com に詐称することだって出来る。(host名に < や > を入れることも可能。)
Apache などで host 名でアクセス制御をした場合には、
(1) 接続元のIPアドレスを取得して、それに対するリモートホストをDNSのPTRレコードを参照することにより取得して、
(2) 取得したリモートホストに対する Aレコードを取得して、
(3) (1) と (2) の内容が同一でなかったら無効にする。
という処理を行っているのに、Kent の CGI がやってるのは (1) だけ。
0389nobodyさん
2007/03/15(木) 00:13:01ID:???表示されないんだけど強制アフィでも仕込んでたんか?
0391nobodyさん
2007/03/15(木) 02:36:48ID:???CGIを作るのに必要な勉強はPerl言語の勉強だけでは無い。
その前にTCP/IPの仕組みやDNSの仕組み、Apacheなどのサーバの仕組み、Linuxの仕組みなどを勉強すべきだ。
そうしないとセキュアなプログラミングをすることはできん。
0394nobodyさん
2007/03/15(木) 06:03:54ID:???アナルのほうに中田氏でおねがいします。
0395nobodyさん
2007/03/15(木) 08:46:50ID:???0398nobodyさん
2007/03/15(木) 12:00:10ID:???> (host名に < や > を入れることも可能。)
そんなresolverのバグを力説せんでも。
まともなresolverならそんな名前が返って来たらエラーを返す。
0399nobodyさん
2007/03/15(木) 13:41:02ID:???手元で実験できるマシンで実験してみたが、FreeBSD 7-currentも玄箱linuxも、
"<"や">"が入った名前ははじく。Windowsは今実験できん。
おまえは、どんな腐った環境を前提にものを言っているんだ?
0401399
2007/03/15(木) 23:10:10ID:???Windowsをサーバにしない理由が一つ増えた。
0402nobodyさん
2007/03/16(金) 00:39:54ID:???0403nobodyさん
2007/03/16(金) 02:10:14ID:???そんな厳密な制御してもクレームの山になるだけだと思うけど。
0404nobodyさん
2007/03/16(金) 02:20:09ID:???そういういい加減な処理をしたいなら、リモートホストのほかにIPアドレスも記録するべき。
犯罪予告の投稿者ホストが政府機関に成りすましたホストだったらどうするの?
下手したら管理者が責任を問わされるぞ
0407nobodyさん
2007/03/16(金) 03:33:49ID:???0408nobodyさん
2007/03/16(金) 04:18:14ID:???べつにどうでもよくね?
0409nobodyさん
2007/03/16(金) 10:09:23ID:???一番性質が悪いタイプw
0410nobodyさん
2007/03/16(金) 10:35:41ID:???> その前にTCP/IPの仕組みやDNSの仕組み、Apacheなどのサーバの仕組み、Linuxの仕組みなどを勉強すべきだ。
おれIPとかUNIXとか全くわからないんだけど
どう勉強すればいい?
0412nobodyさん
2007/03/16(金) 12:42:30ID:???そういうの書き込みされたら、すぐに削除すればいいんじゃない?
大体ここみたいに大きなところを管理しているわけじゃなかろうに…
0413nobodyさん
2007/03/16(金) 18:46:21ID:???hoge.pmとかを置いてrequireで読み込ませようとしてるのだけど、一部出来ないので質問。
とりあえず、use hoge;はrequire hoge;にして同じ階層にhoge.pmを置けば問題なかったけど、
use POE::Component::IRC::Common qw(:ALL);みたいなのはどうすればいいのか教ええてクリ。
エラーメッセージ見ると
Can't locate POE/Component/IRC/Common.pm
って書いてるのでそのディレクトリ作って置いてみてもダメみたいだった。
requireで hoge::moge みたいに :: の指定がされてる場合は、
素直に同階層に置いちゃって require Common; で指定しちゃって問題ないのかな。
0414nobodyさん
2007/03/16(金) 18:56:35ID:???そこにモジュールいれて
use lib すればいいよ
0415nobodyさん
2007/03/16(金) 19:06:52ID:???それならまとめて放り込めば良いのね。
ありがと!
0416nobodyさん
2007/03/17(土) 02:24:03ID:???もうちょっと丁寧な解説は
http://www.nishishi.com/blog/2005/12/perl_module_per.html
0417nobodyさん
2007/03/17(土) 04:24:56ID:tNPzkWAm毎回メモと睨めっこしているんですが
よろしくおねがいします
0418nobodyさん
2007/03/17(土) 04:28:18ID:???0419nobodyさん
2007/03/17(土) 05:06:00ID:tNPzkWAm0421nobodyさん
2007/03/17(土) 05:35:33ID:???0422nobodyさん
2007/03/17(土) 08:44:30ID:FBwp50T+mkeditor つかってますが、他にいいの有ったら宜しく。
0423nobodyさん
2007/03/17(土) 09:48:25ID:???winならgvimがいいな
0424nobodyさん
2007/03/17(土) 09:50:25ID:???0425417
2007/03/17(土) 16:18:30ID:tNPzkWAmぐぐっても出てこなかったです
421さん
terapadを使っていますが
よく;を打つのを忘れたりします
そのせいで三十分ぐらい睨めっこ
0426nobodyさん
2007/03/17(土) 16:20:18ID:???重複を取り除いてから、元のと要素数を比較するという
チンポな方法しか思いつきません。
0427nobodyさん
2007/03/17(土) 16:47:02ID:???my %hash;
map { $hash{$_}++ } @array;
print keys %hash;
0428nobodyさん
2007/03/17(土) 16:55:18ID:BFzI3Dy+なにが原因だと思われますか?
OSはwindowsです。
0429nobodyさん
2007/03/17(土) 16:58:19ID:???<br>にしとけ
0430nobodyさん
2007/03/17(土) 16:58:24ID:???0431nobodyさん
2007/03/17(土) 17:16:42ID:BFzI3Dy+コマンドプロンプトで実行したらちゃんと改行されてました。
0432nobodyさん
2007/03/17(土) 17:18:20ID:???0434nobodyさん
2007/03/17(土) 17:56:03ID:???下記のロジックで、どういう原理で@aryの中身が変わってしまうのか。
foreachステートメントは”値を取り出す”のではなくて、
C言語でいう、ポインタが入るみたいなイメージですか?
@ary = ('0', '1', '2');
foreach $value (@ary){
$value = '-';
}
print $ary[0];
0435nobodyさん
2007/03/17(土) 18:20:39ID:???0438nobodyさん
2007/03/17(土) 21:19:19ID:???「perl」「-cw」でぐぐったら出てきませんでしたというなら、
まずgoogleの使い方を見直すべきだと思う。
0439nobodyさん
2007/03/17(土) 21:41:37ID:???場合、複数のPerlプロセスが長時間立ち上がりっぱなしになってるってことですか?
それとも、読み、書き込みの度に別々のプロセスが立ち上げなおすってことですか。
0440nobodyさん
2007/03/17(土) 21:52:12ID:???0443nobodyさん
2007/03/17(土) 22:58:00ID:???作り方によるのかもしれないが、特に何も意識しなければ別々のプロセスが立ち上がると思う。
0445nobodyさん
2007/03/18(日) 01:31:19ID:???0447nobodyさん
2007/03/18(日) 13:48:42ID:???どこから突っ込んで良いか分からない
0448nobodyさん
2007/03/18(日) 15:30:25ID:???print "all", &total(1..1000), ".\n";
print "all" . &total(1..1000) . ".\n";
B
print "all", "all", ".\n";
print "all" . "all" . ".\n";
AとBのそれぞれで結果が同じだった
『,』と『.』の違いって何?
0449nobodyさん
2007/03/18(日) 15:33:14ID:???.は連結した上で出力。
.だとバッファに一回格納するからメモリを食う。
printだからたまたま同じであって、returnとか、ほかの関数では結果が変わるので注意汁。
0451nobodyさん
2007/03/18(日) 16:01:01ID:???とか
$, = " / ";
みたいに値を変えてみると違いがわかると思うよ。
0452nobodyさん
2007/03/18(日) 17:57:24ID:???0453nobodyさん
2007/03/19(月) 01:00:53ID:???・ログファイルの容量を定期的にチェック
・制限が超えたら、空のファイルにする
ということをしたいと思ってます。
それで、perlでなにか出来ないかと調べたところ
デーモン化という方法があること知りました。
use Proc::Daemon
sleep関数使おうと思ってますが、もっと良い方法あるでしょうか。
perlに限らず、linuxの機能やその他のアドバイスでもお願いしたいです。
0454nobodyさん
2007/03/19(月) 01:20:03ID:???0455nobodyさん
2007/03/19(月) 01:31:00ID:y4PXC6RO入門書見ながら掲示板作って出来上がったら目標がなくなってしまいました。
次の材料におもしろいCGIなんかがあったら教えてもらえませんか?
0456nobodyさん
2007/03/19(月) 01:34:42ID:???0457nobodyさん
2007/03/19(月) 01:37:03ID:y4PXC6ROありがとうございます。
早速、ぐぐってきます。
0458nobodyさん
2007/03/19(月) 01:45:06ID:???0460nobodyさん
2007/03/19(月) 10:26:01ID:???0461nobodyさん
2007/03/20(火) 14:43:14ID:???正規表現で下記のようにしましたがマッチしないです。
$html_template =~ /<body>(.*?)</body>/i;
全ての改行を削除してから上記の文に掛けてやると抽出できます。
改行とかを削除しないで指定した範囲を抜き出すにはどうすればよいでしょうか?
0462nobodyさん
2007/03/20(火) 14:57:48ID:???0463nobodyさん
2007/03/20(火) 15:01:02ID:???syntax error at D:/web/tnx_club/www/index.cgi line 59, near "/<body>\n(.*?)</body"
Execution of D:/web/tnx_club/www/index.cgi aborted due to compilation errors.
上の正規表現の行が LINE 59。
0464nobodyさん
2007/03/20(火) 15:02:52ID:???\n 加えても no match でした。
0465nobodyさん
2007/03/20(火) 15:15:32ID:???0466nobodyさん
2007/03/20(火) 15:17:08ID:???サクっとでけたw
mの有無で変わるものなのか・・・thx
0467nobodyさん
2007/03/20(火) 15:19:51ID:???ちがう。肝はsだよ。mつかわないでこう書いてもいいし。
$html_template =~ /<body>(.*?)</body>/is;
s
文字列を単一行(single line)として扱います。つまり、``.''が通常はマ ッチしないような改行を含めた、全てのキャラクターにマッチするようにします。
0468nobodyさん
2007/03/20(火) 15:22:25ID:???m 抜きでやってきたら同じ動きをした。
以前同じようなことで試行錯誤した記憶があるから、さすがに今回で覚えたかなw
重ね重ねありがとぅ。
0469nobodyさん
2007/03/20(火) 17:17:28ID:???の区切り文字が/のときに限ってmを省ける、というのがPerlでの//の正体。
0470nobodyさん
2007/03/20(火) 21:52:03ID:???0471nobodyさん
2007/03/22(木) 22:01:09ID:gLp6RvZ+まとめて引渡し方がワカラないのですがなんでしたでしょうか?
sub test{
my $data1=shift;
my $data2=shift;
:
}
というのを
sub test{
my @data=ほげほげ
}
と出来た気がするのですが↑のほげほげに入れる単語なんでしょうか?
以上 ご教授いただけるとありがたいです
0472nobodyさん
2007/03/22(木) 22:03:27ID:???shiftは、引数を省くと、メインでは@ARGV、サブルーティン内では@_が
対象になる。
0473nobodyさん
2007/03/23(金) 00:37:10ID:ZyRaN274Catalyst + DBIx(PostgreSQL)で開発しているのですが、Helperスクリプト経由で
Schemaを作る場合、public スキーマのテーブルしか見てくれません。
スキーマを指定する方法は無いのでしょうか?
直感で、Alter roll loginid SET search_path TO myschemaしたけど駄目でした。
DBD::PgがPgのスキーマをちゃんとサポートしてないから
どっかで
$schema->storage->dbh->do("SET search_path TO myschema, public");
みたいなことを自前でやらないとだめなんじゃないかな
てけとうでご免
というかpublicスキーマは使わな(ry
0475nobodyさん
2007/03/23(金) 03:33:10ID:???0476nobodyさん
2007/03/23(金) 23:55:51ID:ZyRaN274>>474
かなり色々なものでラッピングされちゃってて、手が出しにくい状況です。
あと、publicスキーマを使いたくないから悩んでいるわけで。
>>475
やっぱ男らしくそうですか。
いまのところ、publicスキーマでヘルパー走らせて、Dropしてから本当のスキーマにCreate tableするという便利だか不便なんだかわかんない状況で使ってます。
テーブル数が多いとそこそこ楽な気もするが、どのみちエクセルでテーブル設計書を作っているから、そこからDDLとスキーマをマクロで吐き出すようにしたほうが潔いような気もする今日この頃。
0477nobodyさん
2007/03/26(月) 04:44:44ID:???いいでしょうか。先頭1ビットで判定するみたいなことまで調べたのですが、
正規表現で範囲指定することは可能でしょうか?
0478nobodyさん
2007/03/26(月) 08:04:04ID:???Perlの内部的なワイド文字か
それともただのUTF-8の文字列かどっち?
0479nobodyさん
2007/03/26(月) 09:18:04ID:???0480nobodyさん
2007/03/26(月) 12:48:08ID:???>>477さんので解決したっぽいです。ちなみにuse charnames ":full"しなくても
動きました。
>>476さん
違いをよくわかっていません。が、調べられそうなので調べてみます。
0481nobodyさん
2007/03/26(月) 18:31:41ID:???ログを何度も読み込みしなおしてしまった
0483nobodyさん
2007/03/27(火) 20:50:22ID:VNeopaMKメールの解析は出来そうなんですが、いつ送信されるか分からないメールを待って、メールが来たらそれを受けて処理を始める仕組みをどう作れば良いのか分からないので教えて頂けませんか?
0484nobodyさん
2007/03/27(火) 20:51:46ID:???0485nobodyさん
2007/03/27(火) 21:07:13ID:WKbYIT6w0486nobodyさん
2007/03/28(水) 11:06:28ID:???スレッドごとに違うIDを表示したいのです。
どういう風にやったらよいのかよくわからないので
参考になるような例を教えて欲しいです。
0487nobodyさん
2007/03/28(水) 11:08:23ID:???0488nobodyさん
2007/03/28(水) 11:22:02ID:???折角のレスありがとうございます。
それをPerlでやるとなると、どういう風な感じになるのでしょうか?
そもそも別のIPから同一のIDを出さない、しかしIDからIPがばれないようにする
という所で、もう行き詰まって、いっぱいいっぱいです。
0489nobodyさん
2007/03/28(水) 11:47:27ID:???0490nobodyさん
2007/03/28(水) 11:52:32ID:???GNU拡張の$1$〜使うなら別だが素のcryptは先頭8文字しかみないので
場合によっては役に立たない。特にIPアドレスを文字列で食わせたり
したらアウトだね。
0491nobodyさん
2007/03/28(水) 12:09:26ID:???0492nobodyさん
2007/03/28(水) 12:18:19ID:???そうです、単純にやったのでは文字数の問題があるのと
あと、IPアドレスって数字と区切りの点のみを暗号化するってことじゃないですか
やろうと思えば簡単にIDからIPアドレスの一部がわかっちゃうのではと
だから他の人はどうやってるのか、ちょっと具体例が知りたかったのです
0493nobodyさん
2007/03/28(水) 12:20:41ID:???配列 @character を次のように定義しました。
@character = ('a'..'z', 'A'..'Z','0'..'9');
しかし "l" (小文字のエル) や "1" (数字の一) 等の文字は紛らわしいので配列から排除したいです。
@character = ('a'..'k', 'm-z', 'A'..'Z','0'..'9'); みたいにやるとコードが汚くなるので、
一度配列を定義した後、特定の文字の要素を削除したいのですが、要素 'l' を削除するスマートな方法はないでしょうか?
初歩的な質問で申し訳ないですが、よろしくです。
0494nobodyさん
2007/03/28(水) 12:41:03ID:???.pl ファイルをダブルクリックすると実行されるんですが、終わった後に勝手にコマンドプロンプトが終了してしまいます。
ダブルクリックのみで実行して、終わったらそのままコマンドプロンプトを終了させない方法は無いでしょうか?
教えていただけたら嬉しいです。
0495nobodyさん
2007/03/28(水) 12:48:08ID:???@omit = qw(1 l);
map { $idx{$_} = $i++ } @chars;
map { splice(@chars, $idx{$_}, 1); } sort { $idx{$b} <=> $idx{$a} } @omit;
print @chars,"¥n";
0496493
2007/03/28(水) 12:48:29ID:???「これは酷い」という部分があったら、教えてくれると助かります><
#!C:\Perl\bin\perl.exe
use strict;
# パスワードの文字数を聞く
print STDOUT 'パスワードの文字数を入力して下さい。';
my $passLength = <STDIN>;
# 使用許可文字と使用拒否文字の定義
my @allowChara = ('a'..'z', 'A'..'Z','0'..'9');
my @denyChara = ('b', 'i', 'l', 'q', 'D', 'I', 'O'. '0', '1', '9');
for my $allowCharaNo (@allowChara) {
for my $denyCharaNo (@denyChara) {
if ($allowChara[$allowCharaNo] eq $denyChara[$denyCharaNo]) {
splice(@allowChara, $allowCharaNo, 1);
}
}
}
# ランダムなパスワードを生成・出力
srand;
my $password = '';
foreach (1..$passLength) {
$password .= $allowChara[rand(@allowChara)];
}
print STDOUT $password;
exit;
0497493
2007/03/28(水) 12:49:25ID:???す、凄い…。
>>496 のごちゃごちゃになっていた部分が凄いシンプルに!
登場した関数をぐぐって調べてみます。
ありがとうございます。
0498nobodyさん
2007/03/28(水) 12:52:27ID:???for (ARRAY) BLOCK に置き換えると理解しやすいと思われ。
0499nobodyさん
2007/03/28(水) 12:52:50ID:???cmd /K perl
0501nobodyさん
2007/03/28(水) 13:03:46ID:???@character = grep !/l|1/, ('a'..'z', 'A'..'Z','0'..'9');
0502494
2007/03/28(水) 13:04:35ID:???thxです
前者は動かない…('A`)
------------------
print STDOUT 'aaa';
sleep;
------------------
だと何も表示されずに固まります。
理由は最後まで実行してからコマンドプロンプトに結果送っているからだと思われます。
後者は、バッチファイルやショートカットを作って、
"cmd /K perl ファイル名" を呼び出すってことですね。
こっちはできました。
0503493
2007/03/28(水) 13:06:31ID:???シンプルすぎて感動で涙が出ました…。
(l または 1) にマッチするもの以外を配列に突っ込む、日本語で書くことをそのままPerlにしたといった感じですね。
0505nobodyさん
2007/03/28(水) 13:09:01ID:???@character = grep 'bilqDIO019' !~/$_/, ('a'..'z', 'A'..'Z', '0'..'9');
0506nobodyさん
2007/03/28(水) 13:20:15ID:???なるほどね
右の内容が順番に評価されて $_ には各項目が入る
パターンマッチ演算子を使ってその文字列の中にアルファベットがあるか調べる
単純かつ美しい流れ
しかしこんなくだらん命題でいろいろな答えがでるとはおもわんかった
0507nobodyさん
2007/03/28(水) 13:25:54ID:???0508nobodyさん
2007/03/28(水) 17:03:34ID:sUHWjomTwhile(<SOCK>){
while(s/\n|\r\n|\r//is){}
if($_ =~ /(<a href="(http:[\w\.\~\_\-\/\?\&\+\=\:\%]+)")/is){
push @img, "$2\n";
}
}
なんか獲得できるのとできないのがあるみたいで・・・
$_に複数個あるときも1つしか抽出できませんでした
0509nobodyさん
2007/03/28(水) 17:10:42ID:???そういうときはソケットから読んだ文字列がどうなってるか確かめて、
1)ソケットから読んだ文字列がおかしい
2)ある文字列のときにif以後がうまく働かない
のどちらであるか切り分けしてから質問するものだ。
0510nobodyさん
2007/03/28(水) 22:46:18ID:???while(s/\n|\r\n|\r//is){}
はおかしすぎる
if($_ =~ /(<a href="(http:[\w\.\~\_\-\/\?\&\+\=\:\%]+)")/is) は、
「$_ が /(<a href="(http:[\w\.\~\_\-\/\?\&\+\=\:\%]+)")/is」にマッチしたら
なので、最初の一個がマッチした時点でpushし、次のループに移行する
つまり$_にいくつaタグがあろうと、最初の一個しか抽出できない
書くならこんな感じか?
$_ = do {local $/; <SOCK>};
my @img = map {"$_\n"} (/<a href="(http://.*?)"/gis);
あと、aタグの記法がこれで固定されているって判っているなら構わないけど
hrefの前に別の属性が記述されている場合とか
「"」じゃなくて「'」で括られていたりコーテーションがついていなかったり
する場合も考慮するのが普通かと
0511510
2007/03/28(水) 22:51:27ID:???my @img = map {"$_\n"} (/<a href="(http://.*?)"/gis);
は
my @img = map {"$_\n"} (/<a href="(http:\/\/.*?)"/gis);
に訂正
偉そうに書いておいてエスケープ忘れた…
0512nobodyさん
2007/03/29(木) 00:42:31ID:???今後の参考にさせていただきます^^;
>>510
>最初の一個しか抽出できない
あ〜・・・だから抽出したリンク数が合わなかったんですね^^;
ありがとうございます。
これからmap関数?を調べて(初めて見るんで;)それから試してみようと思います
0513nobodyさん
2007/03/29(木) 12:49:04ID:???回答はもう結構です。お騒がせしました。
0514nobodyさん
2007/03/30(金) 04:04:21ID:???「表」というディレクトリに chdir して、
その中で opendir, readdir とかしたいのですが、うまくいきません。
うまくいく方法があればお願いします。
0515nobodyさん
2007/03/30(金) 06:41:02ID:???答えは忘れたけどw
0516nobodyさん
2007/03/30(金) 07:44:15ID:???0517nobodyさん
2007/03/30(金) 07:44:58ID:???0518nobodyさん
2007/03/30(金) 11:12:45ID:Ov/YkxL/{
my($query,$pair);
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else{
$query = $ENV{'QUERY_STRING'};
}
foreach $pair(split(/&/,$query)){
my ($key,$value) = split(/=/,$pair);
$value =~ tr/+/ ;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
$FORM{$key} = $value;
}
}
というプログラムでhttp://www.e777.co.jp/perlcw/perlcw.htmlのサイトを使って文法チェックしたところ
Bareword found where operator expected at tmp.pl line 75, near "9a"
(Might be a runaway multi-line // string starting on line 74)
(Missing operator before a?)
Unquoted string "a" may clash with future reserved word at tmp.pl line 75.
syntax error at tmp.pl line 75, near "9a"
Unrecognized file test: -F at tmp.pl line 75.
が出てきました
正しいプログラムをコピペしても出てきたんですが
どこが違うか教えていただけないでしょうか??
0519nobodyさん
2007/03/30(金) 11:53:25ID:???スラッシュがぬけてる。
0520nobodyさん
2007/03/30(金) 12:14:19ID:???File::Find と Path::Class はうまく扱えませんね。
0521nobodyさん
2007/03/30(金) 12:17:30ID:???> 答えは忘れたけどw
Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/10
これもうまく動かない。
0522nobodyさん
2007/03/30(金) 20:49:19ID:???s/%([\da-f]{2})/chr hex $1/ieg;
s/%([\da-f]{2})/pack 'H2', $1/ieg;
どっちがはやいんだろ。
0523nobodyさん
2007/03/30(金) 21:28:36ID:???use Benchmark qw( timethese cmpthese ) ;
use CGI::Util qw(escape);
my $str = escape("Perlコーディング初心者質問スレ");
my $r = timethese( 100000, {
chrhexi => sub {
local $_ = $str;
s/%([\da-f]{2})/chr(hex($1))/ieg;
},
chrhex => sub {
local $_ = $str;
s/%([0-9A-Fa-f][0-9A-Fa-f])/chr(hex($1))/eg;
},
packh2i => sub {
local $_ = $str;
s/%([\da-f]{2})/pack('H2', $1)/ieg;
},
packh2 => sub {
local $_ = $str;
s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
},
} );
cmpthese($r);
0524nobodyさん
2007/03/30(金) 21:29:20ID:???chrhex: 8 wallclock secs ( 5.21 usr + 2.13 sys = 7.34 CPU) @ 13623.98/s (n=100000)
chrhexi: 7 wallclock secs ( 6.72 usr + 0.71 sys = 7.43 CPU) @ 13458.95/s (n=100000)
packh2: 8 wallclock secs ( 7.25 usr + 0.57 sys = 7.82 CPU) @ 12787.72/s (n=100000)
packh2i: 8 wallclock secs ( 7.54 usr + 0.61 sys = 8.15 CPU) @ 12269.94/s (n=100000)
Rate packh2i packh2 chrhexi chrhex
packh2i 12270/s -- -4% -9% -10%
packh2 12788/s 4% -- -5% -6%
chrhexi 13459/s 10% 5% -- -1%
chrhex 13624/s 11% 7% 1% --
perl -v
This is perl, v5.8.8 built for i386-linux-thread-multi
uname -a
Linux colinux.localdomain 2.6.11-co-0.6.4 #1 Mon Jun 19 05:36:13 UTC 2006 i686 i686 i386 GNU/Linux
0525518
2007/03/31(土) 06:34:34ID:x8D9Mjhzあっ本当ですね
でも文法でひっかかるのはその下の
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;という部分なんです
0526518
2007/03/31(土) 07:58:19ID:x8D9Mjhzエラーってでるとこが悪いとは限らないんですね
ありがとうございました
0527nobodyさん
2007/03/31(土) 11:00:31ID:???/がないから、s/の/までがtrだと思われてるわけだろ?
0528nobodyさん
2007/03/31(土) 11:01:12ID:???0529nobodyさん
2007/04/01(日) 07:53:31ID:uYKSgLT/�T if(not exists $FORM{'adminpass'}) {
printGatePage();
}
�U elsif($FORM{'adminpass'} eq $ADMINPASS) {
loadUserfile();
}
else {
printErrorPage("管理パスワードが違います。");
}
exit;
というプログラムでif文とelsif文について教えてください
�Tが真 つまり$FORM{'adminpass'}がなかった場合
�Tのプログラムが実行されて�Uのelsifのプログラムは実行されないはずなんですが
本によれば�Uのプログラムも実行されるんです
どういうことかと言いますと
�Tで真
→$FORM{'adminpass'}がないのでprintGatePage();で$FORM{'adminpass'}を存在させるようにする
→�Uのプログラムが実行
となっています
これは本当は�Tが真であれば�Uのプログラムは実行されず終わるんではないでしょうか?
よろしくおねがいします
0530nobodyさん
2007/04/01(日) 08:34:15ID:???0531nobodyさん
2007/04/01(日) 08:43:42ID:???# ローマ数字(I、II、III、…)は機種依存なので使うのをやめましょう
# 本によれば、というからには、本のタイトルや出版社など原典がわかるようにしましょう
%FORMについてなにも説明がありませんが、はフォームデータを解析・デコードして入って
いるのだと思います。で、Iが真ならばIIは評価されないというのはその通りです。
なお、「$FORM{'adminpass'}がなかった場合」というのは、%FORMに adminpassという
キーが存在しなかった場合、という意味です。普通パスワードの入力欄は、inputタグを
使うのであり、空欄のままsubmitを押しても、"adminpass="という文字列が送られて
きますので、それを%FORMに格納した場合、 adminpassというキーは存在しているので、
Iは常に偽となります。パスワードが空欄かどうかを判定するには、existsではなく
空文字列との比較($FORM{adminpass} eq "")をする必要があります。
0532529
2007/04/01(日) 09:36:29ID:uYKSgLT/自分で確かめたらelsifが実行されていたのでここで聞いています
>>531さん
詳しい説明ありがとうございます
ではなぜelsifのプログラムが実行されたのでしょうか??
プログラム全部を載せたいのですが改行で無理みたいなので…
sub printGatePage
{
print <<END;
Content-type: text/html; charset=$CHARSET
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><title>ゆーざーかんり</title></head>
<body>
<h1>ユーザー管理</h1>
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
管理パスワード:<input type="password" name="adminpass"><br>
<input type="submit" value="決定">
</form>
</body>
</html>
END
}
本の名前は『10日でおぼえる Perl/CGI』著:高橋大吾です
この本の6章で認証プログラムを作っているのですが
0534nobodyさん
2007/04/01(日) 13:23:47ID:???・I → printGatePage() → II → loadUserfile()
という流れだと思い込んでるから、自分で確かめても if と elsif を両方通ってると思うだけで。
・何かのフォームからPOST → Iが真 → printGatePage() → exit # >>532のHTMLを吐いて一旦終了
・続いて「ゆーざーかんり」ページからPOST → 同じスクリプトが叩かれる → Iが偽 → II
…こう動いてるような気はしませんか。
0535529
2007/04/01(日) 15:33:33ID:uYKSgLT/本当に捨ててやりたいです
でも独学なのでこの本が一番分かりやすかったんで…
>>534さん
つまり
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
でもう一度同じとこに戻っていることですよね??
ありがとうございました 大変助かりました
0536nobodyさん
2007/04/03(火) 16:20:52ID:7w7pj3iquse CGI;
foreach (&CGI::param) {
$FORM{$_} = &CGI::param($_) || undef; }
print &CGI::header(-charset=>'Shift_JIS'),
&CGI::start_html(-encoding => 'Shift_JIS');
if(not exists $FORM{'adminpass'}) {
&printGatePage; }
elsif($FORM{'adminpass'} eq 'aaaa') {
&loadUserfile; }
else {
&printErrorPage; }
sub printGatePage {
print <<END;
<h1>ユーザー管理</h1>
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
管理パスワード:<input type="password" name="adminpass"><br>
<input type="submit" value="決定"></form></body></html>
END
exit(0); }
sub loadUserfile {
print 'loadUserfile</body></html>'; exit(0); }
sub printErrorPage {
print 'printErrorPage</body></html>'; exit(0); }
0537nobodyさん
2007/04/03(火) 20:04:01ID:Ex+wZs3rLocationヘッダをContent-type:text/htmlを出力した後に
使いたいのですが何か方法はないでしょうか。
0538nobodyさん
2007/04/03(火) 20:51:15ID:???<q cite="http://www.studyinghttp.net/cgi-bin/rfc.cgi?3875#Sec6.2.2">
スクリプトはいかなる他のヘッダフィールドも message-body も
返してはならない
</q>
0539nobodyさん
2007/04/03(火) 20:52:16ID:???これなんですが、標準入力をリダイレクションでファイルに変更すると
標準出力されません、なぜでしょうか?
0540539
2007/04/03(火) 20:53:22ID:???0541539
2007/04/03(火) 20:54:01ID:???http://homepage2.nifty.com/~~~/utf8_decode.pl
0542nobodyさん
2007/04/03(火) 21:07:53ID:???0544nobodyさん
2007/04/03(火) 21:22:35ID:???Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/163-178
0545537
2007/04/03(火) 21:22:59ID:???つまりはできないということなのでしょうか?
もしできないのであればCGIにてhtmlを出力した後に
別ページを表示することはMETAタグを使わずには打
開策すらないのでしょうか…。
0549nobodyさん
2007/04/04(水) 09:32:06ID:???0550nobodyさん
2007/04/04(水) 14:01:56ID:???6.2.4. Client Redirect Response with Document
にできるのかな。
0551539
2007/04/04(水) 20:34:07ID:???D:\htdocs\awstats\utf8_decode.pl < T:\Logs\a.txt
ではダメで、
perl D:\htdocs\awstats\utf8_decode.pl < T:\Logs\a.txt
ではOKです。
先頭のperlを書きたくなければ、下記らしいです。
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
\Policies\Explorer
にInheritConsoleHandlesというDWord値を作り1をセット
0552nobodyさん
2007/04/04(水) 21:42:58ID:???0553nobodyさん
2007/04/04(水) 23:16:32ID:???とりあえず、正常動作おめ
0554nobodyさん
2007/04/05(木) 00:54:13ID:???0556nobodyさん
2007/04/05(木) 11:31:17ID:???配送エラーのとき、$from_mailに返信させたいのですができません。
$from_mail="[email protected]"; # $from_mailは存在します。
$to_mail="[email protected]"; # $to_mailは存在しません。(hoge2.jpは存在しないものとします。)
open (MAIL,"| $mail_pass -t") || &error("posfixエラー");
# print MAIL "Error-To: $from_mail\n"; # Error-To:ヘッダがあっても無くても返ってきません
print MAIL "From: $from_mail\n";
print MAIL "To: $to_mail \n";
これを実行したところ、エラーの連絡が$from_mailに送信されません。
上記と同じメールの内容で、outlookを使用して、手作業で送信すると
件名:failure notice のエラーのメールが、返ってきました。
・posfixの設定で、足りないものあるのでしょうか?
・perlのプログラミングで、足らないことがあるのでしょうか?
よろしくお願いします。
0557nobodyさん
2007/04/05(木) 11:42:22ID:???> $from_mail="[email protected]"; # $from_mailは存在します。
> $to_mail="[email protected]"; # $to_mailは存在しません。(hoge2.jpは存在しないものとします。)
メール送信以前の問題なので$from_mail,$to_mailの値をチェックすることを
お勧めします。
ヒント: 文字列リテラルへの(配列)変数の埋め込み
0558nobodyさん
2007/04/05(木) 11:43:28ID:???シングルクォートで
$from_mail = '[email protected]';
$to_mail = '[email protected]';
としてやればおk
# hoge.jpは実在するドメインだから、こういうときの例にはexample.comを使おうな
0559nobodyさん
2007/04/05(木) 12:29:53ID:???>>558
お返事ありがとうございます。
シングルクォートに変更し、存在するメールには、
送信できること確認できました。
[cgi]
$from_mail = '[email protected]';
にしてみましたが、配信エラーの通知がされませんでした。
また、ドメイン検索で存在しないことを確認したドメインを
指定してもだめでした。
[outlook]
手作業で送信したとき、配信エラーが返って来るか確認してみました。
存在しないことを確認したドメインで、outlookでyahooや他のメールサーバから
送信すると戻ってきましたが、'[email protected]'は、戻ってきませんでした。
[考察]
ドメイン検索で存在しないことを確認したドメインで
outlookから送信すると、普通にエラーが帰ってきました。
cgiだと帰ってきません。cgiでなにかおかしいんじゃないかと思ってます。
open (MAIL,"| $mail_pass -t")の-tオプションが無いと
メール送信できなかったので付けてます。
思い当たることなどありますでしょうか。
よろしくお願いします。
0560nobodyさん
2007/04/05(木) 13:09:03ID:???まったく無関係で、送信プログラムにsendmail(postfixのsendmail互換コマンド)
を使っているならばプログラムを実行したユーザのアドレスになるのがデフォルトで、
変更したい場合は-fオプションで指定する必要がある。
open (MAIL,"| $mail_pass -t -f $from_mail")
0561nobodyさん
2007/04/05(木) 16:00:15ID:???丁寧な解説ありがとうございます。
open (MAIL,"| $mail_pass -t -f $from_mail")
にしてみましたが、配送エラーのメール送信されませんでした。
Envelope-From:ヘッダー、を試しましたがエラーは返信されませんでした。
cgiじゃなくて、postfixの設定ファイル/etc/postfix/main.cf
の設定がおかしい可能性高いでしょうか?
/etc/aliasesの設定がおかしいのかと思いまして、
FROM:ヘッダーを除いて、存在するメールを指定すると、
送信者はApache表示で$from_mailは、きちんと指定されていました。
$from_mailは、レンタルサーバのメールアドレスですが、
postfixサーバから普通に送信できるので、大丈夫だと思うのですが。
ん〜。難しいです。
0562nobodyさん
2007/04/05(木) 16:40:06ID:???postfixのログを見られるなら見るのが一番だが、レン鯖などで
見られないなら、まず自分に送ってみて届いたメールが思い通りに
なっているか確認するのが基本だな。
envelope fromはたいていreturn-pathというヘッダに保存されるので
それが自分が設定したつもりのものか確認するといい。
0563nobodyさん
2007/04/05(木) 16:56:54ID:???自宅サーバで、勉強してます。
違うcgiの過去の受信メール見てみるとReturn-Path:があるときと、
無いときがありました。ということは、cgiがおかしいのかもです。
どうもありがとうございました。
原因がわかりましたら、報告いたします。
0564nobodyさん
2007/04/05(木) 18:06:22ID:2CVq1dn3で、ググった結果jcodeg.plを知り、これをアップロードして、半角文字のみで
書き込みのテストをしたらちゃんと半角で表示されました。
とここまでは良かったのですが、文章に全角と半角文字を混ぜた状態で
投稿すると、投稿後の記事内の文章が全て全角で表示されてしまいます。
入力した通りに投稿するには、jcodeg.plのドコを変更したらよいのでしょうか?
0565nobodyさん
2007/04/05(木) 18:58:00ID:???0566nobodyさん
2007/04/05(木) 18:59:13ID:???0568nobodyさん
2007/04/06(金) 07:42:58ID:???port25は開けていました。
試しにコマンドラインで、[email protected]に送信してみました。
--------------------------
# /usr/sbin/sendmail -t
Envelope-From:"普段のメール"
To:[email protected]
.
--------------------------
で送信しましたが、配送エラーのメール返って来ませんでした。
・コマンドのオプション
・Envelope-From:"普段のメール"で、何かあるのか。
いろんなメール指定してみましたがダメでした。
・ヘッダーオプションで他に何か必要か
ぐらいと思うのですが、どのあたりがおかしいでしょうか。
これが解決したら、perlにそのまま反映すれば
配送エラー返ってくる気がするんですが。。。
よろしくお願いします。
0569nobodyさん
2007/04/06(金) 09:53:13ID:???Envelope-From: などというヘッダはない。
# /usr/sbin/sendmail -t [email protected]
To: [email protected]
本文…
.
#
のように指定します。-fの直後に指定するのがenvelopeアドレスです。
上記の場合、envelopeアドレスに何かメールを戻したいなら、Toヘッダのアドレスを
実際に存在しないアドレスとか、ドメインにしてみないと、Toのアドレスに普通にメールが
届いて終わるので注意。
さもなくば、telnet localhost 25 でMTAと直接交信してみるとか。
0570nobodyさん
2007/04/06(金) 12:41:32ID:???お返事ありがとうございます。
#/usr/sbin/sendmail -t -f<存在するメール>
To:[email protected]
エラーメール戻ってきませんでした。
メールが送信できたのか、送信できていないのかも区別が付きません。orz
DNSの設定かと思い検索してます。
スレ違いになってきてしまいまい、申し訳ないです。
maillogは、下記の通りです。
Apr 6 12:26:04 localhost postfix/pickup[20462]: 4CCACC04193: uid=48 from=<存在するメール>
Apr 6 12:26:04 localhost postfix/cleanup[20527]: 4CCACC04193: message-id=<・・・@mail.example.com>
Apr 6 12:26:04 localhost postfix/qmgr[17310]: 4CCACC04193: from=<存在するメール>, size=301, nrcpt=1 (queue active)
Apr 6 12:26:04 localhost postfix/qmgr[17310]: 4CCACC04193: to=<[email protected]>, relay=none, delay=0,
status=deferred (delivery temporarily suspended: Host or domain name not found. Name service error for name=example.jp type=MX:
Host not found, try again)
0571570
2007/04/06(金) 19:26:09ID:???経過ですが、存在しないメールアドレスに送信した場合、
delivery temporarily suspended: Host or domain name not found.
Name service error for name=example.jp type=MX: Host not found, try again)
このパターンになるようです。
やっぱり、エラーのメールが自分に帰ってこないと不便ですよね。
tailf maillogで、眺めていたら突然、上記のパターンでログが大量に流れました。
昔送信したでたらめなメールで、しかも、try againっていうぐらいなので、
送信されずに、再送待ちになってるみたいです。
ttp://www.postfix-jp.info/trans-2.0/jhtml/faq.html
あとは、再送待ちじゃなくて、配送エラーが送信すればいいんですね。
再送のメールはどこにあるのとか、いろいろ、つまずいてます。
あとちょっとのような気がしてきました。
丁寧にレスありがとうございました。
0572570
2007/04/07(土) 04:16:46ID:???で解決しました。
ログを見ることと、検索能力が少しアップしました。
ありがとうございました。
0573nobodyさん
2007/04/07(土) 18:44:41ID:MSfJ44Rvよいですか?
Linuxです。
0574nobodyさん
2007/04/07(土) 18:50:58ID:???とか置いてそこからlwpなりで適当に
取ってくればいいんじゃないすか
0575573
2007/04/07(土) 19:10:45ID:MSfJ44RvPerlでグローバルIPを取得する関数がないとすると、
シェルで組んだ方がよさそうですね。。
ありがとうございました
0576nobodyさん
2007/04/07(土) 19:31:41ID:???とか勝手なこと言ってみる
0577nobodyさん
2007/04/07(土) 19:56:03ID:???127.0.0.1みたいなのを取り除いて残ったもの」とすればよさそうだが、
これを複数もつホストもあるだろうなぁ。
0578nobodyさん
2007/04/08(日) 03:05:36ID:???ルータやファイアウォールがあってNATされているのかで話が違ってくる。
後者の環境の方が多いんじゃないか。
だとすると、外部のサーバにアクセスしてそのサーバ側から教えてもらうとか。
あるいは、ルータの管理画面を自力で取得してパースするとかね。
0579nobodyさん
2007/04/08(日) 04:54:35ID:???場合によってはこんな方法も
use Socket;
print inet_ntoa(scalar gethostbyname($ENV{HTTP_HOST}));
0580nobodyさん
2007/04/08(日) 06:44:51ID:???俺はDDNSの更新する時ルータに教えてもらってる
0581nobodyさん
2007/04/08(日) 09:30:52ID:???http://pc11.2ch.net/test/read.cgi/tech/1112553783/
本人か?
0582nobodyさん
2007/04/08(日) 09:31:57ID:???0583nobodyさん
2007/04/08(日) 10:08:34ID:???そこから「10」という数字の列だけを参照するには
どうすればいいのでしょうか?
index関数だと100や210など10が含まれていたら
抜き出してしまうので悩んでいます。
検索で調べる場合の検索用語でもかまいませんので、アドバイスお願いしますorz
0584nobodyさん
2007/04/08(日) 10:54:12ID:???詳しく日本語で
0585エスパー
2007/04/08(日) 11:35:44ID:???をエスパー日本語訳してみる。
こんな内容のファイルがあります。
--------
210 hoge
10 foo
100 guge
10 zoo
123 boo
--------
この場合 "10 foo" と "10 zoo" の行だけを抜き出したいのですが、index関数だと
210、100 といった行も含まれてしまいます。
どしたらいいの? お前らとっとと教えろ。
0586583
2007/04/08(日) 12:42:51ID:???$xx =~ /^$yy$/ でいけました。お手数かけました、ごめんなさい。
0587nobodyさん
2007/04/08(日) 12:58:04ID:???だがな、それなら eq で比較するだけでもよさそうだな。
0588nobodyさん
2007/04/10(火) 04:15:40ID:???> 過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
これ見ようとするとリダイレクトされて過去ログ閲覧不可なのね。
> 現在、mirrorhenkan/perl/ はFREESPACE利用規約の禁止事項に
> 抵触しているためアクセスを制限しております。
0589nobodyさん
2007/04/11(水) 01:18:30ID:???open(IN, $file);
@list = <IN>;
------------------------------------
#�Awhileで一行ずつ読み込んで処理
open(IN, $dfile);
while ( $line = <IN >) {
#$lineを区切り文字を分割して、何か処理
}
何十Mというサイズの大きいCSVファイルを扱うときが前提です。
�@だと配列に格納するみたいですが、メモリの消費は大変でしょうか?
�Aのほうがよいでしょうか?
0590nobodyさん
2007/04/11(水) 01:35:16ID:???(1)の方はCSVが1GBならメモリも1GB以上使うわけだが、(2)は
CSVのサイズが1MBでも10GBでも変わらない。
ってことはわかってるわけだな。
答えわかってんじゃん。
しかし、割り切って(1)の方法を使う場合もあるよ。
書き捨て的なスクリプトとかだと。
っちゅうか、丸数字やめね?
0591nobodyさん
2007/04/11(水) 03:38:11ID:???パソコンの仕組みとperlの勉強を、はじめたばかりで、
メモリの動きとか、あまり考えたこと無かったので、
ちょっと自信がありませんでした。^^;
どうもありがとうございました。
0592nobodyさん
2007/04/11(水) 04:20:00ID:???そんなコンパクトに収まるかよw
0593nobodyさん
2007/04/11(水) 10:31:55ID:???少しお尋ねします。
例えば
perl -pi.bak -e "tr/A-Z/a-z/"*.html
とか便利ですよね?
これを.plとして使いたいのですが無理なのでしょうか?
コマンドラインから打ち込むしか手がないのでしょうか?
0594nobodyさん
2007/04/11(水) 10:41:24ID:???http://pc11.2ch.net/test/read.cgi/tech/1173880452/235
0595nobodyさん
2007/04/11(水) 10:41:25ID:???0596nobodyさん
2007/04/11(水) 10:45:21ID:???こちらに変えました。
申し訳ない。
0597nobodyさん
2007/04/13(金) 14:21:28ID:ZxZihQHU0598nobodyさん
2007/04/13(金) 14:45:10ID:???詳しくはperlvar(1)の
Technical Note on the Syntax of Variable Names
を読め。
0600nobodyさん
2007/04/13(金) 17:45:43ID:???$::HOGE = 1;とかもだめ?
後はこんなの書いといてプログラムの頭でuseするとか
package Global;
use strict;
use warnings;
use base qw(Exporter);
our @EXPORT = qw($BAKA $AHO $SHINE);
our $BAKA = 1;
our $AHO = 'a';
our $SHINE = 'A';
push(@UNIVARSAL::ISA,__PACKAGE__);
package TEST1;
use strict;
use warnings;
printf "%s::BAKA=%s\n",__PACKAGE__,$BAKA++;
printf "%s::AHO=%s\n",__PACKAGE__,$AHO++;
printf "%s::SHINE=%s\n",__PACKAGE__,$SHINE++;
package TEST2;
use strict;
use warnings;
printf "%s::BAKA=%s\n",__PACKAGE__,$BAKA++;
printf "%s::AHO=%s\n",__PACKAGE__,$AHO++;
printf "%s::SHINE=%s\n",__PACKAGE__,$SHINE++;
0601nobodyさん
2007/04/13(金) 18:12:42ID:???importするのが普通の方法なので、あまり変なことをせず従っておいたほうが
なにかといいと思われ。
0602597
2007/04/13(金) 20:19:19ID:ZxZihQHUありがとうございます。試してみます。
何に使うってわけじゃなくて、そういうことが出来るのなら知りたいなと思いまして。有難う御座いました。
>>599
顔が見えないからってそういう言い方はしないほうがいいでしょうね。
0603nobodyさん
2007/04/14(土) 04:03:04ID:???検索機能をつけて、検索語句を$wordとし、
$dataに一致するものがあれば、って形でやってます。
if($data =~ /\Q$word\E/){
すると、「[」で「ー」もヒットしてしまったりします。
これは「ー」に「[」のコードが含まれているからだと思うのですが、それを除外する方法はどうしたらよいでしょうか?
0604nobodyさん
2007/04/14(土) 04:08:26ID:???0605nobodyさん
2007/04/14(土) 04:17:21ID:???なるほどutf8という方式だとコードの重複がないんですね
検索語句と、検索対象をutf8に一旦エンコしてから、ってやり方にしてみます。
有難う御座いました。
0606nobodyさん
2007/04/14(土) 05:37:58ID:???みたいな感じに簡単にできると思ってましたが、複雑ですね。
一時的に対象の$変数をutfに変換して戻す簡単な方法は御座いませんでしょうか?
調べた限り、utfでスクリプトを書くことが前提の記事ばかり出てきてしまいます。
0607nobodyさん
2007/04/14(土) 10:35:22ID:???0608nobodyさん
2007/04/14(土) 11:07:17ID:???my %hash = ();
$hash{a}{b}{c}{d} = 'test';
↑の場合だと自動的に {b}{c}{d}の部分が無いのに自動的に作られてしまいます。こういうのを防ぎたいのですが・・
0609nobodyさん
2007/04/14(土) 11:22:25ID:???既にありそうだけど。
0610nobodyさん
2007/04/14(土) 12:46:48ID:???http://pc11.2ch.net/test/read.cgi/tech/1173880452/10
0611nobodyさん
2007/04/14(土) 12:50:45ID:???http://pc11.2ch.net/test/read.cgi/tech/1173880452/10
utf8でスクリプト書くことがそんなに困るの?
今あるsjisやeucのスクリプトをエディタなどで変換するだけでしょ。
0612nobodyさん
2007/04/15(日) 03:41:41ID:???困るというか、モバイル機などでutf8がバケる機種があってそれに対する対策が自分はまだわかってないってだけです。
気分を害してしまったのならすみません。
0613nobodyさん
2007/04/15(日) 03:57:25ID:???0614nobodyさん
2007/04/15(日) 09:33:34ID:???古い機種つかってる人なんか無視
0615nobodyさん
2007/04/15(日) 11:29:23ID:???古い機種の携帯からのアクセス時だけJcode.pmか何かで
Shift_JISにエンコードすればいいだけの話じゃね?
if($ENV{HTTP_USER_AGENT} =~ /<適当に古い携帯の条件>/){
require Jcode;
$data = Jcode->new($data, 'utf8')->sjis;
print "Content-Type: text/html; charset=shift_jis\n\n";
print $data;
}else{
print "Content-Type: text/html; charset=utf-8\n\n";
print $data;
}
みたいに
0616nobodyさん
2007/04/15(日) 14:24:51ID:???611のリンク先をよく読んで。
utf-8を使うのは、あくまでもPerlスクリプトだけであって、
入出力はsjisだよ。
0618nobodyさん
2007/04/16(月) 08:23:29ID:???「Perlスクリプトはsjisで、内部で扱うデータは
utf8というのはできない」という事で、FAなのかな?
0619nobodyさん
2007/04/16(月) 11:00:24ID:???Windows上であっても。
0620nobodyさん
2007/04/16(月) 13:15:51ID:MjOOmdj6どのような方法がよいでしょうか?
指定方法は、
1.X行目からY行分
2.最終行(何行目かは分からない)から数えてX行目からY行分
の2通りです。
0621nobodyさん
2007/04/16(月) 14:24:24ID:???Perlで扱うマルチバイト文字は、内部的には「常に」utf8だよ。
use encoding を使えばsjis でスクリプトを書くこともできるが、
副作用があるから、よく理解した上で使わないといけない。
>>620
File::Tieを使うのが吉
0624nobodyさん
2007/04/16(月) 18:55:47ID:???}
このような条件式をもっとスマーティーに書きたいのですが・・・
良きアイデアをお願いします!
0625nobodyさん
2007/04/16(月) 19:12:41ID:???&foo;
}
0626nobodyさん
2007/04/16(月) 19:18:36ID:???なんか自分が情けなくなってきました・・
0630nobodyさん
2007/04/16(月) 22:29:15ID:???0631nobodyさん
2007/04/16(月) 22:35:41ID:???$x > -1 && $x < 1
は、個人的には直感的じゃないと思った。
こう書くんだとしても
-1 < $x && $x < 1
にしたほうが視覚的に分かりやすい。
0632nobodyさん
2007/04/16(月) 23:05:14ID:???とか書けたら一番幸せなんだけどな。
# ソースフィルタ使えばできるか?
0633nobodyさん
2007/04/16(月) 23:17:54ID:???0634nobodyさん
2007/04/16(月) 23:28:48ID:???0635nobodyさん
2007/04/16(月) 23:51:39ID:???他のサービスも同時に動いていて、Perlが使用してるメモリだけを知りたい。
0636nobodyさん
2007/04/17(火) 03:37:59ID:???0637nobodyさん
2007/04/17(火) 06:11:09ID:nSKTWe9a男性 $mensfile
女性 $ladysfile とメインのCGIで設定されていす。
チャレンジしてみたら、過去のログファイルが全て消えてしまい散々な目に会いました。下のどちらかでできそうな・・宜しくお願い致します。
(1)# 二重登録のチェックをします
if(-e $data){
open(FILE, "< $data"); # この時点でファイルは必ず存在します
while(<FILE>){
@v = split(/\t/);
if(@v[0] eq $name){
print "<center><b>すでに$nameさんは登録されています</b><br>\n";
print "「戻る」を押して入力しなおしてください</center>\n";
exit(0);
}
}
close(FILE);
}
0638637
2007/04/17(火) 06:12:56ID:nSKTWe9a&lock;
if(!open(IN,"$mail01"))
{print 'ファイルOPENができませんでした。',"\n"; exit;}
@dataline = <IN>;
close(IN);
unlink $lockfile;
foreach $DATA (@dataline) {
chomp $DATA;
if($DATA eq $MAIL){
print 'このメールアドレスは既に登録されています。',"\n";
exit;
}
宜しくお願い致します。
0639nobodyさん
2007/04/17(火) 09:23:10ID:???二重登録チェックの方法はひとまず置いといて、
ログファイルが消えちゃったってことは
書き込みの段階でしくじってるんじゃないの?
ありがちな例だと
× open (FILE, '> file.txt'); # 上書き(つまり消える)
○ open (FILE, '>> file.txt'); # 追加書き込み
とか。
0640nobodyさん
2007/04/17(火) 09:43:54ID:???ないし、ここで回答もらえるレベルに達してない質問の典型だね。
「日本語でOK」「エスパー回答者さんよろしく」ということで。
質問する側にも最低のスキルは必要で、問題を理解してもらえないことには
どうにもならんよ。
0642nobodyさん
2007/04/17(火) 10:35:21ID:???0644nobodyさん
2007/04/17(火) 17:05:48ID:???! int $x and ! int $y
って手もある罠、、、
0646nobodyさん
2007/04/17(火) 17:13:38ID:???0648nobodyさん
2007/04/17(火) 23:26:16ID:???何となくスレの雰囲気から察すると
『はじめてのPerl』マスターレベルは初心者じゃないよね、もう。
『続・はじめてのPerl』に至っては
題名だけ聞くと優しそうだけど、
マスターしたら、CPAN Authorくらいなれちゃうし。
俺的には、『はじめてのPerl』読みこなし中レベルだと解釈してるが、どうか?
0649nobodyさん
2007/04/18(水) 00:03:35ID:???じゃないかな
0650nobodyさん
2007/04/18(水) 00:12:31ID:???0651nobodyさん
2007/04/18(水) 08:05:12ID:???0652nobodyさん
2007/04/18(水) 10:28:13ID:???ファイルから読み込むことは可能でしょうか?
pack('C4', 255, 255, 255, 255) とすると4バイト(FF FF FF FF)になるかと思ったんですが、
8バイト(C3 BF C3 BF C3 BF C3 BF)になってしまいます・・・
0653652
2007/04/18(水) 11:33:42ID:???0654nobodyさん
2007/04/18(水) 11:56:14ID:???> 「Perlスクリプトはsjisで、内部で扱うデータは
> utf8というのはできない」という事で、FAなのかな?
リテラルの話であれば、Encode.pm で明示的に変換して使う分にはやりたい放題です。
Perl 5 の時点ではデフォルトで use bytes 状態なので、スクリプト内のリテラルが SJIS でも UTF-8 でも iso-8859-1 でも、perl にとってそれらは単なるオクテットシーケンスに過ぎません。
0655nobodyさん
2007/04/20(金) 14:39:02ID:???当たり前のようにmod_php前提のPHPに「Perl遅いし」とか言われても仕方ない。
0656nobodyさん
2007/04/20(金) 15:21:01ID:???0657nobodyさん
2007/04/20(金) 15:30:53ID:???> print "「戻る」を押して入力しなおしてください</center>\n";
にしてもきったねーHTMLだな
0658nobodyさん
2007/04/20(金) 15:59:34ID:???0659nobodyさん
2007/04/20(金) 17:22:02ID:???0660nobodyさん
2007/04/20(金) 22:18:03ID:???0661nobodyさん
2007/04/21(土) 05:09:19ID:???なにそれ?w
0662nobodyさん
2007/04/21(土) 09:34:59ID:???0663nobodyさん
2007/04/21(土) 13:00:06ID:???ロードできるようにするモジュールは無いか? という質問だとわかる。
0664nobodyさん
2007/04/21(土) 18:05:32ID:TzVmcQvU引数を省略すると$_が渡される
ようなサブルーチンを作る方法はある?
0665nobodyさん
2007/04/21(土) 18:17:53ID:???0667664
2007/04/21(土) 18:37:51ID:TzVmcQvUうわ、言われてみれば単純な話ですね…
ありがとうございました
0668nobodyさん
2007/04/23(月) 15:02:16ID:NvRgzOjiカウンターの箇所に「Location:…」も表示されてしまいます。
カウントした数字だけ表示して、指定したURLに遷移させる機能を保持するにはどうしたらいいですか?
何かトンチンカンなこと言ってたら指摘お願いします。
0669nobodyさん
2007/04/23(月) 16:33:16ID:LAYu+KhNホームページ作成ソフトがあったらいいのに・・・。
もし、プロ並みにキレイなホームページが作成が出来たとしたら、
情報商材で一旗あげようと思っているあなたの人生は変りますか?
【早くも成功者続出!】起業サイトビルダー
http://www.infotop.jp/click.php?aid=16484&iid=5683
0670nobodyさん
2007/04/23(月) 17:00:46ID:???どういうタイミングで遷移させたいのか。
表示したらすぐに遷移してしまったら、表示を見る暇がない。
クリックしたら、であれば、出力したカウント文字列なりイメージにaタグを張ればよいです。
0671nobodyさん
2007/04/23(月) 18:06:45ID:???すいません説明不足でした。
今作っているのは、
メールフォームに入力して送信ボタンを押すと、
送信完了ページにアクセスカウンタが表示されるというもので、
SSIを使ってそのページにカウントを表示させています。
0673nobodyさん
2007/04/24(火) 14:35:35ID:???送信完了ページにSSIのカウンタを表示させているのはわかったが、なぜカウントの出力と一緒に
Locationヘッダを出力しようと思ったのか、それを書いてくださいよ。
0674nobodyさん
2007/04/25(水) 03:14:10ID:???Location(も使い方間違ってるがw)じゃなく、
入力したフォームの値を隠し属性にして
同時にカウンタも仕込んだ別のページを表示させる。
0675nobodyさん
2007/04/25(水) 04:08:26ID:???・静的HTMLで作られた送信完了ページの冒頭に<meta>でrefreshでも入れとく。
・動的に吐かれる送信完了ページを吐く前の段階でカウント*だけ*して(表示要らない)
送信完了ページを吐く代わりに Location: を吐いて希望のページに飛ばす。
期待してる動作はこんな感じなんじゃないのかな。
0676nobodyさん
2007/04/25(水) 16:31:04ID:???送信完了ページはCGIが吐き出すタイプだね?
その中にSSIのカウンタを仕込もうとしてprint "Location:カウンターのスクリプト"とか書いたんじゃないの?
メールフォームのスクリプトにカウンターの機能を組み込んで送信完了ページに書き出せばいいじゃん。
SSIなんて必要ないよ。
0677nobodyさん
2007/04/25(水) 18:21:45ID:???やりたいことはフォームに入力されたデータをCGIで受け取り一括編集です。
<tr><td>NO</td><td>項目1</td><td>項目2</td></tr>
<tr><td><input type="hidden" name="no" value="1_g9gnt3">1_g9gnt3</td>
<td><input type="text" name="text1"></td><td><input type="text" name="text2"></td></tr>
<tr><td><input type="hidden" name="no" value="2_ghtt3d">2_ghtt3d</td>
<td><input type="text" name="text1"></td><td><input type="text" name="text2"></td></tr>
・
・
とログのデータと比例して続くフォームからデータを受け取り、
ログ形式 log.txt
------------------------
1_g9gnt3<>text1<>text2<>
2_ghtt3d<>text1<>text2<>
・
・
------------------------
と続くログとを照らし合わせてPOSTデータの「no」とログの先頭が一致する場合、
一致した行のtext1とtext2を書き換えたいと思っています。
一行ずる編集するスクリプトは書けましたが、
POSTで受け取った指定行を一括で同時編集するソースがわかりません。
お手数おかけしますが是非ご教授ください。
0678nobodyさん
2007/04/25(水) 20:05:49ID:???0679nobodyさん
2007/04/25(水) 23:47:47ID:???たとえば、下記のようなデータが投げられたときのソースを教えていただければと思います。
mode=edit&no=1_g9gnt3&text1=hoge1&text2=huga1&no=2_ghtt3d&text1=hoge2&text2=huga2
こんな感じのデータが投げられたときどうやったらやりたいことができるのか、
全く持ってわかりません。。
0680678
2007/04/26(木) 00:06:04ID:???分解できないのか? 変数に格納できないのか? ループが分からないのか? 顔が濡れて力が出ないのか?
0681nobodyさん
2007/04/26(木) 00:12:28ID:???さらにはスレ違いの予感さえする。
でもヒマなので、親切にしてやる。
(1) &で分割してから配列に格納。
(2) ループで配列内を、=で分割してからハッシュに格納。
あとは…分かるな。
普通は、CGI.pm使うのが一般的だろうな。
0682nobodyさん
2007/04/26(木) 00:42:18ID:???>>681
わざわざご親切にありがとうございます。
流れとしては
[&]で分割後配列へ格納→配列分ループ→ループ中に[=]で分割→noと一致する行があれば書き換え
という感じかと思い、色々ソースを書いてみましたが無限ループにはなるは、
配列分のループが上手く行かないとかぐっちゃになってしまって。。
(それで具体的なソースが欲しくなり、教えて君になってしまいました。。すみません。。)
ちょっと外出先にソース忘れてきちゃったので明日もう一度やってみます。
ハッシュとCGI.pmについて教えていただいたので調べてみます。
ありがとうございます。
0684682
2007/04/26(木) 10:14:48ID:???アドバイス、、よろしくお願いいたします。。
$formdata="mode=edit&no=1_g9gnt3&text1=hoge1"
. "&text2=huga1&no=2_ghtt3d&text1=hoge2&text2=huga2";
@pai = split(/&n/,$formdata);
open(IN,"$logfile") || print "error\n";
while($date = <IN>) {
$date =~ s/\x0D\x0A|\x0D|\x0A//;
my($no, $text1, $text2) = split(/<>/, $date);
for ($i=0;$i<@pai;$i++){
push @line, split(/&/,$pai[$i]);
($names, $values) = split(/=/,$line[$i]);
$p{$names} = $values;
if($no == $p{o}){
#書き込み処理
}
}
}
close(IN);
0685nobodyさん
2007/04/26(木) 10:50:46ID:???書いたとおりに動いてるだろと言われて終了だよ。
あとはエスパーさんよろしく。
なぜ/&n/でsplitするのかとか、あとでまたsplitするのはなぜかとか
$text1, $text2はどこへいったのかとか、@lineどんどん太るぞとか
いろいろつっこみどころはありそうだが。
0686682=677
2007/04/26(木) 10:59:54ID:???レスありがとうございます。
$logfile は下記です。
log.txt
------------------------
1_g9gnt3<>text1<>text2<>
2_ghtt3d<>text1<>text2<>
・
・
------------------------
やりたいことはログの一括編集です。
(掲示板なんかの編集機能などログファイルの一行だと思いますが
それの複数行を一括で編集するような機能)
&nの理由は&だけで分割したらforループ時回数がわからなくなってしまうなぁ、、
というなんとなくでやってみました。ループ中にもう一回splitした理由は
=で分割しないといけないかなぁ、、という理由です。
@lineが太るということについてはわかりません、、すみません。。
0687nobodyさん
2007/04/26(木) 12:23:48ID:???あまりにアレすぎて添削する気が萎えるので、チェックポイント。
・フォームデータのデコードはCGI..pmにやらせる
・フォームでtext1とtext2が何回も出てくるので、それが各行のnoの値とちゃんと対応させられるか保証がない
→そういうときは、
<tr><td><input type="hidden" name="no" value="1_g9gnt3">1_g9gnt3</td>
<td><input type="text" name="text1_1_g9gnt3"></td><td><input type="text" name="text2_1_g9gnt3"></td></tr>
というように、name属性にnoの値をつけて、CGIプログラムでデータを受けたときに参照しやすいようにすると吉。
つづく
0688nobodyさん
2007/04/26(木) 12:27:08ID:???use CGI;
use strict;
my $q = new CGI;
# noに指定された値の入力欄が存在するかの判定用
# name="no"のhiddenタグと、対応するtext1、text2のフィールドが
# 必ず対応していることが条件
my %no_exist = map { $_ => 1 } $q->param("no");
my @data;
open(R, $logfile) or die $!;
while (<R>) {
my($no, $text1, $text2) = split(/<>/);
push(@data, $no_exist{$no}
? join("<>", $no, $q->param("text1_$no"), $q->param("text2_$no"))."<>\n"
: $_
)
}
close(R);
open(W, "> $logfile") or die $!;
print W @data;
close(W);
※全角スペース使用のためコピペ注意。
結局全部書いてしまった…orz
動作確認してません。
$logfileの中身を@dataに全部食わせるので、ファイルサイズがでかいとメモリも食います。
0689nobodyさん
2007/04/26(木) 13:30:23ID:???「input nameの付け方が悪い」
これだけでおk
0690nobodyさん
2007/04/26(木) 14:21:39ID:2xFOBqUQそのディレクトリに別のディレクトリの中身をコピーしするCGIを作りたかったのですが
動きません>< 環境はジオシティーズのジオプラスです
ソース
#!/usr/bin/perl
# 1.REQUEST_METHODをチェックしてリクエストプロトコル(GET or POST)を判断する
if( $ENV{'REQUEST_METHOD'} eq "GET" ) {
# 2.GETであれば、QUERY_STRINGからクエリを読み込む
$buffer = $ENV{'QUERY_STRING'};
} else {
# 3.POSTであれば、CONTENT_LENGTHを使用してリクエストのサイズを調べ、
# 標準入力からクエリを読み込む
read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} );
}
print "Content-Type: text/html", "\n\n";
print "<HEAD>", "\n";
print "<META HTTP-EQUIV='Refresh' CONTENT='5;URL=index.html'>", "\n";
print "<META name='GENERATOR' content='IBM HomePage Builder 2001 V5.0.3 for Windows'>", "\n";
print "<title>作成</title>", "\n";
print "</HEAD>", "\n";
print "<font size=5>書き込み中</font>", "<br>\n";
print "<b>Data</b> ", $buffer, "<br>\n";
print "<b>Split Data</b><br> ", "\n";
0691nobodyさん
2007/04/26(木) 14:25:00ID:???本を一冊読め・・・
ソースにはディレクトリなんてひとかけらも出てきてないだろ
クエリ受け取ってそれ表示してるだけ。
もうなんていうか死ねばいいのに。
0692690
2007/04/26(木) 14:25:54ID:2xFOBqUQmy @pairs = split(/&/,$buffer);
foreach $pair (@pairs){
# 5.イコール( = )で連結されたキーと値を分割(kye=value)
my($name, $value) = split(/=/, $pair);
# 6.プラス( + )をスペース( )に変換
$value =~ tr/+/ /;
# 7.16進数にエンコードされた文字列をデコード
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
@data = ($name, $value);
print "$name : $value<br>";
mkdir (".$name", 0755) || die "ディレクトリ生成失敗 : $!";
open(IN,"./index.html"); #コピー元ファイル をオープン
while(<IN>){ # 一行毎の読み込みループで変数$Bufに読み込む
$Buf .= $_;}
close(IN); #ハンドル IN が不要になったので閉じる
open(OUT,"> ../$name/index.html); #コピー先ファイル をオープン
print OUT $Buf; #ソースの内容($Buf)を書き出す
close(OUT); #ハンドル OUT が不要になったのでクロス
}
と、このように書いてみましたがエラー表示が出て動きません><
エラーの詳細がわからないので直し方がわかりません。
エロイ人教えてください。
0693nobodyさん
2007/04/26(木) 14:28:28ID:???0694nobodyさん
2007/04/26(木) 14:30:01ID:???http://mixi.jp/view_bbs.pl?id=17607679&comm_id=1401396
Perlに関すること、cgiに関すること
なんでも質問できるコーナーです(たとえばApacheとかでもOKとします!)
(Web系であればOK)
ルール:
Google検索で調べてわかるようなことでも質問してもOKです
(初心者のうちは、どの情報を取捨選択したらイイのかわからないと思うので)
回答してくださるかたは、暖かく質問者を迎えてやってください
o(^^o) (o^^)o
ここ池
0695nobodyさん
2007/04/26(木) 14:30:49ID:???スクリプトの2行目に
use CGI::Carp qw(fatalsToBrowser);
と書きましょう。
シンタックスエラーの原因が表示されるようになります。
# まずは、これでいいんじゃね?>ALL回答者
0696682=677
2007/04/26(木) 17:01:44ID:???ずっとあれからやってたのですがなぜかハッシュに代入されなくて
ソース部分を別CGIとして作り、データを投げたところ上手く行きました。
これからもっともっと勉強して色々覚えたいと思います。
本当にありがとうございました!
0697nobodyさん
2007/04/26(木) 23:13:22ID:???動かすにはどうしたらいいのでしょうか?
IO::SelectはIO::Socketでないと使えないのでしょうか?
0698nobodyさん
2007/04/27(金) 09:34:20ID:???素直にsocket使うべき。
0699nobodyさん
2007/04/27(金) 14:53:44ID:???0700nobodyさん
2007/04/27(金) 20:33:48ID:???入所前(7年前)にはそんなの無かったはず
いやぁ〜プログラミングは楽しいね
0701nobodyさん
2007/04/27(金) 21:57:47ID:???0702nobodyさん
2007/04/27(金) 22:44:25ID:???0703nobodyさん
2007/04/28(土) 00:13:57ID:???下のように書いても5秒どころか30秒位待たされることがあるよ。
なんでだろう?
$ua = LWP::UserAgent->new;
$ua->timeout(5);
0704nobodyさん
2007/04/28(土) 01:22:35ID:???Get/set the timeout value in seconds. The default timeout() value is 180 seconds, i.e. 3 minutes.
The requests is aborted if no activity on the connection to the server is observed for timeout seconds. This means that the time it takes for the complete transaction and the request() method to actually return might be longer.
0705nobodyさん
2007/05/02(水) 11:13:15ID:sZgTnz1Hmy $a = 2/3;
としたら一体どうなるのでしょうか?
割り切れない数なのでforの∞ループみたいに悲惨なことになりますか?
今暗算練習のCGIを作ってます。足し算引き算までつけてあるのですが、
割り算もつけようかなと考えてたらこの問題にぶちあたりました。
my $a = int (rand 100) / int (rand 100);
実際はこんな感じで使おうと思ってたのですが、割り切れない計算になったときどうなるのでしょうか?
適当なところでやめてもらえるのでしょうか?
それとも/演算子に対して「小数点第5位まででやめろ」という命令をあらかじめだしておけるでしょうか?
0706nobodyさん
2007/05/02(水) 11:14:07ID:???0707nobodyさん
2007/05/02(水) 11:19:00ID:???やらずに質問するの?
脳の一部に障害のある方ですか?
0708nobodyさん
2007/05/02(水) 11:28:03ID:???これが気になってんだろう
0709nobodyさん
2007/05/02(水) 11:35:47ID:???> my $a = int (rand 100) / int (rand 100);
これ、計算せずにエラー吐いてくれるときがあるよ。
0710705
2007/05/02(水) 11:58:22ID:sZgTnz1Hその通りです。
>ときがあるよ。
というのは運任せという意味ですか?
それともuse strictのような無限ループコードストップモジュールでもあるという意味ですか?
0711nobodyさん
2007/05/02(水) 12:12:57ID:???0712nobodyさん
2007/05/02(水) 12:20:33ID:???0713nobodyさん
2007/05/02(水) 12:46:53ID:???0714nobodyさん
2007/05/02(水) 13:12:51ID:???>#!〜から始まる1行目(名前を忘れた)に変数を初期化するオプションがあったはず
SpeedyCGIのオプションって、
ttp://perldoc.jp/docs/modules/CGI-SpeedyCGI-2.21/SpeedyCGI.pod
ここ見つかりましたが、
#!/usr/bin/speedy
にどんなオプションつければ、いいでしょうか?
0715705
2007/05/02(水) 13:22:14ID:sZgTnz1Hなるほど。
では0ではないときの全てが無限ループのような事になってしまうのですか?
0717nobodyさん
2007/05/02(水) 13:47:59ID:???という発想にはならんのかな。
0718705
2007/05/02(水) 14:14:41ID:sZgTnz1Hmy $a = 2/3;
print $a;
とすると無限ループのように延々6.6666666666666666666666666666666666...
となるんでしょうか?ならないんでしょうか?
0719nobodyさん
2007/05/02(水) 14:16:22ID:???0720nobodyさん
2007/05/02(水) 14:28:30ID:???0721nobodyさん
2007/05/02(水) 14:33:08ID:???自分で試してみてはどうでしょうか
というか自分で試さないのはなぜでしょうか
私はPerlの実行環境がないのでPHPで試してみました
結果は
0.66666666666667
でした
ただみんながこの結果になるとは限りません
パソコンの環境(特にCPU)が変われば結果も変わることが多いです
0722nobodyさん
2007/05/02(水) 16:04:38ID:???○ あまりに馬鹿すぎて答えたくない
0723nobodyさん
2007/05/02(水) 16:13:48ID:???0724705
2007/05/02(水) 17:33:02ID:sZgTnz1Hありがとうございます!
なるほどです。適当なところで打ち切るようになっている可能性が高いわけですね。
ではその打ち切る桁数、小数点第何位までせよという命令は出せますか?出せませんか?
私の環境では小数点第15位のところで四捨五入されるようです。
小数点第30位まで計算させるなどはperlで制御はできないものなのでしょうか?
0725nobodyさん
2007/05/02(水) 17:42:01ID:???コンピュータのことをもっと勉強してください。
0726山本山
2007/05/02(水) 18:10:10ID:???0727nobodyさん
2007/05/02(水) 18:57:52ID:???その方法は絶対お前に教えてやんねー
少しは自分でやってから質問しろカス
0728705
2007/05/02(水) 19:05:56ID:sZgTnz1Hそんなにカマって欲しいのか?
確実に俺より頭いいだろうに精神年齢は俺以下じゃ恥ずかしいよ。
回答する気がなければ無視を決め込むというのがどこのスレでも回答者の大人のマナー。
0729nobodyさん
2007/05/02(水) 19:15:55ID:???自然と答えは出てくるさ
0731nobodyさん
2007/05/02(水) 19:25:46ID:???0732nobodyさん
2007/05/02(水) 23:06:30ID:???packとかsprintfでも適当にググってください
でなきゃ数値変換あたらでさがせばヒントぐらいはでてくるかと
で、それが分かったらプログラミングは卒業してください
0733nobodyさん
2007/05/02(水) 23:59:24ID:???もし、あなたが誰かに「カップラーメンの待ち時間を3分から5分に
変えたら味はどうなりますか?」と質問されたら、どう答える?
とりあえず「味が変わります」と答えたとして、
更に「どう味が変わりますか?」と質問されたら?
それに対して「美味しくなくなります」と答えたとして、
更に「どの位美味しくなくなりますか?」と質問されたら?
それに対して「食えなくもない不味さ」と答えたとして
更に「じゃあ、4分なら大丈夫ですか?」と質問されたら?
書き込みから>>705には、そういう質問者の感じがする。
だから、みんな「自分で試してみろ」と答える。
すごく自然。大人な対応。精神年齢も低くない。
むしろ、不自然なのは、そこまでしても自分で調べようとしない>>705
0734nobodyさん
2007/05/03(木) 02:48:42ID:4s8Yv8pi教えてください
0735nobodyさん
2007/05/03(木) 03:40:24ID:???っていうのは循環(無限)小数でしょ。算数(数学)をもう少し勉強してね。
無限ループっていうのは、
while (1) { print "6" }
のように、永遠に終わらないループのこと。
int(rand(100))は、何から何までの整数を返す可能性があるかわかって使っていましたか?
なお、コンピュータは内部的には2進数で計算しているので、丸め誤差というのがあるよ。
でかい小数桁数を扱うためのモジュールはあるけど、その手前のことをすべてこなしてから考えたら?
0736nobodyさん
2007/05/03(木) 04:03:11ID:???> それとも/演算子に対して「小数点第5位まででやめろ」という命令をあらかじめだしておけるでしょうか?
my $a = sprintf "%3.5f",int (rand 100) / int (rand 100);
これじゃダメ?
第5位までの結果を出せ、ってので、主旨とはそれるけど
0738nobodyさん
2007/05/03(木) 10:27:51ID:???IO::Allが助けになるかもしれない
0739nobodyさん
2007/05/03(木) 11:12:02ID:???0741nobodyさん
2007/05/03(木) 15:42:37ID:???&LWP::Simple::getstore
0743nobodyさん
2007/05/04(金) 16:26:45ID:???書き込みと表示を同一スクリプトでやる場合はファイルロックすればいいと思うんだけど、
書き込みと表示を別スクリプトにした場合、
書き込み用でログファイルに書き込みしてる時に表示用でログファイルを開くとログファイルが壊れると思うんだけど、
こういう場合はどういう風にすればいいの?
0744nobodyさん
2007/05/04(金) 16:38:32ID:???こういう頓珍漢な質問してるようだとロックを正しく理解してないから
勉強しなおせ。
0745nobodyさん
2007/05/04(金) 16:51:01ID:???一度に1プロセスのみがアクセスしていいよという自前のルール
ルールを無視したプロセスが一つでもあれば壊れる
0747nobodyさん
2007/05/05(土) 02:51:43ID:???0748nobodyさん
2007/05/05(土) 03:25:19ID:???PHPみたく日本語版の公式マニュアルはないけど。
0749nobodyさん
2007/05/06(日) 23:46:01ID:???コマンドラインにて
perldoc -h
して使い方をまなんで、
perldoc perl
perldoc perlfaq1
perldoc perlre
あたりから入れ
0750nobodyさん
2007/05/07(月) 02:13:17ID:???それぞれの画素のRGB値を一発で配列に入れてくれるようなモジュールありませんか?
0752nobodyさん
2007/05/07(月) 03:16:37ID:???0753nobodyさん
2007/05/07(月) 11:11:07ID:???X/Y値を指定してRGB情報を取ってくる
モジュールならどこかで見た覚えがあるので
後は気合と根性で
0754nobodyさん
2007/05/07(月) 11:35:40ID:???メモリが足りるかどうかは知らんけど。
ttp://www.imagemagick.org/script/perl-magick.php
0755750
2007/05/07(月) 21:07:25ID:???メモリは気を付けます。
0756nobodyさん
2007/05/08(火) 00:26:12ID:???でけぇ〜
是非共有鯖ではやってくれるな
0757nobodyさん
2007/05/08(火) 00:59:03ID:???32bitってのは、ビデオメモリに展開する時の話であって。
0758nobodyさん
2007/05/08(火) 01:11:06ID:???0759nobodyさん
2007/05/08(火) 01:24:11ID:???0760nobodyさん
2007/05/08(火) 18:48:57ID:???処理結果を表示した状態からラジオボタンのフォームへ復帰するのに、
$cgi->td($cgi->a(href=>{$ENV{SCRIPT_NAME}},
$cgi->input({type=>"button", value=>"戻る"})));
と書いてローカルのapache2.2に置いてiceweselで動作をチェックしたら戻るボタンで正常に復帰したのですが、IEでチェックしたら戻るボタンが機能しませんでした。
仕方なくJavaScriptを使って
$cgi->td(
$cgi->input({type=>"button", value =>"戻る",
onClick=>"history.back(-1)"}));
と書いてみたらIEでも戻るボタンが機能したのですけども、これではJaveScriptが使えないブラウザから使えません。
w3mとかでも使いたいので、なんとかJavaScriptに頼らない良い方法は無いでしょうか?
ブラウザの名前を取得してIEとIE以外で場合分けするしか無いのでしょうか?
0761nobodyさん
2007/05/09(水) 01:46:37ID:???イマイチ意味不明だけど、$cgi->aの引数が違うんじゃね
> $cgi->a(href=>{$ENV{SCRIPT_NAME}},
$cgi->a({ href => $ENV{SCRIPT_NAME} },
それとAタグの中にINPUTタグ入れてるみたいだけど君は正しいと思うのかい?
0762nobodyさん
2007/05/12(土) 23:27:21ID:???あるので質問させてください。
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
s/\x0D\x0A/\n/g;
tr/\x0D\x0A/\n\n/;
上記の部分の1行目は x0Dx0A を \n に変換していると理解したのですが
2行目はなぜ必要なのでしょうか?1行目が終了した時点で
x0Dx0A は \n に変換されているので必要ないのではと思ったのですが。。
0763nobodyさん
2007/05/12(土) 23:50:46ID:???いちばん頭に書いてある
s/\x0D\x0A|\x0D|\x0A/\n/g;
を高速化したのが
s/\x0D\x0A/\n/g;
tr/\x0D\x0A/\n\n/;
1行目だけだと足りないだろ。
0765nobodyさん
2007/05/13(日) 00:19:19ID:???>>764
解決しました。
764さんの述べられている通りtrは \x0D\x0A と一続きに
なったものを変換しているものと思い込んでいました。
ありがとうございました。
0766nobodyさん
2007/05/13(日) 21:00:15ID:J1kSit9o掲示板のスパム対策に、"http"って文字列が5個以上投稿に含まれてる場合に
その投稿を弾こうと思って
if($FORM{'comment'} =~ /(http){5,}/){ &error(); }
とやったんですが、どうやらちゃんとマッチできてないようです。
どこがおかしいんでしょう・・・
0767nobodyさん
2007/05/13(日) 21:10:24ID:???0768nobodyさん
2007/05/13(日) 21:13:04ID:???は "http" が5個以上連続したら、って意味だから
"httphttphttphttphttp" って文字列が含まれてないとマッチしない
@l = ($FORM{comment} =~ /http/g); if (@l >= 5) 〜
とかすればいいんでないかい
0769nobodyさん
2007/05/13(日) 21:35:09ID:???か、
scalar(@tmp = $FORM{'comment'} =~ /http/g);
じゃまいか。
0770nobodyさん
2007/05/13(日) 22:45:32ID:J1kSit9o初歩的な勘違いだったんですね・・・
ありがとうございます。
0771nobodyさん
2007/05/14(月) 03:20:34ID:ha/4Ezv5特定の文字列 「HOGE」
を、
$aaa「HOGE」$aaa「HOGE」$aaa「HOGE」$aaa.......
というように$aaaで「HOGE」を挟む形で並べたいのですが、
while(){
$fuga .= "$aaa「HOGE」";
}
$fuga =~ s/「HOGE」$//;
とやるのはおかしくないでしょうか?
何となく野暮ったい感じがするんですが、
こういった処理のセオリーみたいなものはありますか?
他にも「これの方がまだマシ」という書き方があれば是非アドバイスお願いします。
0772nobodyさん
2007/05/14(月) 03:42:42ID:???$fuga = $aaa;
while( ... ){
$fuga .= "「HOGE」$aaa";
}
あとは、0回の繰り返しも必要なら、全体をifで囲むとか。
0773771
2007/05/14(月) 03:55:40ID:???おぉ、なるほど!
先に$fugaに入れてしまえばスマートにいきますね。
こんな時間に即レス、ありがとうございました!
0774nobodyさん
2007/05/14(月) 06:53:09ID:???my @aaa = ( $aaa, $aaa, $aaa, ........) ;
$fuga = join q{「hoge」}, @aaa ;
0775nobodyさん
2007/05/14(月) 09:28:37ID:???難しく考えすぎ
0776nobodyさん
2007/05/14(月) 17:37:17ID:oZfrkKb+接続直後だと 0 になるのですが、
DB接続→INSERT後にしかAUTO_INCREMENTの値を取得できないのでしょうか?
またその場合、INSERT前に取得して利用したい場合どういう方法がありますでしょうか?
0777nobodyさん
2007/05/14(月) 18:15:30ID:???0779nobodyさん
2007/05/14(月) 18:37:28ID:oZfrkKb+普段テーブルにはレコードがありません。
でもphpMyAdminでは「次へ Autoindex」と見れるので、何か方法があると思うのですが
0780nobodyさん
2007/05/14(月) 19:45:44ID:???きれいな方法かどうかは知らないけど・・・
0781nobodyさん
2007/05/14(月) 19:55:30ID:???それはshow table statusで調べているのだと思われる。
普通のプログラムでこれから値を抜き出して使うのは
おすすめしません。
多分何か変わったなことをしようとしているからそんな
値が必要になってるんじゃないかという気がするので
そもそもそこに立ち戻って考え直したほうがいいんじゃ
ないか。
0782nobodyさん
2007/05/14(月) 20:00:29ID:oZfrkKb+phpMyAdminでは↑のSQLでテーブル情報取得してるんですね。
DBIで上記SQL発行して、Auto_incrementフィールド読み込んで処理することにします
0783nobodyさん
2007/05/14(月) 22:36:32ID:???別プロセスもINSERT前に同じ値を取得したりして整合性とれるの?
0785nobodyさん
2007/05/15(火) 14:22:47ID:???0786nobodyさん
2007/05/15(火) 14:46:32ID:???普通にlast_insert_id()を使ってればコネクション毎に管理されるので
大丈夫なわけだが。
以下mysqlのlast_insert_id()のマニュアルより:
The ID that was generated is maintained in the server on a per-connection
basis. This means that the value returned by the function to a given client
is the first AUTO_INCREMENT value generated for most recent statement
affecting an AUTO_INCREMENT column by that client. This value cannot be
affected by other clients, even if they generate AUTO_INCREMENT values of
their own. This behavior ensures that each client can retrieve its own ID
without concern for the activity of other clients, and without the need for
locks or transactions.
0787nobodyさん
2007/05/16(水) 23:40:17ID:???HTMLをcharset=UTF-8にしただけで普通に動いたのだけれど、use utf8 やら
binmodeなんたらを書かなくても良いものなの?
逆にuse utf8やらbinmode STDOUT を指定したら文字化けしたけど。
0788nobodyさん
2007/05/17(木) 00:12:41ID:???0789787
2007/05/17(木) 00:23:58ID:???書けば良いという事?
0791nobodyさん
2007/05/17(木) 10:24:33ID:???07921
2007/05/17(木) 11:35:11ID:???0793nobodyさん
2007/05/17(木) 14:27:16ID:???0794nobodyさん
2007/05/17(木) 18:46:04ID:???while (defined($_ = @log)) {
処理
}
----------------------------
B---------------------------
while (@log) {
処理
}
----------------------------
C---------------------------
foreach (@log) {
処理
}
----------------------------
foreachだと配列を最初に全部読込む
whileだと1つずつ読み込む
AとBは同じ意味
だと思って負荷のかかりそうな場所をCからBにしたら、
無限ループになっちゃうんだけど、どこが間違ってるの?
0795nobodyさん
2007/05/17(木) 18:57:19ID:???0796nobodyさん
2007/05/17(木) 19:31:20ID:???あと、すでに配列に入ってるなら置き換えは意味ないよ
0798794
2007/05/17(木) 21:10:10ID:???0799nobodyさん
2007/05/17(木) 22:21:08ID:???には、それなりに置き換える意味が無くもないんだが。。。
0800nobodyさん
2007/05/17(木) 22:36:56ID:???すごい処理($log[-1]);
pop @log;
}
B方式でも無限ループにならないようにはできるけど、なんつーか、アレだなぁ。
0801nobodyさん
2007/05/17(木) 22:50:58ID:???Aは何のために$_に入れてるんだか・・・
0802nobodyさん
2007/05/18(金) 02:50:38ID:Sqfh/ayx$hinch =~ s/(\d)/int($1*2.54 )/e;#掛け算
print $hinch;
だとおkなのに
$hinch = 170;
$hinch =~ s/(\d)/int($1/2.54 )/e; #割り算
print $hinch;
だとアウトなのはなんで?
0803nobodyさん
2007/05/18(金) 03:03:35ID:???0804nobodyさん
2007/05/18(金) 03:03:48ID:???そんなだから単純な構文ミスに気がつかない。恥ずかしすぎるぞ、質問者。
0805nobodyさん
2007/05/18(金) 03:17:06ID:???ごめんよ。|||でいけたのでOKになりました。
0806nobodyさん
2007/05/19(土) 01:05:51ID:???世の中簡単過ぎて詰まらないな
0807nobodyさん
2007/05/19(土) 02:55:16ID:???0808nobodyさん
2007/05/19(土) 07:44:53ID:???perl -le 'print q{p N$} ^ " E<H";'
これが何故 Perl になるか教えて。出典: perlop
0809nobodyさん
2007/05/19(土) 08:19:35ID:???考えればわかるよ。先頭一文字についてはこう。
ord('p')=112=0b01110000
ord(' ')= 32=0b00100000
-----------------------↓ビットごとに排他的論理和をとる
ord('P')= 80=0b01010000
他の文字についても同様。
0810nobodyさん
2007/05/19(土) 10:59:19ID:OAH9Js2+use CGI;
$obj->new CGI;
$obj->remote_host();
でリモートホストが返ってきますが、こういった類の「値を取得するメソッド」は、
$host = $obj->remote_host();
としてメインパッケージに覚えさせておくのと、必要になるたびremote_hostするののどっちがいいんでしょうか?
処理の効率やソースの美しさなどの観点で理由も併せて教えていただければうれしいです。
個人的には、remote_hostの処理量が少ないならば必要になるたび呼び出して、
処理量が多いならば何度も実行するわけにはいかないからメインパッケージに覚えさせる方がいいと思うのですがどうでしょうか。
自分でモジュールも開発していたりするのですが、初回実行時に処理をしてオブジェクトのメンバ変数にして覚えておいて、
次回からの実行時には処理をせず覚えておいたメンバ変数を返す、ということもできそうですがどうでしょう?
よろしくお願いします。
0811nobodyさん
2007/05/19(土) 11:03:09ID:???どうやってますか?
cygwin perlを使えばforkを使えますがモジュールの追加が面倒、、、
activestate perlでできないでしょうか?
0812nobodyさん
2007/05/19(土) 15:14:05ID:???forkが嫌ならthreads.pmとかどうよ
0813nobodyさん
2007/05/19(土) 15:27:37ID:???ttp://search.cpan.org/dist/Parallel-ForkManager/ForkManager.pm
threads
ttp://perldoc.jp/docs/perl/5.8.3/threads.pod
ttp://d.hatena.ne.jp/kidd-number5/20070328/1175065357
ttp://www.hyuki.com/dig/perlthread.html
ちょっと勉強してみよっか
0816nobodyさん
2007/05/20(日) 00:33:27ID:???> sub remote_host {
> return $ENV{'REMOTE_HOST'} || $ENV{'REMOTE_ADDR'}
> || 'localhost';
> }
> END_OF_FUNC
スカスカっていうか、業務内容があっさりしてるよね。
gethostbyaddr() を叩くわけでもなく。
0817nobodyさん
2007/05/20(日) 00:35:23ID:???remote_host() に関して言えばどちらもさして変わりません。
効率から言えばキャッシュしておいて参照するほうが総合的に良いでしょう。変数の為のメモリ領域を投資してメソッドコールのオーバーヘッドを回避できるからで、これはそう悪い取引ではないように思います。
ただし、>>815 が言うように remote_host() は「スカスカ」 (通常、定義済の %ENV ハッシュを参照して返すだけ) なのでその差は僅かです。
従って、あえて気にするとすれば remote_host() の「処理量」ではなく、「実行回数」ですが、どの程度差が出るのか調べてないのでわかりません。
> 自分でモジュールも開発していたりするのですが、初回実行時に処理をしてオブジェクトのメンバ変数にして覚えておいて、
> 次回からの実行時には処理をせず覚えておいたメンバ変数を返す、ということもできそうですがどうでしょう?
もうお分かりかと思いますが、その方法では少なくとも処理効率面でのメリットは出ません。もちろんコードが明瞭になる、あるいは設計上そうなっているのが自然であるといった理由でそうすることは常に可能です。
また、モジュールを書かれているとのことなので参考までに、なぜレキシカル変数を使わず、明示的に「メインパッケージ」に拘っておられるのかはお聞きしておきたいところです。
0818nobodyさん
2007/05/20(日) 12:07:45ID:LynxL8Gs標準モジュール以外ではピュアPerlのモジュールしか使えない環境下で
SQLに適したデータを扱うにはどうしたらいいでしょうか?
これまではData::DumperやStorableを使ってきたのですが、
SQLもどきが使えてなおかつ早い方法があればご教示お願いいたします _ _
0820nobodyさん
2007/05/20(日) 14:45:34ID:???0821nobodyさん
2007/05/20(日) 15:07:59ID:xkL2RLiDそこで次の方法について教えてください。
1.Googleの検索結果のHTMLファイルをローカルにダウンロードする方法
2.ダウンロードしたファイルからURLとページのタイトルを抽出する方法
よろしくお願いします。
0822nobodyさん
2007/05/20(日) 15:19:57ID:???0823nobodyさん
2007/05/20(日) 15:49:24ID:???0824nobodyさん
2007/05/20(日) 15:58:24ID:???2. RegularExpression
0825nobodyさん
2007/05/20(日) 16:13:41ID:???0827nobodyさん
2007/05/20(日) 17:32:02ID:g+N1wV/c216.98.228.0が上記範囲範囲内にあるかどうか
調べるにはどうやれば良いのでしょうか。
0828nobodyさん
2007/05/20(日) 18:25:55ID:???0829nobodyさん
2007/05/20(日) 19:14:12ID:???0831nobodyさん
2007/05/21(月) 02:51:41ID:???メモ帳に↓を丸々コピペして、拡張子を.txtから.plにしてダブルクリックすればとりあえず楽に試せる。
達人さんとかは1行なんだろうけど俺には無理ぽ。
#!/usr/local/bin/perl-w
use strict; #構文ミスを細かく指摘してくれる
my$ip="217.98.228.0";#調べたいIP
my@hani=("216.98.224.0","216.98.239.255");#最小と最大の範囲
print ipok($ip,@hani); #サブルーチンipokを呼び出して戻り値をprint
sub ipok{
my@a=@_; # $a[0]には調べたいIP、a[1]には範囲の最小、a[2]には範囲の最大が入る
my@b=split(/\./,"$a[0]"); # 『.』を『\』でエスケープするのを忘れずに。
my@c=split(/\./,"$a[1]"); # 文字列を.で分割して@cに。@cには最小(216,98,224,0)が入る。
my@d=split(/\./,"$a[2]");
if($b[0]>=$c[0] && $b[0]<=$c[0]){ #調べたいIPの最左が最小と最大の範囲内ならifがtrue
if($b[1]>=$c[1] && $b[1]<=$c[1]){ #調べたいIPの左から2つ目が最小と最大の範囲内ならifがtrue
if($b[2]>=$c[2] && $b[2]<=$c[2]){
if($b[3]>=$c[3] && $b[3]<=$c[3]){
return 5; #if文4つ全部trueなら戻り値として5を返す。(5ってのはテキトー)
}}}}
return 8; #1つでもtrueにならなければ8を返す。(もちろん他の戻り値にしてもOK)
}
while(<>){}; #コマンドライン受け付けによる無限ループ。不必要なら消すべし
exit;
0832nobodyさん
2007/05/21(月) 02:58:24ID:???試したら常に8になって範囲内でも5にならないw
失敗作スマソ 出直してくる
0833nobodyさん
2007/05/21(月) 03:16:08ID:???my@hani=("216.98.224.0","216.98.239.255");#最小と最大の範囲
print ipok($ip,@hani);
sub ipok{
my@a=@_;
my@b=split(/\./,"$a[0]");
my@c=split(/\./,"$a[1]");
my@d=split(/\./,"$a[2]");
if($b[0]>=$c[0] && $b[0]<=$d[0]){ print"あ";
if($b[1]>=$c[1] && $b[1]<=$d[1]){ print"い";
if($b[2]>=$c[2] && $b[2]<=$d[2]){ print"う";
if($b[3]>=$c[3] && $b[3]<=$d[3]){ print"え";
return 5;
}}}}
return 8;
}
↑
$c[0]〜[4]は正しくは$d[0]〜[4]。修正しますた。
でも、「あ8」とだけ表示されてしまって、あいうえ5と表示されません。
if文の中のif文は無効でつか?
0834nobodyさん
2007/05/21(月) 03:23:35ID:???連書きスマソです。
>>827 こんな感じでどうでつか?
↓
my$ip="216.98.228.0";#調べたいIP
my@hani=("216.98.224.0","216.98.239.255");#最小と最大の範囲
print ipok($ip,@hani);
sub ipok{
my@a=@_;
my@b=split(/\./,"$a[0]");
my@c=split(/\./,"$a[1]");
my@d=split(/\./,"$a[2]");
if($b[0]>=$c[0] && $b[0]<=$d[0]){
if($b[1]>=$c[1] && $b[1]<=$d[1]){
if($b[2]>=$c[2] && $b[2]<=$d[2]){
if($b[3]>=$c[3] && $b[3]<=$d[3]){
return 5; # 範囲内なら5を返す
}}}}
return 8; # 範囲外なら8を返す
}
0836nobodyさん
2007/05/21(月) 03:39:36ID:???がんがりますた
先生!
>>834の文は更に
my@a=@_;
my@b=split(/\./,"$a[0]");
my@c=split(/\./,"$a[1]");
my@d=split(/\./,"$a[2]");
の部分は
my@b=split(/\./,"$_[0]");
my@c=split(/\./,"$_[1]");
my@d=split(/\./,"$_[2]");
としたほうが配列@a[]を省いた分だけ早い気がすることに今気付きましたがどうなんでしょう!?
0837nobodyさん
2007/05/21(月) 03:51:16ID:???my $addr = '216.98.228.0';
my ($b, $m) = split(/\//, $cidr);
my $mask = 0xffffffff << (32-$m);
my $baddr = unpack('N', pack('C4', split(/\./, $b)));
my $caddr = unpack('N', pack('C4', split(/\./, $addr)));
(($baddr ^ $caddr & $mask) == 0) and print "ture";
こんなもんか。
>>834に負けてるかも知れない。
0838nobodyさん
2007/05/21(月) 03:57:41ID:???俺は>>835じゃないけど
> "$_[0]"
引用符も取っ払っちゃえ。
四重になってるifを if (長〜い条件式) { return 5 } にしてみたり、いろいろ遊ぶといいよ。
がんばれ。
>>827
以前これを使ったような記憶がある。
ttp://search.cpan.org/~mrsam/Net-CIDR-0.11/CIDR.pm
探せば案の定いろいろあるなー。
ttp://search.cpan.org/~marcel/Net-IP-Match-0.01/Match.pm
0839nobodyさん
2007/05/21(月) 04:07:14ID:???第2の先生!できますた!
↓
my$ip="216.98.228.0";#調べたいIP
my@hani=("216.98.224.0","216.98.239.255");#最小と最大の範囲
print ipok($ip,@hani);
sub ipok{
my@b=split(/\./,$_[0]);
my@c=split(/\./,$_[1]);
my@d=split(/\./,$_[2]);
if($b[0]>=$c[0] && $b[0]<=$d[0] && $b[1]>=$c[1] && $b[1]<=$d[1] && $b[2]>=$c[2] && $b[2]<=$d[2] &&$b[3]>=$c[3] && $b[3]<=$d[3]){
return 5; #範囲内なら5を返す
}
return 8; #範囲外なら8を返す
}
0840nobodyさん
2007/05/21(月) 04:24:55ID:???ここまで短くできるとは思ってなかった罠。
↓
my$ip="216.98.228.0";#調べたいIP
my@hani=("216.98.224.0","216.98.239.255");#最小と最大の範囲
print ipok($ip,@hani);
sub ipok{
my@a=map {split(/\./,$_)}@_;
if($a[0]>=$a[4] && $a[0]<=$a[8] && $a[1]>=$a[5] && $a[1]<=$a[9] && $a[2]>=$a[6] && $a[2]<=$a[10] && $a[3]>=$a[7] && $a[3]<=$a[11]){
return 5
}
return 8
}
0841nobodyさん
2007/05/21(月) 04:29:16ID:???my @hani=("216.98.224.1","216.98.239.255");#最小と最大の範囲
のときは8でいいの?
0842nobodyさん
2007/05/21(月) 04:33:53ID:???一番右のが範囲外でも、それより右が範囲内で且つイコールじゃない場合は5を返さないといけないのかな?
それなら書き直しかも・・・
0843838
2007/05/21(月) 04:34:09ID:???0844nobodyさん
2007/05/21(月) 04:34:39ID:???○ それより左
とりあえずもうちょっとがんがってみまつ
0845838
2007/05/21(月) 04:40:44ID:???元のコードでも return 8 (5であるべき)だね。酔っ払ってるときに書くのは控えよう。
0846nobodyさん
2007/05/21(月) 04:50:58ID:???> 216.98.224.1
みたいに1で始まることは無いから、考慮しなくてもいいんじゃないか。
別の用途も考えているのなら、話は別だけど。
0847nobodyさん
2007/05/21(月) 05:11:04ID:???my$ip="216.98.228.1";#調べたいIP
my@hani=("216.98.224.30","216.98.239.255");#最小と最大の範囲
print ipok($ip,@hani);
sub ipok{
my@b=split(/\./,$_[0]);
my@c=split(/\./,$_[1]); #最小
my@d=split(/\./,$_[2]); #最大
if($b[0]>=$c[0] && $b[0]<=$d[0]){
if( ($b[1]>=$c[1] && $b[1]<=$d[1]) || $b[0]<$d[0] ) {
#↑左から2番目が範囲内である場合、もしくは、範囲外でも左端が最大未満の場合true。
if( ($b[2]>=$c[2] && $b[2]<=$d[2]) || $b[1]<$d[1]) ) {
#↑左から3番目が範囲内である場合、もしくは、左から2番目が最大未満の場合true。
if( ($b[3]>=$c[3] && $b[3]<=$d[3]) || $b[2]<$d[2]) ) {
return 5;
}}}}
return 8;
}
↑
仮に範囲が、"216.98.224.30"〜"216.98.239.255"で、
216.98.228.10 とかでも、一番右が範囲外でもその左の228が範囲内で最大(239)未満(つまり238以下)なのでtrueで5を返します。
またこれを今から、更に条件式やmapで短くしてみまつ。
0848nobodyさん
2007/05/21(月) 05:33:12ID:???#!/usr/local/bin/perl
use strict; #構文ミスを指摘してくれる
my$ip="216.98.228.1";#調べたいIP
my@hani=("216.98.224.0","216.98.239.255");#最小と最大の範囲
print ipok($ip,@hani);
sub ipok{
my@a=map {split(/\./,$_)}@_;
if(($a[0]>=$a[4] && $a[0]<=$a[8]) && (($a[1]>=$a[5]&&$a[1]<=$a[9])||($a[0]>$a[4]&&$a[0]<$a[8]))
&& (($a[2]>=$a[6]&&$a[2]<=$a[10])||(($a[1]>$a[5]&&$a[1]<$a[9]))) && (($a[3]>=$a[7]&&$a[3]<=$a[11])||($a[2]>$a[6]&&$a[2]<$a[10]))){
return "OK"#範囲内ならOK
}
return "NG"#範囲外ならNG
}
while(<>){};#不必要なら省略して下さい
exit;
0849nobodyさん
2007/05/21(月) 05:36:13ID:???0851nobodyさん
2007/05/21(月) 05:53:07ID:???my$ip="216.98.224.80";#調べたいIP
my@hani=("216.98.224.30","216.98.239.60");#最小と最大の範囲
これでも、OKが出ないといけないのかな?
ということはやっぱ書き直し。
でも
my$ip="216.98.224.20";#調べたいIP
my@hani=("216.98.224.30","216.98.239.60");#最小と最大の範囲
はNGが出ないとダメ。
また起きてからにしてマジ眠ります。
0852nobodyさん
2007/05/21(月) 07:41:50ID:???IPの右端部分のIPだけについて説明します。
IPが、範囲の最小値と最大値の間なら、もちろんtrue。
IPが、範囲の最大値を越えても、その1つ左部分のIPが最小値以上&最大値未満ならtrue。
IPが、範囲の最小値未満でも、その1つ左部分のIPが最大値以下&最小値を越えるならtrue。
#!/usr/local/bin/perl
use strict; #構文ミスを指摘してくれる
my$ip="216.98.220.80";#調べたいIP
my@hani=("216.98.220.30","216.98.239.60");#最小と最大の範囲
print ipok($ip,@hani);
sub ipok{
my@a=map {split(/\./,$_)}@_;
if(($a[0]>=$a[4] && $a[0]<=$a[8]) &&
(($a[1]>=$a[5]&&$a[1]<=$a[9])||($a[1]>$a[9]&&$a[0]>=$a[4]&&$a[0]<$a[8])||($a[1]<$a[5]&&$a[0]>$a[4]&&$a[0]<=$a[8])) &&
(($a[2]>=$a[6]&&$a[2]<=$a[10])||($a[2]>$a[10]&&$a[1]>=$a[5]&&$a[1]<$a[9])||($a[2]<$a[6]&&$a[1]>$a[5]&&$a[1]<=$a[9])) &&
(($a[3]>=$a[7]&&$a[3]<=$a[11])||($a[3]>$a[11]&&$a[2]>=$a[6]&&$a[2]<$a[10])||($a[3]<$a[7]&&$a[2]>$a[6]&&$a[2]<=$a[10]))){
return "OK"#範囲内ならOK
}
return "NG"#範囲外ならNG
}
while(<>){};#不必要なら省略して下さい
exit;
0853nobodyさん
2007/05/21(月) 08:19:03ID:???IPが256・256・256・256ってことで、全部合わせて計算して比較してみたら簡単に・・・。
一番左が256の3乗、左から2番目が256の2乗、左から3番目から256倍、右端は256の0乗(=1)をかければいいんじゃない?
とか思って↓のを作ってやったら簡単にできますた。
#!/usr/local/bin/perl
use strict; #構文ミスを指摘してくれる
my$ip="216.98.239.80";#調べたいIP
my@hani=("216.98.220.30","216.98.239.60");#最小と最大の範囲
print ipok($ip,@hani);
sub ipok{
my@a=map {split(/\./,$_)}@_;#引数を.ごとに区切って配列に。
my$a=$a[0]*256**3+$a[1]*256**2+$a[2]*256+$a[3];#調べたいIPをひとくくりの10進数に。
my$b=$a[4]*256**3+$a[5]*256**2+$a[6]*256+$a[7];# **2 は2乗の意味。
my$c=$a[8]*256**3+$a[9]*256**2+$a[10]*256+$a[11];
if($a>=$b && $a<=$c){return"ok"}
return"NG"
}
while(<>){};#不必要なら省略して下さい
exit;
>>852とどっちがいいでつか?
0855nobodyさん
2007/05/21(月) 08:25:10ID:???0856nobodyさん
2007/05/21(月) 08:29:27ID:???便乗して練習してたんだけど、さすがにレスしすぎだな俺orz
0857nobodyさん
2007/05/21(月) 09:18:44ID:???0858nobodyさん
2007/05/21(月) 11:26:17ID:???0859nobodyさん
2007/05/21(月) 12:42:09ID:???まあ、答えるまでもないって意見があるだろうけどさ。
--- hash 参照型 ---
sub hoge { pack q{A3A2A3}, unpack q{A3x1A2x1A3}, $_[0] ; }
my %addr = map{ $_ , 1 }
( hoge q{216.98.224.0} ) .. ( hoge q{216.98.239.255} ) ;
print qq{true\n} if defined $addr{ hoge q{216.98.228.0} } ;
0861nobodyさん
2007/05/21(月) 14:52:30ID:ZiElqTGz2、以下のようなプログラムを足しました。
# REMOTE_ADDRの値を代入
$ip = $ENV{'REMOTE_ADDR'};
open(IN, "ip.txt");
while ($ip = <IN>) {
if ( =~ /$ip/) {
exit;
}
}
close(IN);
open(OUT,"> ./$value/ip.txt");
print OUT $ip;
close(OUT);
3、レンタルサーバーなのでエラーコード500CGIが正常に作動していません
とでました><
どこに問題があるか教えてください。
0862nobodyさん
2007/05/21(月) 15:11:25ID:???その「500」は、HTTPステータスコードと呼ばれるもので、
エラーコードではありません。
まず、あなたのPCにPerlをインストールするところから始めましょう。
0863nobodyさん
2007/05/21(月) 15:12:14ID:???構文としてはif( =~ が間違ってると思われ。
まぁ、前回IPでの比較より前回投稿内容との比較のほうがよいのかなーと。
(単純に連続投稿を拒否りたいなら話がそれたのはスマン)
つかREMOTE_ADDRを$ipに入れてるのにwhileで$ipに読み込ましたらぐっちゃになるよ。
0864nobodyさん
2007/05/21(月) 15:13:09ID:???そのサブルーチンhogeは、"216.98.224.0"から"216.98.239.255"を全て文字に変換してるんでつか?
で、mapのおかげで文字と1が対として%addrに入っていくと。
で、最後のif文で"216.98.228.0"をサブルーチンhogeで文字にして、$hddr{文字}って形にしてそれが存在すればtrueを返す
という感じの処理でOKでつか?
ハッシュもq{}なんて書き方もA3x1とかの意味とかもよくわからないけど。
メモリーとかの効率的には良いのかな?
文は短いけどhogeで文字に変換する量が多い気がしまつ
0865861
2007/05/21(月) 15:30:13ID:ZiElqTGzをマッチングで調べるフリーのソースをどこかでパクって着ます。
0867nobodyさん
2007/05/21(月) 17:01:24ID:???hash 参照型の「オーソドックスな解」のつもりだったんだけど
もうちょっと丁寧に書けば良かったか orz...
==== source ====
sub hoge { join '', ( split /\./, $_[0] )[0,1,2] ; }
# sub hoge { $_[0] =~ /(\d+)\./g ; }
my $one = hoge '216.98.224.0' ; # 数値化 21698224
my $two = hoge '216.98.239.255' ; # 数値化 21698239
my $query = hoge '216.98.228.0' ; # 数値化 21698228
# 普通だったらここで if 文で終了
# print "true\n" if $one <= $query and $two >= $query ;
# 範囲演算子による無名配列
# から map{ } にてハッシュテーブル作成
my %addr = map{ $_ , 1 } $one .. $two ;
print "true\n" if defined $addr{ $query } ;
==== ここまで ====
- hoge は pack, unpack を使わずに記載しなおし(スマン)
単なる . 抜きなので数値化とはおこがましいが。
- 数値化は 3 回。範囲演算子での数値生成は確かに多いかもしらんが、
hoge の活躍頻度は、元ソースでも 3 回だ。
- テーブル分のメモリは当然喰らう。table 作らずに大小確認した方がメモリは喰わん。
- q{} means '' / qq{} means ""
- もしも、216.98.239.80 とかで .80 まで調べたいってんなら、今回の
hash 参照型ではスマートでは無くなってしまうので
sub hoge { join '', split /\./, $_[0], 3 ; }
などという方法にて数値化した上で if 文にて判断。判断自体は上と変らず。
print 文を適当に挿入して確認してください。
pack, unpack に関しては perldoc -f pack して確認を。
0868nobodyさん
2007/05/21(月) 17:07:07ID:???俺は初心者で、そんなオープンとかクローズとか作ったことは無いが、
俺なりに修正してみる。
と、その前に、ip.txtには新しいIP(というか前回のIP)は一番下にあるのかな?
一番下の行に前回のIPがあるのなら、一行ずつ配列に入れてpopで最後の配列だけ取り出して比較したらどうかな?
↓
my$ip = $ENV{'REMOTE_ADDR'}; #書き込みしようとしてるIP
ipipip($ip); #ipipipルーチンに$ipを引数として渡し実行
#サブルーチンipipipの宣言
sub ipipip{
my@ip=@_; #受け取った$ipをルーチン内のmy$ipに格納
open(IN, "<ip.txt"); #読み込み専用でファイルオープン
my@a;
while (<IN>) {
@a=@_; #ファイルを一行ずつ配列@aにコピー
}
my$a=pop @a; #最後の配列(一番下のIP)を$aに格納
chomp($a); #$aに改行文字や空白文字があれば削除する
if($ip[0] eq $a){
close(IN); #もし$ipと$aが同じ文字列なら、ファイルを閉じて全処理を停止(exit)する。
exit;
}
close(IN); #もし$ipと$aが違うならif文は実行されず、exitされないので、ファイルを閉じて処理を続行させる。
}
0869nobodyさん
2007/05/21(月) 17:27:30ID:???これ何か利点あるの?
0870nobodyさん
2007/05/21(月) 17:34:25ID:???while (<IN>) {
@a=@_; #ファイルを一行ずつ配列@aにコピー
}
my$a=pop @a; #最後の配列(一番下のIP)を$aに格納
この辺は
@a = <IN>;
$b=$a[$#a];
でいいような。
0871nobodyさん
2007/05/21(月) 17:34:45ID:???方法が書いてあるページのURLでもいいです。エロい人教えてください。
0872nobodyさん
2007/05/21(月) 17:36:17ID:???1. q{ } なんかでスペースを入れる時目立つ
2. 同様に ', " のプリント時にも便利。エスケープを考慮に入れんでもよくなる
3. ワンライナー時に便利
4. 趣味の問題
0873nobodyさん
2007/05/21(月) 17:47:36ID:???>>870
あ、ホントだ。
しかも>>869だとちゃんと処理されてなかった。
修正版
↓
my$ip = "aaa"; #書き込みしようとしてるIP
ipipip($ip); #ipipipルーチンに$ipを引数として渡し実行
#サブルーチンipipipの宣言
sub ipipip{
my@ip=@_; #受け取った$ipをルーチン内のmy$ipに格納
open(IN, "<ip.txt"); #読み込み専用でファイルオープン
my@a;
@a = <IN>; #ファイルを一行ずつ配列@aに。
my$a=$a[$#a]; #配列の最後(ファイルの一番下のIP)を$aに格納
chomp($a); #$aに改行文字や空白文字があれば削除する
if($ip[0] eq $a){
close(IN); #もし$ipと$aが同じ文字列なら、ファイルを閉じて全処理を停止(exit)する。
exit;
}
close(IN); #もし$ipと$aが違うならif文は実行されず、exitされないので、ファイルを閉じて処理を続行させる。
}
0874nobodyさん
2007/05/21(月) 17:53:58ID:???プログラムの最初の行、正しくは
my$ip = $ENV{'REMOTE_ADDR'}; #書き込みしようとしてるIP
が正解。
コメントがうざいのでコメントを全部取ってサブルーチンは短くしまつ。
my$ip = $ENV{'REMOTE_ADDR'};
ipipip($ip);
#サブルーチンipipipの宣言
sub ipipip{
my@ip=@_; open(IN, "<ip.txt");
my@a; @a=<IN>;
my$a=$a[$#a]; chomp($a);
if($ip[0] eq $a){close(IN);exit}
close(IN)}
0876nobodyさん
2007/05/21(月) 18:26:31ID:???ip.txtの書式を1行目が最新になるようにした方が良いのでは。
そしたらwhileで1行目だけ取れば済むし。
ログの長さにもよるけど、最新のIP抜くためだけに
@a=<IN>;
とか、メモリの無駄遣いな気がして気持ち悪いんだけど、
そういう話は筋違いかな。
0877nobodyさん
2007/05/21(月) 18:38:08ID:???俺もそう思う。
だけど>>861は他人のプログラム借りて掲示板作ってるっぽいように見えるから、
ip.txtの最後の行に最新IP追加するようなプログラムをそのまま使ってそうだと思って。
ip.txtの1行目に最新IP追加するようなプログラムを使ってるなら>>874をちょこっと修正して
↓
my$ip = $ENV{'REMOTE_ADDR'};
ipipip($ip);
#サブルーチンipipipの宣言
sub ipipip{
my@ip=@_; open(IN, "<ip.txt");
my$a=<IN>; #一行目だけ$aに。
chomp($a);
if($ip[0] eq $a){close(IN);exit}
close(IN)}
0878nobodyさん
2007/05/21(月) 19:04:20ID:???↓
#サブルーチンipipipの実行
ipipip();
#サブルーチンipipipの宣言。ファイルip.txtの1行目と投稿者のIPが同じ値ならexitで全処理を終了。(連続投稿制限)
sub ipipip{
my$ip = $ENV{'REMOTE_ADDR'};
open(IN, "<ip.txt");
my$a=<IN>;
chomp($a);
if($ip eq $a){close(IN);exit}
close(IN)}
0879nobodyさん
2007/05/21(月) 19:06:33ID:???テーブル作るんなら大小判定する関数作って、計算するつどキャッシュを
作成する方が効率的だと思うがなあ・・・
もし、オーソドックスという点にこだわるなら・・・
0880nobodyさん
2007/05/21(月) 19:30:47ID:???俺の読解力が足りんのかもしらんが、
そもそもの目的が「大小判定の確定」であるわけで、
"大小判定する関数作って"ってその時点で終了じゃん。
今回は 3つのIP addrの大小関係の確定だよ?
汎用化したいなら、"計算する都度キャッシュ"ってのが
登場するかもしらんが今回の何処にその必要があるの?
0881nobodyさん
2007/05/21(月) 20:05:29ID:???# print "true\n" if $one <= $query and $two >= $query ;
と、これ
my %addr = map{ $_ , 1 } $one .. $two ;
print "true\n" if defined $addr{ $query } ;
明らかに後者のほうがコストが高いよね。
そこまでしてハッシュテーブルを作る意図は?
0882nobodyさん
2007/05/21(月) 20:06:35ID:???・1.0.0.0/8になると、125万個のハッシュを作る。
・>>867自身が書いてるが、/24を超える範囲が対応できない。
・0.1.23.0/24(0.1.23.0-0.1.23.255)で、0.12.3.0がtrueになる。
# 余談だけど、このとき、8進数で扱われてる。
0883nobodyさん
2007/05/21(月) 20:14:10ID:???自分で書くなら>>829がどう見ても一番オーソドックスだろ。
ネットマスクも知らない輩が紛れ込んでるんですか><
練習なら別のスレでやった方がいいんじゃね。
回答としては>>857。
0884nobodyさん
2007/05/21(月) 20:20:24ID:ESAJpJh1CGIプログラミング第2版のサンプルコードで
CGI.pmによるファイルのアップロードを試みてますが
my $q = new CGI; 直後に生成される一時ファイル
/var/tmp/CGItemp58428 がどうしても空ファイルになります
CGI.pmのどこかを修正したら改善するでしょうか?
0885nobodyさん
2007/05/21(月) 20:48:55ID:???普通時間も考慮してあげないと人気ないサイトだと
いつまでたっても書き込みできないと思うんだ。
#ip.txtはあらかじめ作っとくこと
#!/usr/bin/perl
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use IO::File::flock;
my $lock = ip_check($ENV{REMOTE_ADDR},15 * 60) or die("15分以内の連続投稿");
#書き込み処理
sub ip_check {
my($file,$now) = ('ip.txt',time);
my($IP,$SEC) = @_;
my $fh = new IO::File::flock($file,'+<') or die("$file:$!");
my($ip,$time) = split /,/,scalar <$fh>,2;
return if $IP eq $ip && $now - $time <= $SEC;
$fh->seek(0,0);
printf $fh "%s,%s",$IP,$now;
return $fh;
}
1;
0886nobodyさん
2007/05/21(月) 21:13:22ID:???おっちゃんが使い方も教えてあげるからNet::IPモジュール使いなよ。
#!/usr/bin/perl
#Net::IP = http://search.cpan.org/dist/Net-IP
use strict;
use warnings;
use Net::IP;
print "OK\n" if ip_check('10.0.0.0/8','10.0.0.3');
sub ip_check {
my $IP_A = ref $_[0] ? $_[0] : (Net::IP->new($_[0]) or die(Net::IP::Error()) );
my $IP_B = ref $_[1] ? $_[1] : (Net::IP->new($_[1]) or die(Net::IP::Error()) );
return $IP_A->overlaps($IP_B) == $IP_B_IN_A_OVERLAP;
}
1;
0890861
2007/05/21(月) 23:57:03ID:ZiElqTGz一番最初のご意見を参考に修正してみて戻ってきたらこんなに沢山の書き込みが^^
書き込んでくれたすべてのソースを勉強して読んで見ようとおもいます(今は知ら
ないコマンドとかあり)とりあえず一番単純に直して動かしてみました。バグも無
くうまくいきました、今後改良していきたいとおもいます。以下コード
# REMOTE_ADDRの値を代入
$ip = $ENV{'REMOTE_ADDR'};
open(IN, "ipBuf.txt");
while ($ipBuf = <IN>) {
if ($ipBuf =~ /$ip/) {
ここにHTMLを吐くコマンドを追加しました。長いので省略
exit;
}
}
close(IN);
open(OUT,"> ./$value/ipBuf.txt");
print OUT $ip;
close(OUT);
0892nobodyさん
2007/05/22(火) 01:46:59ID:???0893nobodyさん
2007/05/22(火) 03:30:33ID:???IO::File::flockもNet::IPも標準のモジュールじゃないけど
(たしか)pure perlなんで使いやすいと思うよ
適切なディレクトリほってファイルあっぷするだけで使える。
んで>>885も>>886もモジュールがすごいだけでコード自体は大して難しい事してない
>>890
これから勉強するなら
use strict;
use warnings;
はいれといたほうがいいよ。
あと、ほんとはテスト用の環境用意するべきだけど
せめて
use CGI::Carp qw(fatalsToBrowser);
いれとくと、エラーの原因わかりやすくなるので
おすすめ
>>892
sudoへのアドバイス?
sudoの設定できるくらいだし専用サーバなんじゃ?
しっかりIP制限とか認証かけといて
gracefulのみならそんなに危険でもないんじゃないかな(楽観主義)
0894nobodyさん
2007/05/22(火) 07:30:54ID:???CGIはnobodyで書ける決められたところにファイルを作る
cronか何かで定期的にそのファイルができてないかチェック、
できていたらapache再起動
とすると安全かもね。
0895nobodyさん
2007/05/22(火) 11:36:17ID:???なぜそれで安全になるのか理解できないというか
待ち時間が増えて不便なだけかと思うのですがどうでしょうか?
より安全に行うなら、suexec使うとかメール使うとか
UID変更できる方法にするべきだと思うんです。
0896nobodyさん
2007/05/22(火) 11:48:38ID:???甘くて権限昇格したままいろいろやられるというのは防げるだろ。
もちろんcronの方はapacheを再起動できる権限をもったユーザで
はじめから動かすのが前提。ここでsudoとか使っちゃ意味なし。
UID変更がからむとsudoにしろsuexecにしろメールにしろ相当注意
して作らないと予期しない穴ができちゃうことがあるから、
はじめからやらないのが安全なのです。
あとは便利さと安全のトレードオフになるのでポリシー次第。
0898nobodyさん
2007/05/22(火) 13:47:53ID:???とりあえずsudoは危ないプログラムなんですね。
ポリシーというか考え方の違いだけみたいなので気にしなくてよさそうです。
わざわざ便乗質問に答えていただいてありがとうございました。
0899nobodyさん
2007/05/22(火) 21:26:32ID:7d28ZEnp起動が多少遅くなるので
別な方法がないか教えてもらえませんか
使用用途としては
下記のようなものです
単にifで分けると モジュール部もすべて読み込むようなので
両方ともないとエラーになりました
evalで囲めばそれっぽくうごきますが
しっくりきません。
#ifdef HOGEHOGE
use HOGEHOGE;
〜〜〜
#else
use HOGEHOGE2;
〜〜〜
#endif
0900799
2007/05/22(火) 21:47:05ID:???0901nobodyさん
2007/05/22(火) 22:17:27ID:???0902チラシの裏
2007/05/23(水) 12:08:09ID:???if(条件){真}else{嘘}と似てますが式の右辺や左辺に使える演算子です。
refは参照やオブジェクトの場合に値を返します。(文字列や数字は空)
例)
print ref 1; #普通の文字や数字は参照じゃないので空文字が返ってきます。
print ref []; #ARRAY
print ref {}; #HASH
print ref \1; #SCALAR
print ref bless {} => 'Test'; #無名ハッシュをTestパッケージと結びつけてるのでTest
この場合、暗黙的にNet::IPオブジェクトを期待しています。これは、1:Nで評価するときに、10.0.0.0/8のオブジェクトを何度も作り直すのは効率が悪いので
my $IP_A = new Net::IP('10.0.0.0/8');
for( qw/10.0.0.1 192.168.0.1 172.16.0.0/ ){return 'OK' if ip_check($IP_A,$_)}
といった感じで利用するのを想定してあります。
0903チラシの裏
2007/05/23(水) 12:09:06ID:???Net::IP->new($_[0])はnew Net::IP($_[0])ともかけます。どっちでもいいです。Net::IPのオブジェクトを作成します。
文字列が異常(Net::IPが期待していない文字列)だった場合には嘘が返ってくるのでorの後ろのdie(Net::IP::Error())が評価されます。
Net::IP::Error()はNet::IP中でエラーが発生した場合にエラーの理由を返す関数です。dieにエラーの理由を渡してます。
以上から、$_[0]がNet::IPオブジェクトならそのままそうでなければオブジェクトを生成(できなければ異常終了)して$IP_Aに代入しろという処理をしています。
次行は$_[1]に対して同様の処理をして$IP_Bに代入しています。(または異常終了)
最後のreturn $IP_A->overlaps($IP_B) == $IP_B_IN_A_OVERLAP; は
$IP_A(Net::IPのオブジェクト)のoverlapsというメソッド(関数みたいなものです)を
$IP_Bを引数にして呼び出して返り値と$IP_B_IN_A_OVERLAP($IP_BはAの一部だよ!)を
比較した結果をip_check関数の返り値とします。
overlapメソッドは$IP_B_IN_A_OVERLAP以外に
$IP_PARTIAL_OVERLAP、$IP_A_IN_B_OVERLAP、$IP_NO_OVERLAP、$IP_IDENTICAL 等が
返ってくる可能性がありますがそろそろマニュアル読んどけ・・・となります。
0904nobodyさん
2007/05/23(水) 14:41:44ID:rLN6zRz32)元はそんな機構のないCGIに、そんな機構のあるCGIから取り出してつけてみた
3)テキストエリアの物は認識するのに、テキストボックスの物は認識しない
誰かボスケテ
フォームは取り出しもとのCGIと統一したから動くはずなのに
誤爆はするわ認識はしないわでお手上げ。
改造したいスクリプト:Jcode.pl使用
に、以下を追加。
$s=$FORM{'title'}.$FORM{'name'}.$form{'coment'}.$form{'memo'};
if($s =~ /\x8E/){
&Html_Error("半角カタカナが含まれています");
}
テキストエリアであるコメントとメモは認識するが、タイトルと名前は
認識されない。エラーメッセに$sつけたらタイトルと名前への入力内容が
入ってない。なんで??
&Html_Error("タイトルが記入されていません") if($form{'title'} eq "");
こっちは認識してるのよ?$form{'title'}
0905nobodyさん
2007/05/23(水) 14:54:40ID:???エスパーじゃないのであしからず。
0906nobodyさん
2007/05/23(水) 15:06:06ID:hQrYM6c4あるファイル(数万行の数字データ)の上から1行ずつ順番に読み込んで
最終行になるとまた1行目に戻って・・・という作業をしたいのです
途中でプログラムを閉じて再開したときも次の行から開始が可能であれば
もう言うことナシですが,残念ながら自分では何とも出来ず
丸2日間ネット上で調べに調べ
srand();
open(FILE, "data.txt");
rand($.) < 1 and $line = $_ while <FILE>;
close(FILE);
$line =~ s/\n//g;
とランダムで1行読み込む仕様で妥協するのが限界でした
もし上記作業がperlで可能でしたら申し訳ないですが
教えていただけないでしょうか
可能な方いらっしゃいましたら どうかお願いします。
0907nobodyさん
2007/05/23(水) 15:16:05ID:???誘導されて移動したのに「いつ終わるんだそれは」からやり直しですか。
で、向こうと同時進行?
Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/753-767
0908nobodyさん
2007/05/23(水) 15:17:20ID:???というか、どの程度の理解の下で実行しようとしているんだろうか。
そっちの方が怖い。
0909nobodyさん
2007/05/23(水) 15:22:20ID:???まさか鯖で扱うのか?
0910nobodyさん
2007/05/23(水) 15:23:41ID:???sub savepos{
open(SAVEFH, ">position.txt");
print SAVEFH $readpos;
close<SAVEFH>;
}
適当だがw
0911905
2007/05/23(水) 15:26:05ID:???「いつ終わるんだそれは」からは省略しました
申し訳ないです
「Perlについての質問箱 30箱目」は問いにだけ回答しておきました
906のような方法で得た「$line」を
print <<"_HTML_";
Content-type: text/html
<html><head>
<meta http-equiv="refresh" content="$base; url=aaa.cgi">
のような感じで5秒おきにIEでdata.txtの上から1行ずつ
順番に表示していくのが目的です
自分ではなんとかなるかな・・・と甘く考えてたんですがもし
私の予想に反してかなり大変なものになるのでしたら諦めます
正直 なんとかしたいのはやまやまですが 無茶を言うつもりじゃないですので
その辺りはご理解ください・・・
0912チラシの裏
2007/05/23(水) 15:28:02ID:???って感じでできないかな?
0913nobodyさん
2007/05/23(水) 15:28:40ID:rZP+yFAnテキストエリア分しかアンエスケープしてないのでは?w
ちなみにjcode.plにはh2zという半角->全角変換が付いています。
0914nobodyさん
2007/05/23(水) 15:29:05ID:???回答を無視しやがる
俺はもう答えないわ
0916nobodyさん
2007/05/23(水) 15:32:52ID:???なんて言い回しを使うやつにろくなのはいない
0917nobodyさん
2007/05/23(水) 15:36:05ID:???0918nobodyさん
2007/05/23(水) 15:38:07ID:???>5秒おきにIEでdata.txtの上から1行ずつ
>順番に表示していくのが目的です
これを最初に書けよな・・・。
JavaScriptにしとけ。
http://pc11.2ch.net/test/read.cgi/hp/1178526934/
0919906
2007/05/23(水) 15:38:28ID:???簡単にできると甘く考えてました
まさかそんな大変似なこととは知らず申し訳なかったです
912 さんのヒントをもとに検索しながらもうすこし頑張ってみます
それでダメなら諦めます
0920nobodyさん
2007/05/23(水) 15:45:00ID:???仕様を聞いた限りでは添字をファイルから読み込んで、++して
更新しながら自分(aaa.cgi)を呼び出して行くだけのような気がする。
0921nobodyさん
2007/05/23(水) 15:47:01ID:???#!/usr/bin/perl
use strict;
use warnings;
use IO::File::flock;
print get_line('data.txt');
sub get_line {
my $file = shift;
my $cnt = new IO::File::flock("$file.cnt",'+<') or die("$file.cnt:$!");
my $fh = new IO::File($file,'<') or die("$file:$!");
chomp( my $pos = <$cnt> || 0 );
$cnt->seek(0,0);
$fh->seek($pos,0);
$fh->seek(0,0) if eof($fh);
my $r = <$fh>;
print $cnt $fh->tell."\n";
return $r;
}
1;
0922nobodyさん
2007/05/23(水) 16:02:06ID:???というような英字一文字のみの配列があり
その要素を置換する場合、どうするのが一番スマートでしょうか?
(配列に入れる前に置換しておくことは都合上できません。)
0923nobodyさん
2007/05/23(水) 16:05:45ID:???ファイル入出力の仕組みとかぜんぜんわかってないだろ。
0924906
2007/05/23(水) 16:06:48ID:???うまく伝わって安心しました
まさにそのとおりです
結構単純な作業なので なんとかなるか・・・と安直に考えてました
>>921
忙しいとこありがとうございます!
今 使わせていただきましたが 私の使い方(コピペ位置?)が悪いのでエラーが出ています
しかしこれだけのものをいただけるとなんとか出来そうな気がしてきました
それにしてもまさかこれほど膨大なものになるとは思っても見ませんでした・・・
本当にありがとうございます
0925nobodyさん
2007/05/23(水) 16:07:28ID:???my @hoge = ('c','r','f','a','e','f',...);
my %table = ('置換前文字列' => '置換後文字列',...);
@hoge = map { exists $table{$_} ? $table{$_} : $_ } @hoge;
>配列に入れる前に置換しておくことは都合上できません。
どういう都合か興味があるので教えてもらえませんか?
0926nobodyさん
2007/05/23(水) 16:08:13ID:???0928922
2007/05/23(水) 16:27:02ID:???なるほどハッシュを使えばうまくいきますね!
ありがとうございます。
事前に置換しておけない理由は、配列内の要素はそれ自身も別の処理で利用していて、
置換後の変数が確定するのがその処理よりも後になることがあったからです。
助かりました。ありがとうございました!
>>926
レスありがとうございます。
mapで対応できそうなので、そちらを利用したいと思います。
>>927
言葉足らずですみませんでした。
今更遅いですが、英数一文字に対して一つの「特定の文字列が代入されている変数」に置換したいと考えていました。
0929nobodyさん
2007/05/23(水) 16:33:07ID:???trの方がいいよ
the code took: 3 wallclock secs ( 3.04 usr + 0.11 sys = 3.15 CPU)
the code took: 1 wallclock secs ( 1.00 usr + 0.06 sys = 1.06 CPU)
※100万件処理時
0930nobodyさん
2007/05/23(水) 16:40:39ID:???$r='R'; grep s/r/$r/o, @hoge;
the code took: 1 wallclock secs ( 1.34 usr + 0.07 sys = 1.41 CPU)
$r='R'; grep s/r/$r/, @hoge;
the code took: 2 wallclock secs ( 1.37 usr + 0.07 sys = 1.44 CPU)
※100万件処理時
0931nobodyさん
2007/05/23(水) 16:47:14ID:???0932nobodyさん
2007/05/23(水) 16:55:23ID:???だけど、変換後の配列へのアクセスは十分多いんだよねぇ?
少ないなら、必要になるたびにhashにアクセスすれば十分。
そうなるとそもそも「置換」である必要がない。
単に、『1文字の英数字をキーとして、対応する変数を返す』ための処理に何が良いか?
という問題に帰着することがわかるから、hashに対応表を構築するという解は自然。
問題設定のやり方を考えた方がいい。
0933nobodyさん
2007/05/23(水) 16:57:55ID:???平均で0.02秒程度遅くなりますけどね。
後学のために今5件置換まで試したけど
7件越した辺りでテーブルに追い付かれそう。
0934nobodyさん
2007/05/23(水) 17:04:23ID:???英数字は大文字小文字合わせて 10+26+26 = 62あるから、
半分ぐらいしか元にないとしても30項目ぐらいのtableをlookupしたほうがいいでしょ、たぶん。
tr中で変数展開はevalしないと無理だし。
元ネタで英数字になっているkeyが、数値だったら配列によるtable lookupに書き換えられて、
もっと速くなったりしないのかな。perlの添え字演算遅いからhashと大差ないかも。。
0935nobodyさん
2007/05/23(水) 17:10:35ID:???ちなみにテーブルを作る時間は抜いてあります。
1 use Benchmark;
2 $t0 = new Benchmark;
3
4 @hoge = ('c','r','f','a','r','f');
5 for(my $i=0; $i<=1000000; $i++) {
6 push(@hoge,"r");
7 }
8
9 my %table = ('a'=>'A', 'b'=>'B', 'c'=>'C', 'd'=>'D', 'e'=>'E');
10 @hoge = map { exists $table{$_} ? $table{$_} : $_ } @hoge;
11
12 $t1 = new Benchmark;
13 $td = timediff($t1, $t0);
14 print "the code took:",timestr($td),"\n";
こんな感じ。
0936935
2007/05/23(水) 17:18:41ID:???sでtrみたいな変換(aをA、bをBみたいな)は出来ないのかなぁ。。
0937nobodyさん
2007/05/23(水) 17:19:55ID:???> 10 @hoge = map { exists $table{$_} ? $table{$_} : $_ } @hoge;
この処理で、$table{$_}=$_ な状態を予め用意しておけば、条件判断が省けて、なお速くないですか?
keyは最大でも62通りに限定されているわけですし。
5-7行目の処理は push @hoge, ('r')x1000000; でいいんのでは?
0938nobodyさん
2007/05/23(水) 17:28:38ID:???%table = (
a=> $some_string_a,
b=> $some_string_b,
...
);
みたいなんですよ、きっと。
my @all_key = ('0'..'9','a'..'z','A'..'Z');
my %table = ((map {($_,$_)} @all_key),
'a'=> 'value_of_a',
...
);
こんなふうに構築すればいいんじゃないかと。
0939nobodyさん
2007/05/23(水) 17:38:52ID:???まぁそうですね。色々試しましたが、後方参照は既に別の場所で
使ってるスクリプト内と、そうでないスクリプト内で比較が大幅に
変わりますので、後方参照に手を出したとこで降りました。
結論としては変数使うか使わないかが全てですね。
使わないならgrep tr/abcd/efgh/,@hoge;が最速だし、
一番わかり良いと思いますよ。
0940nobodyさん
2007/05/23(水) 17:54:23ID:???いや、「置換」て言葉に惑わされちゃだめですよ。
元の'a'に対応する「置換先の語」が1文字じゃなくて、'a_very_long_long_string_of_a'
とかなんですよ。きっと。どうもそんなふうな気がします。
trが使える1:1置換なら、
my @s = qw(a b c d e);
my $s = join '', @s;
$s =~ tr/abcde/fghij/;
my @t = split '', $s;
速度的には、grep tr 〜 と同等(うちの環境では)
0942nobodyさん
2007/05/23(水) 18:21:56ID:NYd4g07l0943nobodyさん
2007/05/23(水) 18:53:38ID:???for(@hoge){tr文}
0944nobodyさん
2007/05/23(水) 19:03:08ID:???ベンチマークとってぷ板に聞いてきました。
→ http://pc11.2ch.net/test/read.cgi/tech/1173880452/778-
>>943
うんうん、元のデータを変更しないで新しい配列作るならforかmapだし
元のデータ変更していいならforが自然だと思うのです
0945nobodyさん
2007/05/23(水) 21:25:36ID:???同じ箸だからってんで火箸で料理を作ってるようなモンだろ?
で、「火箸の方が固いし腐らないよ」って主張してる。
言い過ぎに感じるかもしらんが、それくらい変。
上司にバレたら呼出くらうし、部下にバレたら、それ以降
何を言ってもフィルターかけられて見られる。
0946nobodyさん
2007/05/23(水) 21:45:44ID:???> 上司にバレたら呼出くらう
それはねえだろw
茶のみながら「perldoc読みなおせ」くらいで済むんじゃないw
0947nobodyさん
2007/05/23(水) 22:52:24ID:???$sに代入しているタイトルは $FORM{'title'}
タイトルが記入されていませんのエラー判定のタイトルは $form{'title'}
違う変数だわな。
use strictを指定してperlに教えてもらいなさい。
0948906
2007/05/23(水) 23:06:05ID:???数値を数万個1つずつ改行して記録しているファイル(data.txt)の1行目から順に読み込んでその数値を取り出す作業
ついさきほどようやく形になりました
えーっと ムチャクチャなんですけど
$|=1;
open(QQ,"base.txt");
$base = <QQ>;
close(QQ);
$base++;
open(QQ,">base.txt");
print QQ "$base";
close(QQ);
open( IN, "data.txt" );
@file = <IN>;
close( IN );
$line = $file[$base - 1];
$line =~ s/\n//g;
いや ホントむちゃくちゃだと思いますがなんとか動き始めました
base.txtに何行目まで読んだか記録するようにしました
そしてその行の数値から改行を取り除く
問題は最終行に行き着いてしまったときに自動的にbase.txtをリセットして
1行目から再び読んでくれるようにする行程です
急遽必要になって必死でやったんで これでも感動ものです・・・^^;
0949nobodyさん
2007/05/24(木) 00:10:10ID:???例えば、「こんなガスコンロ自作したいので教えて」とド素人が言ってきて
その道の人が色々と安全に自作できるように作り方を教えてあげた。
ところが、ド素人ゆえに理解できないのか理解する気がないのか、
アドバイスも何もかも無視して、
「ムチャクチャなんですけど、何とか作ってみました。あと一息ですが、ここまでできただけでも感動ものです!」
と自分なりにガスコンロを作り上げた。
ところが、ガス管は外れかかってるし、火力は調節できないし、という危険な装置だった。
聞けば、既にその装置を試用しつつ改良を加えているらしい。
さて、ここで一番問題なのは、非常識な当の本人だけではなく
そいつと同じマンションにたまたま居合わせてしまった他の住人までもが
危険な状態にさらされてしまうってことだ。
0950nobodyさん
2007/05/24(木) 00:12:36ID:???共有鯖でやってくれるな
ってことだな
0951906
2007/05/24(木) 01:02:23ID:???心配おかけしました
0952904
2007/05/24(木) 02:43:26ID:???大文字と小文字か・・・っ!!
ありがとうございました(><)
0953861
2007/05/24(木) 10:14:27ID:hyRyij45こんどは別の物で行き詰まりました。
1:CGIからファイルを製作するときに付けたファイル名(フォー
ムから環境変数を利用して送信)がすでにあるファイルと重複し
ていた場合の処理。以下ソース
#!/usr/bin/perl
$dir = "環境変数からファイル名を取得した値";
opendir(DIR , '.');
@view = readdir(DIR);
$xx = pop @view;
while ($xx = 0) {
if ($xx =~ /$dir/) {
print "すでにディレクトリが存在します";
}
$xx = pop @view;
}
print "elrr end"
2:もし$xxが0にならなかったら怖いので実行できない
0954nobodyさん
2007/05/24(木) 11:21:06ID:???やめちまえ
0955nobodyさん
2007/05/24(木) 11:43:03ID:???で、ここは宿題を教えてもらう場所じゃないからな
0956861
2007/05/24(木) 11:51:00ID:hyRyij45製作環境を先に作ることにします。
ウインドウズ用のパールが借りているサーバーと一部互換性がなくうまくいき
ませんでした、やはりリナックスを買うべきでしょうか><
0957nobodyさん
2007/05/24(木) 11:53:09ID:???0959nobodyさん
2007/05/24(木) 12:30:41ID:???それ常に0ですからwってか改造スレ行ってください。
>>948
自分で頑張るのはいい事だと思うけど頑張る方向まちがった感が…
張られたソースと数レス前みれば解決しそうな内容なのにな
0960906
2007/05/24(木) 15:10:45ID:uINrQbUQムチャクチャなのは承知なので勘弁してください(自分のPC上で動作させます)
ホントに知識がないのに急遽必要になったものですから・・・
けどなんとかあと一歩まで来ました
$|=1;
open(QQ,"base.txt");
$base = <QQ>;
close(QQ);
$base++;
open(QQ,">base.txt");
print QQ "$base";
close(QQ);
use Tie::File;
tie @array, 'Tie::File', "data.txt" or die;
$line = $array[$base-1];
untie @array;
最難関は最終行に行き着いたときに1行目に戻る方法!
ほぼ徹夜でやって未だ成功しておりません.....
0961nobodyさん
2007/05/24(木) 15:45:15ID:???}
で囲めばよくね?
0962nobodyさん
2007/05/24(木) 15:51:49ID:???0963nobodyさん
2007/05/24(木) 16:14:37ID:???もう無視でいいんじゃね?
人の話聞かないんじゃアドバイスするほうも惨めだわ
0964906
2007/05/24(木) 17:06:14ID:???助かりました!
私の場合ブラウザの「更新」を押す度にdata.txt内の次の数字が
表示されるようにしたかったのですが「while」のヒントをいただいて
調べていると「if」が使えることに気付きました
>>962
$#arrayは何か使いやすい重要なヒントなんだと思います
しかし検索すると「$#」の部分が無視されてうまく検索できません
コレを使うともっともっと改良の余地があるのでしょうね・・・
>>963
すみません。。
tell seekについては調べたのですが「xxxバイト先を指定する」とからしく
xxx行目を指定する場合に私の知識では上手く使いこなせず断念してしまいました
気分を害してしまい申し訳ないです・・・
以下が完成したものです
これで更新を押す度にdata.txt内の次の行が表示され,最終行に行くと
1行目に戻っているようです
なんか表示までが多少モッサリした気がしますが・・・
0965906
2007/05/24(木) 17:07:31ID:???なにかもし「ここはいくら何でもこうした方がよい」的なアドバイスがあれば
宜しくお願いいたします
#!/usr/local/bin/perl
$|=1;
open(QQ,"base.txt");
$base = <QQ>;
close(QQ);
use Tie::File;
tie @array, 'Tie::File', "data.txt" or die;
if ( $array[$base-1] =~ /[0-9]+/ ) {
$line = $array[$base-1];
$base++;
open(QQ,">base.txt");
print QQ "$base";
} else {
$line = $array[0];
open(QQ,">base.txt");
print QQ '2';
}
close(QQ);
untie @array;
print <<"_HTML_";
Content-type: text/html
以下略
0967nobodyさん
2007/05/24(木) 18:16:18ID:???どこまで読んだかを行数ではなくファイルの先頭からのバイト数で
管理することができる。そうすればseekが使えて、これはいちいち
ファイルを読み出して行数数えなくてもいいので効率的。
途中の変更があったりするんならあきらめて頭から読むしかないが、
それはいかにも効率が悪いのでそもそもデータの持ち方から普通は
考え直すね。
0968nobodyさん
2007/05/24(木) 22:39:15ID:???ロックとかもしないとね。うん。
0969nobodyさん
2007/05/24(木) 22:53:09ID:???0970nobodyさん
2007/05/24(木) 23:45:29ID:???完成品渡すまで帰らないんじゃないか。
0971nobodyさん
2007/05/25(金) 17:41:48ID:???フレームワークなりなんなりのモジュールってないですかね?
0972nobodyさん
2007/05/25(金) 18:41:39ID:???http://search.cpan.org/search?query=cal&mode=all
0973nobodyさん
2007/05/26(土) 02:02:39ID:???use CGI;
my $q=CGI->new(); open(FILE,'<','./data.txt'); my @file=<FILE>; close(FILE);
my ($p,$s,$e)=($q->param('p'),$q->param('s')?1:0,$ENV{'SCRIPT_NAME'});
$p=$p=~/^\d*$/?$p<=$#file?$p:0:0; print $q->header(-charset=>'Shift_JIS'),
$q->start_html(-lang=>'ja',-encoding=>'Shift_JIS',-title=>'',
-head=>$q->param('m')ne's'?$q->meta({-http_equiv=>'refresh',
-content=>sprintf("5;URL=$e?p=%d",$p+1)}):''),$p==0?'前':$q->a({href=>sprintf(
"$e?p=%d%s",$p-1,$s?'&s=1':'')},"前"),' / ',$q->a({href=>sprintf("$e?p=$p%s",$s?'':'&s=1')},
$s?'再生':'停止'),' / ',$p>=$#file?'次':$q->a({href=>sprintf("$e?p=%d%s",$p+1,$s?'&s=1':'')},
"次"),"<hr>$file[$p]",$q->end_html;
0975nobodyさん
2007/05/26(土) 02:05:58ID:???0976nobodyさん
2007/05/26(土) 02:17:39ID:???ついでに7行にしてみた。
use CGI;my $q=CGI->new();open(FILE,'<','./data.txt');my @file=<FILE>;close(FILE);my ($p,
$s,$e)=($q->param('p'),$q->param('s')?1:0,$ENV{'SCRIPT_NAME'});$p=$p=~/^\d*$/?$p<=$#file?
$p:0:0;print $q->header(-charset=>'Shift_JIS'),$q->start_html(-lang=>'ja',-encoding=>
'Shift_JIS',-title=>'',-head=>$s?'':$q->meta({-http_equiv=>'refresh',-content=>sprintf(
"5;URL=$e?p=%d",$p+1)})),$p==0?'前':$q->a({href=>sprintf("$e?p=%d%s",$p-1,$s?'&s=1':'')},
'前'),'/',$q->a({href=>sprintf("$e?p=$p%s",$s?'':'&s=1')},$s?'再生':'停止'),'/',$p>=$#file?
'次':$q->a({href=>sprintf("$e?p=%d%s",$p+1,$s?'&s=1':'')},'次'),"<hr>$file[$p]",$q->end_html;
0977nobodyさん
2007/05/26(土) 02:20:21ID:???って
$p?かんたら:なんたら
にならない?
0978nobodyさん
2007/05/26(土) 02:35:14ID:???なるね。…ていうか勢いで書いて>>973を上げた時点で動作確認すら
してなかったので、細かいツッコミは、かんべんしてくださいな(^_^A
0979nobodyさん
2007/05/26(土) 02:40:03ID:???0981nobodyさん
2007/05/28(月) 10:24:47ID:???半年ROMってろ
0982nobodyさん
2007/05/28(月) 12:09:53ID:???0983nobodyさん
2007/05/28(月) 17:39:54ID:???・一気読みするよりはましだけど>>921よりタコ
・$nextを保存するなり次のCGI呼び出しの引数に使う
use IO::File;
# 例: ($value,$next) = get_line($file,$line);
sub get_line{
my($c,$f) = (0,IO::File->new($_[0]));
$c++ == $_[1] && return ($_,$c) while <$f>;
return get_line($_[0],$_[1]-$c);
}
0984nobodyさん
2007/05/28(月) 18:41:47ID:???30個あるデータを6セルずつのテーブルに入れたい。
■考えたこと
tdタグを出す度に変数Xに1足していき、セルの数に達したら変数Xを初期化すればOKじゃまいか。
■処理結果
一番最後の段になると全部は吐き出されない。なぜこうなるのでしょうか。
■書いたコード(Perl)
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print <<"EOM";
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
</head>
<body><center><table border="1"><tr>
EOM
$flag=0;
for ($xx = 1; $xx <= 30; $xx++) {
if($flag eq 6){
$flag=0;
print "</tr><tr>";#ここが認識されてない?
}else{
$flag= $flag+1;
print "<td>$flag</td>";
}
}
print "</table>";
0985nobodyさん
2007/05/28(月) 18:51:03ID:???↓
print "<td>$xx</td>";
でやってみ
0986984
2007/05/28(月) 19:07:25ID:???やってみました。
・・・アホでした・・・orz
if($flag eq 6){
$flag=0;
print "</tr><tr>";#ここが認識されてない?
~~~~~~~~~~~<td>〜書いてないから、ですね。
ヒントどうもありがとうございました。
0988nobodyさん
2007/05/29(火) 13:25:03ID:???0989nobodyさん
2007/05/30(水) 01:25:04ID:???while(1){
my $buf,$total;
my $len=read(STDIN,$buf,100);
print $len.('x'x100)."\n";
$total+=$len;
last if $total >= $ENV{'CONTENT_LENGTH'};
}
みたいにSTDINのreadとSTDOUTへのprintを交互にやるようなCGIに
100MBちかくあるmultipart/form-dataを読ませると途中で
ストップしてしまうことがあるみたいですが、同じ症状に出くわした人とかいますか?
0990nobodyさん
2007/05/30(水) 01:32:18ID:???0991nobodyさん
2007/05/30(水) 01:43:53ID:???ブラウザもタイムアウトしないしどうなってるのかなと…。
0992nobodyさん
2007/05/30(水) 06:26:25ID:???0993nobodyさん
2007/05/30(水) 09:06:59ID:??????
だから、最終行を「print "</tr></table>"」にしないと
結果の最後が「</tr><tr></table>」になるって事だろ?
>>997の言ってる意味わかってんの?
0995nobodyさん
2007/05/30(水) 09:48:23ID:???だから割り算があってないの
算数からやり直してください
0997nobodyさん
2007/05/30(水) 10:18:16ID:???「声優のウンコを食べる」
は7.エロ・下品の削除対象に適応できて、
「声優の子宮に住み羊水を飲む」
には適応されない理由を教えてください。我儘言ってすみません。
0998nobodyさん
2007/05/30(水) 10:33:06ID:???板違い
気違い
0999nobodyさん
2007/05/30(水) 11:15:48ID:???1000nobodyさん
2007/05/30(水) 11:34:32ID:???http://pc11.2ch.net/test/read.cgi/tech/1180492034/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。