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

このエントリーをはてなブックマークに追加
1nobodyさん
Perlのコーディングで困ってる人のスレです。

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

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

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

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

前スレ http://pc10.2ch.net/test/read.cgi/php/1164519503/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
2nobodyさん:2007/02/10(土) 19:23:04 ID:???
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
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/
3nobodyさん:2007/02/10(土) 19:23:37 ID:???
4nobodyさん:2007/02/10(土) 19:25:07 ID:???
関連スレ
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/
5あぼーん:あぼーん
あぼーん
6あぼーん:あぼーん
あぼーん
7nobodyさん:2007/02/11(日) 03:49:47 ID:???
>>1
8nobodyさん:2007/02/11(日) 11:40:00 ID:R1v+g7+l
>>5, >>6
9nobodyさん:2007/02/11(日) 11:51:13 ID:uXIy6Xmt
perlで浮動小数点を 10のn乗 する計算をしたいのですが、ズレというのは発生するのでしょうか?


0.57 * 100
0.07 * 100

IE6のJavaScriptだと上の場合 56.99999 となりズレます。
いろんな数値をperlで試しており、今のところズレは起きていないのですが perl は大丈夫なのでしょうか?
10nobodyさん:2007/02/11(日) 12:07:58 ID:uXIy6Xmt
すいません。追記です。
以下のようにすると 57, 56 と結果が返されます。
---------------------------------
print 0.57 * 100;
print int(0.57 * 100);
---------------------------------
0.57 * 100 の結果は "57" に見えるけど本当は違うのでしょうか?
11脱帽:2007/02/11(日) 12:50:44 ID:???
心配ならbignum.pmでも使えば。
12nobodyさん:2007/02/11(日) 14:24:00 ID:???
0.57 → 57 / 100
0.57 * 100 → 57 * 100 / 100
13nobodyさん:2007/02/11(日) 16:04:38 ID:uXIy6Xmt
>>11
有難うございます。bignum.pmというのは知らなかったです。
Math::BigFloat をよく使うのですが、大量の計算をする場合にはスピードがだいぶ気になります。
10や100などの計算だけでも..と思ったのですが。

>>12
すいません。私には何が言いたいのか理解できません(>_<)
もう少し教えて頂け無いでしょうか。
14nobodyさん:2007/02/11(日) 16:06:28 ID:???
C使った方がええんちゃう?
15nobodyさん:2007/02/11(日) 18:39:39 ID:???
print int(sprintf('%f',0.57 * 100));
16nobodyさん:2007/02/11(日) 22:17:14 ID:???
前スレ埋めろよ
17 ◆TWARamEjuA :2007/02/11(日) 23:57:13 ID:??? BE:1742382-BRZ(6761)
いつの時代の人間だよ(嬉)>>埋め推奨
放置すればよろし。
18nobodyさん:2007/02/12(月) 02:02:34 ID:???
ヌル文字を含んだ値をPOSTで送って、受け取った先でReadParseした場合、値からヌル文字は削除されてしまうんですか?
19nobodyさん:2007/02/12(月) 02:52:50 ID:???
20nobodyさん:2007/02/12(月) 14:57:27 ID:EeKO4sif
CGI_Liteモジュールを使って配列を取得することはできますか?

<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'};

だと取得できませんでした。
そもそも配列をそのまま取得することはできないんでしょうか?
情報が載っているサイトだけでも良いのでアドバイスお願いします。
21nobodyさん:2007/02/12(月) 15:17:31 ID:???
CGI_Lite.pmは使ったことないんだけど $formdata = $form{'data'}; というオチは無い?
2220:2007/02/12(月) 15:27:01 ID:???
>>21
レスありがとうございます。

そういうオチはないです。
$formdata = $form{'data'}
にしても
@formdata = $form{'data'}
にしてもも同じ値(リファレンス?)が1つだけ返ってくるだけです。
ちなみに
$formdata = split(/ /,$form{'data'});
とかもやってみましたが、こちらは何も返ってきませんでした(当然ですが)。
23nobodyさん:2007/02/12(月) 17:09:55 ID:???
>>20-22
> 同じ値(リファレンス?)が1つだけ返ってくるだけです。
そこまで分かってて何故デリファレンスしないんだ。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html

@formdata = @{ $form{'data'} };
2421:2007/02/12(月) 17:29:44 ID:???
>23
俺を含めないでくれ。
2520:2007/02/12(月) 20:57:49 ID:???
>>23
あ・・・。お恥ずかしい。
その通りですね。
自分なりにデリファレンスやってみたつもりが
全然違う書き方してたみたいです。
デリファレンスの書き方で混乱しないように勉強します。
ありがとうございました!
26nobodyさん:2007/02/13(火) 15:50:27 ID:Kq8fojs+
""(はしごたか)などの文字をperlのスクリプトでPostgreSQLに保存する方法を教えていただけないでしょうか?
perlもPostgreSQLの文字コードもEUCで保存しています。
どのように文字をエスケープすればいいのか検索して調べてもわかりません。
よろしくお願いいたします。
27nobodyさん:2007/02/13(火) 16:14:50 ID:???
Jcode::CP932
2826:2007/02/13(火) 18:34:04 ID:Kq8fojs+
>>27
よろしければもう少し詳しくお願いできないでしょうか?
29nobodyさん:2007/02/13(火) 19:14:11 ID:???
どこで不具合が出てるのかわからない
処理中に文字化けしているのか、出力時に文字化けしているのか
そもそも文字化けなのか?DBに入らないのか?

文字化けならJcode::CP932(ただし要Jcode.pm上書き)か
WebだけならEncode::XMLCREFがいいんじゃないかと思いました
30nobodyさん:2007/02/13(火) 21:14:34 ID:???
教えていただけないでしょうか。
BBQ規制に関してです。
BBQ規制に巻き込まれた人を規制からはずすということをしたいのですが、
そのために
"allowhost.txt"に書き込まれたホストを一行ずつ読み込んで一致すれば規制を抜ける
ということにしたいです。
以下のソースの書き方では
串を入れるとBBQ規制には引っかかるのですが、
同じ串を"allowhost.txt"に書き込んでも規制を抜けません・・・。
どういう描き方が適当なんでしょうか?
31nobodyさん:2007/02/13(火) 21:17:02 ID:???
ソース。汚い書き方ですいません・・・。
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;
   }
  }
32nobodyさん:2007/02/13(火) 21:17:27 ID:???
続き

 ###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;
}
33 ◆TWARamEjuA :2007/02/13(火) 21:31:01 ID:??? BE:1307726-2BP(6811)
use Net::DNS;

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(^-^)';

風呂敷確認君より抜粋♪
34nobodyさん:2007/02/13(火) 22:48:50 ID:???
>>33
早速の返答どうもありがとうございます。
>>31-32のソースではなぜBBQ規制から抜けないのでしょうか?
35 ◆TWARamEjuA :2007/02/13(火) 23:07:28 ID:??? BE:1742944-2BP(6811)
>>34
ほへ?
エスパーさんぢゃないのでよくわかんないけれども、exit;しているからヂャネ?
36nobodyさん:2007/02/13(火) 23:11:09 ID:???
return $flag;
にしないと、なんの為にフラグ用意してるのやら
3726:2007/02/14(水) 11:57:59 ID:mjFZ4k3U
>>29
""などの文字をDBに入れようとすると、DBからのエラーが帰ってくるんです。
Webminから直接DBのデータを操作して""を入れるとすんなりと入るので、
perlで入れるときは文字に何らかの処理をかける必要があるのかと思ったのですが。
入力するデータはCSVファイルで、jcode.plを使ってSJIS→EUCへエンコード後に、SQLコマンドを実行してDBに書き込んでいます。
""などの文字が入っていなければ、エラーはないのですが、入っているとエラーが帰ってきてDBへの書き込みができません。
スクリプトの文字コードはEUCで、perlのバージョンが5.6.1なのです。
38nobodyさん:2007/02/14(水) 12:35:03 ID:???
エラーメッセージがあるなら書けよ
39nobodyさん:2007/02/14(水) 12:39:29 ID:???
とりあえずwebminから入れたのをperlから読み出したときのバイト列と
書き込もうとしてうまくいかないバイト列を比較してみてはどうか。
君の変換がおかしいのか、もっと先に問題があるのかの切り分けにはなる。
40nobodyさん:2007/02/14(水) 14:04:28 ID:???
そもそも という字は、euc-jp で表現できるのか?
41nobodyさん:2007/02/14(水) 14:27:20 ID:???
(はしごだか)はeuc-jpでも表現できるみたい。>39が言ってるけど、まず切り分けることだね。

# そもそもeuc-jpをやめて全部utf-8に…ゲフンゲフン
4240:2007/02/14(水) 14:41:35 ID:???
> (はしごだか)はeuc-jpでも表現できるみたい。

すまんこ。euc-jp で表現できることを確認しますた。
43nobodyさん:2007/02/14(水) 14:49:15 ID:???
>>40
はしごだかはIBM拡張文字なのでなんらかの拡張が必要なんじゃない?
拡張したのもeucと呼ぶ人がいるけれども、拡張の方法も一通りでは
ないからどれのつもりで言ってるか気をつけないといけない。

ttp://msyk.at.webry.info/200511/article_2.html あたり参照。

5.6はいい加減捨てて5.8.x+Encode::EUCJPMSを使う方がいいん
じゃないかと思う。
44nobodyさん:2007/02/14(水) 14:55:18 ID:RW6nNThJ
http://www.youtube.com/watch?v=KyLqUf4cdwc

perlって難しすぎる。
4540:2007/02/14(水) 15:07:46 ID:???
あー、なんか読めないすね。

秀丸で、「高 」を 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.
高 ?
46nobodyさん:2007/02/14(水) 15:33:57 ID:???
>>45
euc-jp-msでは?
47nobodyさん:2007/02/15(木) 00:36:29 ID:???
自分のサイトにチャットを置いていて、携帯電話からも利用できるようにしたところ
どうにも困った事がおきたので質問させてもらいます。

チャットには参加者一覧が表示されます。携帯からチャットにアクセスすると、その
参加者一覧に自分の名前がいくつも表示されるという不具合が起きました。ログを見る
と携帯電話は数分でIPが変わっていて、それをスクリプトが別端末からのアクセスだ
と誤認したのが原因でした。(最終アクセスから5分経つとそのIPの参加者の名前はリ
ストから削除します。)

そういえば2chは携帯で書き込んでも毎回同じIDだなと思い、何度かfusianasan
をしてみるとIPは(たぶん)変わっているにも関わらず、全て"07012360463529_vi"とい
う謎の文字列が出てきました。2chは同一端末からのアクセスをなにかエロい事をして
認識しているらしいです。

参加者リストに同じ名前が複数あるときは一つにまとめようかと考えていますが根本
的には解決していないので、気持ち悪いので、何かいい案を下さい。

# KENT WEBのCOMCHATをベースに改造してつかっています。
# ttp://www.kent-web.com/chat/comchat.html
48nobodyさん:2007/02/15(木) 00:40:35 ID:???
mod_perl使うために、グローバル変数をどうしたらいいのか
教えていただきたいのですが、よろしくお願いします。

use strict;
use warnings;
use CGI::Carp qw/fatalsToBrowser/;
この3行をソースコードのはじめのあたりに加えると
Global symbol "$xxxx" requires explicit package name at ・・・
こういうエラーが出てきました。

・グローバル変数の探し方は、この方法で大丈夫でしょうか?

・この出てきたグローバル変数の中で、”値の変化しないグローバル変数はそのまま”
”値の変化するグローバル変数にmyを付けて”、動作も矛盾しないようなコードに
直せばよいのでしょうか?
マルチスレッドのようなイメージで考えればよいでしょうか。
49nobodyさん:2007/02/15(木) 01:03:55 ID:???
use vars qw(%xxxx);
50nobodyさん:2007/02/15(木) 01:28:23 ID:KpCoXSAW
>>47
セッションID(の類)をリロードの時に送信するとか。
リロード方法によってはIDの伝達途切れるから、
名前+UAくらいで判別するのも悪くはないと思う。
2chが何やってるかは知らない

>>48
他言語の経験あるならその方針で大丈夫
51nobodyさん:2007/02/15(木) 02:02:42 ID:???
Perl+CGIをやってみようかと思い勃ったが仏滅、どうしようもなくハマってます。
助けてやってください。

さくらのシェルで、viでこんなのを書きました。

 #!/usr/bin/perl
 print "Hello World!\n";

そしてchmod 755して、ブラウザからhttp://foo.jp/var.cgiとやったらサーバエラーになるんです。orz
私は何か根本的な事を知らないのでしょーか?

52nobodyさん:2007/02/15(木) 02:11:09 ID:???
CGIのべんきょーを他のユーザーを巻き込む可能性のあるサーバーでやったらあかんでしょ。

ActivePerlと04WebServerでもダウンロードしてローカルでやんなさい。
53nobodyさん:2007/02/15(木) 02:17:23 ID:???
>>50
プログラミング勉強始めて一ヶ月なので。(汗
レスありがとうございます。助かりました。
54nobodyさん:2007/02/15(木) 02:34:06 ID:???
>>53
助かったの?
CGIの場合少なくとも最初に
print "content-type: text/html\n\n";なり、
print "content-type: text/plain\n\n";なりの出力が必要。
確かに根本的な事。
ローカルの方が作業もしやすいよ。
55nobodyさん:2007/02/15(木) 02:50:34 ID:???
>>54
動きますた!
そんな類のこったろうと思いましたが、具体的に何書いて良いかがわかりませんでした。(^^;
これでまっとうな勉強が出来そうです。

>>52
いやーローカルの鯖でシェルからperl ./var.cgiしたら文句なく動いてるのに、cgiとして動かしたら何故動かない!とテンパってたんです。(^^;
生のperlとCGI経由の違いが解ってようやく前に進めそうです。

56nobodyさん:2007/02/15(木) 06:55:48 ID:???
> ActivePerlと04WebServerでもダウンロードしてローカルでやんなさい。

VMware server と、適当な Linux でいいんじゃないの?
5753:2007/02/15(木) 08:12:01 ID:???
53です。
SpeedyCGIなんとか入れてみました。ネットで調べたところ、
「使用し終わったグローバル変数がそのまま再利用されるため、
変数にゴミが入った状態になります。 グローバル変数の初期化が前提です。」
とありました。

i=0; i++; i++; i++; i++; i++; print("i");
i=0;と初期化して、5回足しています。

1,2,3,4,5と順調に加算されて、printする瞬間iを参照したら、
5でなくi=3だったということには、ならないのでしょうか。

使用し終わったグローバル変数がそのまま再利用
ということなので、ひとつのプロセスが使用中のグローバル変数は、
他のプロセスで再利用(参照)されないで、新しいプロセスは新しいグローバル変数が
割り当てられるんでしょうか。(わかりづらくてすみません)

初期化するだけで大丈夫、という仕組みが難しいです。
解説しているページやアドバイスなどお願いします。
58nobodyさん:2007/02/15(木) 09:07:33 ID:???
>>47
それはEZ番号ではないですか。auでEZ番号を通知するモードにしていると、公式サイトでなくても
環境変数$ENV{HTTP_X_UP_SUBNO}から取得できます。端末の同定には都合がいいですが、
他のキャリアでは通用しないと思います。やはり、最初のアクセスの時にセッションIDを発行して
引き回すしかないのでは?
59nobodyさん:2007/02/15(木) 10:55:43 ID:???
携帯でセッション引き回してるのにセッション切れが多発して
おっかしいなーとおもったらIPマッチ使ってた
60nobodyさん:2007/02/15(木) 11:25:12 ID:???
>>47
携帯は固有番号をもっている。2chはそれを取得している。IPアドレスはリクエスト毎に可変で、しかも1ページの取得に複数のIPを使うこともある。
固有番号は、(たしかEzWeb以外は)ユーザが許可したらHTTPヘッダに埋め込まれ、仕様は各ベンダーサイトで見れる。
>>57
#!〜から始まる1行目(名前を忘れた)に変数を初期化するオプションがあったはず
61nobodyさん:2007/02/15(木) 14:47:43 ID:???
>>47
auのケータイは常に EZ番号 (旧サブスクライバID) という個体識別番号を送信している。
Softbank もデフォで全てのサイトに送信されると思った。

DoCoMoは確か投稿時に確認画面がでて、(,,゚Д゚)∩ハイッ!! を押すと個体識別番号が送信される。

携帯から fusianasan を安易にやることは避けたほうがいいし、
Webアクセスもなるべく自宅に設置したGWなどを使うか、全てのサイトで個人情報を入力しないほうがいい。

これは解約まで基本的に不変な情報であり、極めて危険。
ショッピングサイトの情報が漏洩したら、ワンクリサイトにアクセスしただけで、ワンクリ業者が住所などの個人情報を入手できることになるから。



6247:2007/02/15(木) 21:15:09 ID:???
みなさんレスありがとうございました。
固有番号を使うのはいろいろ面倒だったのでセッションIDを実装することにしました。
6353:2007/02/15(木) 23:45:03 ID:???
>>60
レスありがとうございます。
マルチスレッドみたいに、ひとつのグローバル変数を参照している
わけではないんですね。はじめだけ初期化すれば、あとは他のプロセスから
影響ないんですね。ふむふむ。
>#!〜から始まる1行目
さっそく調べてみます。ありがとうございました。
64nobodyさん:2007/02/16(金) 00:11:07 ID:???
申し訳ありませんが、教えてください。

【質問の概要】
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の場合、どのような文字の並びで誤置換が起こるのか、教えていただけると幸いです。

申し訳ありませんが、ご教授ください。
65nobodyさん:2007/02/16(金) 00:55:50 ID:MoploLOU
お願いがあります。

Perl で、以下のCGIを作りました。
1)CSVファイルをアップロード
2)アップロードしたファイルを処理
3)処理したファイルのリンクを表示してダウンロード。

ところが、2)が重くて待たされるので、(MAX数分)
プログレスバーを表示しようと思うのですが、
どうやったらいいか・・・・。

ちゃちゃっと簡単にできる方法があればよろしくお願いします。m(_ _)m
66nobodyさん:2007/02/16(金) 01:28:03 ID:???
>>65
その数分もかかるへっぽこな処理を100倍高速化する。
67nobodyさん:2007/02/16(金) 01:41:11 ID:???
>>64
その結果を見ただけで意識しなくてもいいと判断する事は出来ないが、
正しい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メモ]にあるサイトが詳しいので、
必要ならとりあえずそっちを読んでくれ。
68nobodyさん:2007/02/16(金) 01:53:09 ID:???
>>67
まるごとPerlの記事もおすすめ
69nobodyさん:2007/02/16(金) 01:55:50 ID:???
間違えた>>64
70nobodyさん:2007/02/16(金) 06:38:18 ID:MoploLOU
>>66
数倍ならば高速化できますが、100倍はムリだとおもいます。

処理内容は以下に記載。
 1)CSVを1行を読み込み。
 2)対応するWEBページのURLを作成。
 3)上記URLをもとにWEBページをダウンロード。
 4)ダウンロードした情報をCSVに付加。

 処理時間は 1行あたり凡そ1秒。

既にダウンロードした情報はDBにキャッシュしていますが、
情報量の関係で
「新規にWEBページをダウンロードしなければならない」場合が
発生するのです。
71nobodyさん:2007/02/16(金) 09:57:57 ID:???
プログレスバー表示はクライアントサイドの話だから、板違いかな。
例えば、AjaxとかCommetとかFlashで何秒おきかに進捗状態を取得して表示するとか。
かなり面倒なことは確か。
72nobodyさん:2007/02/16(金) 10:28:08 ID:???
子プロセス?
73nobodyさん:2007/02/16(金) 14:30:20 ID:???
フラグ立てちゃうとエラーが…
7464:2007/02/16(金) 19:29:33 ID:???
>>67-68
丁寧な説明ありがとうございました。
>その結果を見ただけで意識しなくてもいいと判断する事は出来ないが、
その通りですね、すみません・・・
7565:2007/02/16(金) 23:38:29 ID:MoploLOU
>>71
どうもです。
やはり ajax ですか・・・、調べてみます。
76nobodyさん:2007/02/17(土) 01:22:16 ID:???
>>75
使ったことないけど、シンプルな進捗表示でいいなら
multipart/x-mixed-replace でさくっとできそうな気がする
7776:2007/02/17(土) 01:32:05 ID:???
なんかIEで使えないとか書いてあったな…。
やったことある方法では「<script> statusbox.value = "現在5件処理完了"; </script>」
的な1行javascriptをautoflushでprint。
78nobodyさん:2007/02/17(土) 17:26:59 ID:???
>>70
そんな事、CGIでやるべきではないと気付け。
79nobodyさん:2007/02/17(土) 20:47:43 ID:???
ファイルの中身を配列に入れたいんですけど、
my @file = <FILE>;
これより効率の良い方法ありますか。
ファイルの中身は最大で100KBです。
共有鯖なので心配で使えません。
80nobodyさん:2007/02/17(土) 21:23:25 ID:???
は?
81nobodyさん:2007/02/17(土) 21:33:47 ID:???
>>79
最終的に何がしたいのか、および何の効率かによる。

メモリ効率を気にしていて、「ファイルの中身を」丸ごと「配列に入れたい」のなら、
その方法だとデータサイズの2倍程度メモリを消費して、
1行ずつpushで代入する方法だとデータサイズと同じ程度だったが。
(perl5.8.7 on FreeBSD5.4調べ)

本当にやりたい事を考えずに配列に代入する効率だけ考えるのは本末転倒というものだ。
82nobodyさん:2007/02/17(土) 21:44:02 ID:???
readして改行コードでsplit
83nobodyさん:2007/02/17(土) 21:55:29 ID:???
>>81
(ファイルのフォーマットは先頭が数字で固定)
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万弱アクセスあります。
8481:2007/02/17(土) 22:00:24 ID:???
... $ned if....
my @choice = ...
あたりはまとめミスですorz
85nobodyさん:2007/02/17(土) 22:02:22 ID:???
そして名前ミス('A`)
83でした。すみません
86nobodyさん:2007/02/17(土) 22:28:50 ID:???
>>83
指定される範囲は通常データ全体に比べて非常に小さいものかな?

番号がソートされて並んでいるなら二分探索が有効。O(log n)に出来る。
行頭探すのがちょっと面倒だがなー。データ構造を変えることが可能ならば、
あらかじめ番号に対してオフセットを記録しておくような簡単なindex付けを行っておくのが吉。
87nobodyさん:2007/02/17(土) 23:07:21 ID:???
>>86
指定される範囲は予想ではデータ量の2割りくらいがメインです。
10割りの時もありますが。

二分探索を調べて見ましたが使いまわしできなくなりそうなのでやめました。

結局ファイルを小刻みに分割することにしました。
index付けとは言えませんが、
先に位置情報ファイルを読み込んで該当ファイルを探すといった感じです。

>>81 >>86 大変勉強になりました。ありがとうございました。
88nobodyさん:2007/02/18(日) 04:57:02 ID:???
>>83
行頭についてる整数値を取得すれば1行読みの1パスで行けるんじゃない?

>if ( /^\Q$count\E/s ) {
の行、$count=10のとき行頭が"100"でもマッチするね
データ構造上無いのかも知れないけど

ちなみに小分けしたファイルのどれから読み込むのかを
要求された値から機械的に算出できるようにするという工夫もあるよ
89nobodyさん:2007/02/18(日) 09:12:59 ID:???
>>83
>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を勉強(`・ω・´)
9065:2007/02/18(日) 17:02:29 ID:qiEEvOwU
>>78
>そんな事、CGIでやるべきではないと気付け。

 CSV処理サービスを多数に公開する趣旨にもとづき、CGIで試作しています。
 CGI以外で、多数のユーザーに処理サービスを公開する方法がありましたならば、
 ご教授願います。
91nobodyさん:2007/02/18(日) 17:24:45 ID:???
CGIでも場合によってはアリだと思うよ。

簡単な方法としては、
(1) HTTP response header を返す。
(2) HTTP body の先頭を返す。
ここで総処理件数を表示しても良い。
(3) 時間の掛かる処理を開始する。
(4) 1件処理毎に何らかのデータを返す。
(プログレスバーのような格好の良い物の代替として)
(5) できあがったCSVをダウンロードするためのリンクを出力。

つまり、プログレスバーの代わりに、(4) で何らかのデータを
返すだけだけどね。
垂れ流し的に「n件目、処理中」ってのが同じページに繰り返し
出ちゃったり、ちょっとかっこわるいけど。
92nobodyさん:2007/02/18(日) 17:34:02 ID:???
もうちょっと手の込んだ方法。

時間の掛かる処理を開始する前に

<meta http-equiv="Refresh" content="10;URL=hoge.cgi?jobid=123">

みたいなページを返して、定期的に hoge.cgi を呼び出させる。
上記のページをクライアント側へ返したらSTDOUTとSTDERRはcloseする。

hoge.cgi は与えられたパラメータ(例示のjobid=123みたいな)でどの処理か
特定し、処理途中なら進捗具合を返す、の繰り返し。

処理完了なら、CSVダウンロードのためのリンクを返す。

で、どうだろ。
93nobodyさん:2007/02/18(日) 17:58:06 ID:???
ローディングとかのアニメGIFでも表示させてろよ
十分だろ
94nobodyさん:2007/02/18(日) 18:05:14 ID:???
>>93
割り切って人間に対してはそれでも良いかもね。

しかしHTTP通信上、一定時間データが流れないと、ブラウザ側が
エラーと見なしてしまうことがあるからね。
9565:2007/02/18(日) 20:30:00 ID:qiEEvOwU
>>91, >>92
CGI の神のご教授、感謝です。
いままでは local 環境でのプログラミング( kernel層)ばかりだったので、
CGI は可也勝手が違います。
96nobodyさん:2007/02/19(月) 05:29:32 ID:???
初心者の浅知恵でしかないんだけど、処理中に一定数ループしたら、
ちょっとだけファイル書き出しておけばよさそうに感じるけど、そういう感じって出来ないのかね。
処理してるのと別の工程でそのファイル読み出して進展状況とするみたいな感じで。
97nobodyさん:2007/02/19(月) 07:55:57 ID:vpFQD8kw
>>96
できるよ。一度ユーザに画面遷移してもらうという点では>>92と同じ考え方。
実装では>>92もファイルを書き出すことになるだろうけど。
98nobodyさん:2007/02/20(火) 02:04:21 ID:???
話の流れをぶったぎってすいませんが質問です。
use CGI;
$q = new CGI;

foreach($q->param){
といった形のソースで、POSTされたデータをハッシュで受けたいのですが、keyにあたる部分にHTMLでいうところのID要素を与えたいと思います。
ループ内でVALUEは$_で受け取れますが、ID要素に当たる部分を取得する方法はありませんか?
99nobodyさん:2007/02/20(火) 08:31:07 ID:???
>>98
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
「スクリプトの渡された全てのパラメータの名前の取り出し」から
「パラメータリストのハッシュでの取り出し」まで読もうな。
100nobodyさん:2007/02/20(火) 10:28:24 ID:???
>>98
不可能。ID属性に関する情報はブラウザから飛んでこない。
101nobodyさん:2007/02/20(火) 10:36:15 ID:???
nameとvalueは飛んでくる
102nobodyさん:2007/02/20(火) 11:28:45 ID:6AwpaKJs
Perl v5.8.7 を WindowsXP 上で使っています。
Apache のアクセスログで、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);
103nobodyさん:2007/02/20(火) 11:32:45 ID:???
13行目がエラーって書いてあるだろ?
よく見るんだ!!
104nobodyさん:2007/02/20(火) 11:36:24 ID:???
>>101
それが何か?

>>102 入れ替える。
print(OUT "$_\n")
if ($_ !~ /Mozilla/i);
105102:2007/02/20(火) 11:38:33 ID:???
該当部分を
if ($_ !~ /Mozilla/) {
print(OUT "$_\n");
}
と括弧つけたらコンパイル通りました・・・
式が一文だから括弧つけなくてもいいと思ってたのに、
ダメなんでしたっけ?
106101:2007/02/20(火) 11:42:09 ID:???
>>104
>>100への補足だよ・・・なんでそんな言い方するん?
107nobodyさん:2007/02/20(火) 11:48:20 ID:???
>>105
C や Java ならおkなんだけど、Perl では後置にしない限り if にはブロックが必要。
108nobodyさん:2007/02/20(火) 11:50:45 ID:???
>>105
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.
109102:2007/02/20(火) 12:50:14 ID:???
>>104
入れ違いになってしまいました。ありがとうございます。

>>107,108
なるほどそうなんですね、
Cあがりなので後置というのがすごく違和感あるのですが
頑張ります。
ありがとうございました。
110nobodyさん:2007/02/20(火) 13:03:25 ID:???
>>106
当たり前の事をあえて書いているので、nameとvalueからidを生成する画期的な技でも隠しているのかと。
111nobodyさん:2007/02/20(火) 13:05:23 ID:???
後置は乱用しすぎると見難いので、無理せず {} 使ったほうがいいと思うよ。

俺はほとんどイディオムと化している next if 〜ぐらいしか後置は使わないな。
いろいろ、好みもあるとは思うがね。
112nobodyさん:2007/02/20(火) 13:05:26 ID:???
逆にあらかじめnameとvalueからID生成して付けとけばいいんじゃね?
113nobodyさん:2007/02/20(火) 13:30:25 ID:???
valueを予測しておく技術を開発するのか。凄いなぁ。
114nobodyさん:2007/02/20(火) 13:37:37 ID:???
orと||ってどっちをよく使う?
渡しは、より順位が下という理由だけで、ほとんどorを使ってるけど。
115nobodyさん:2007/02/20(火) 13:52:16 ID:???
>>113
valueが可変なのはtextかtextareaかpasswordぐらいっしょ
その他ならできるんじゃね?
っつーかあんた陰でイヤミって呼ばれてるっしょ?
116nobodyさん:2007/02/20(火) 13:56:54 ID:???
>>114
漏れは必要なときだけorかな
・条件文の中では||
・式をショートサーキット評価するときも||
・文をショートサーキット評価するときはor
while ($x || $y) {
my $hoge = $fuga || parse() or die 'Parse error';
...
}
実際にこんな組み合わせて書くことはないけれどこんな感じで
117nobodyさん:2007/02/20(火) 14:12:04 ID:???
俺は値を使うようなときは||で、orはほげほげ or die ... みたいに式全体の値は
どうでもよくて制御構造っぽく使うときだけ。

118nobodyさん:2007/02/20(火) 14:22:08 ID:???
なるほど。
119nobodyさん:2007/02/20(火) 14:45:36 ID:???
>>115
ロクな検討もしていない思いつきを垂れ流されると振り回されて迷惑。
nameとvalueが予め列挙できている事で可能になる、idの生成方法なんて考えて無いでしょ?
120nobodyさん:2007/02/21(水) 18:22:26 ID:???
hoge.txtをネットで、公開してダウンロードした数を記録したいと思います。
スクリプトの記述は、cgi呼び出されたら、
・wgetで、hoge.txtを指定して実行
・カウントをひとつ足して記録
こんな感じでしょうか?

wgetでダウンロードできるでしょうか。
121nobodyさん:2007/02/21(水) 18:23:28 ID:u+1RH8XX
>>120
hoge.txtがどこにあるかしらないが、同じサーバ上にあるなら普通にopen()して読み取ればいいんじゃないの?
122nobodyさん:2007/02/21(水) 21:25:39 ID:???
ファイルがロック中なら
待たずに即座に終了させたい。

↓こんなサブルーチン作ったけど確認できないのでご教授ください。
sub FileLockEX {
  # use Fcntl ':flock';
  my($fh,$lockfile) = @_;
  open($fh,"> $lockfile") or die;
  if ( flock($fh,LOCK_EX|LOCK_NB) ) {
    return $fh;
  }
  else {
    die;
  }
}
123nobodyさん:2007/02/21(水) 23:08:58 ID:???
確認できないもん作るな!
以上

次どうぞ
124nobodyさん:2007/02/21(水) 23:34:29 ID:???
perl6 は何時できるんですか?
125nobodyさん:2007/02/21(水) 23:41:16 ID:???
今、配達に出るところです。
126nobodyさん:2007/02/21(水) 23:56:26 ID:???
>>122
【Perl】ファイルロック(排他処理)について語ろう
http://pc10.2ch.net/test/read.cgi/php/1024795138/
127nobodyさん:2007/02/22(木) 12:53:40 ID:???
>>125
早いとこよろしくお願いします。
128nobodyさん:2007/02/22(木) 19:13:48 ID:???
>>121
レス遅くなりました。
いただいたアドバイスの意味がわからなくて、
時間かかってしまいました。

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:
は、ダウンロードするファイルの種類によって、変えるんでしょうか。
意味がわからなかったりしますが、ちょっとずつ勉強したいと思います。
ありがとうございました。
129nobodyさん:2007/02/22(木) 21:18:05 ID:???
つ MIME
130nobodyさん:2007/02/23(金) 01:48:29 ID:zpF2/r1p
現在
open(FILE, '>:encoding(cp932)', $fn) or die;

のようにしてUTF-8の文字を、Shift-jisに変換しています。
UTF-8には存在する文字でShift-jisに存在しない文字の場合、
エラーが発生し、UTF-8の文字コードが表示されてしまうの
ですが、Shift-jisに存在しない文字コードの場合は表示を
しないようにする(空白に変換する等)にはどのようにしたら
よいでしょうか?
131nobodyさん:2007/02/23(金) 02:49:49 ID:???
>>130
perldoc Encode して
Handling Malformed Data
のあたり読んでみそ。

お好きなように選択してくださいな。
132nobodyさん:2007/02/23(金) 21:26:44 ID:vPX/8GZG
$uaはLWP::UserAgentです。
$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時間ほど寝てません。
133nobodyさん:2007/02/23(金) 21:35:25 ID:???
$ua->timeout(3);
134nobodyさん:2007/02/23(金) 21:40:39 ID:vPX/8GZG
それはconnectしてからのタイムアウト。
存在しないマシンをさっさと検知したいのです。

ちなみに対象ホストはpingかけても無応答が20秒くらい続くようなマシンです。
135nobodyさん:2007/02/23(金) 22:08:15 ID:???
136nobodyさん:2007/02/23(金) 23:24:55 ID:???
名前解決に時間がかかってるのかな。
ならば、Net::DNSで自分で引く。
137nobodyさん:2007/02/24(土) 02:30:49 ID:???
perlってもう終わってるんですか?PHPとかに比べて未来は無いんですか?
138nobodyさん:2007/02/24(土) 02:39:06 ID:???
私も socket と select を使うのがいい気がするな。
139nobodyさん:2007/02/24(土) 15:19:31 ID:8+oB65y+
整数の四則計算で"ずれ"を知る方法はありますでしょうか?

整数だけの四則計算を数万回繰り返して結果を返すというのを作っているので
すが(÷は小数点以下切捨て)、結果が変になる場合がありました。

調べてみると、途中に非常に大きな数値が一つでもあるとそこでずれるというの
までは分かったのですが、正常に計算できる限界というのはどこまでなのでしょうか?
(perl v5.8.5, kernel-2.6.9-34)
140nobodyさん:2007/02/24(土) 15:41:17 ID:???
>>139
有効桁数については前スレで既出。まだ落ちてないようだから行ってらっしゃい
http://pc10.2ch.net/test/read.cgi/php/1164519503/641-681

計算方法を見直すか、根本的に解決するにはMath::BigInt
141nobodyさん:2007/02/24(土) 16:33:44 ID:8+oB65y+
有難うございます。見てきました。
あと、BigInt も軽くテストしてみてokだったので、実際に組み込んで
動かしてみましたが、結構遅いのですね。計ってみましたが300倍ぐら
い遅いです。

正確さをとるか速さをとるかのトレードオフなんですね。
142nobodyさん:2007/02/24(土) 16:55:27 ID:8+oB65y+
至極当然の事を言ってしまった..。
143nobodyさん:2007/02/24(土) 16:56:46 ID:???
>>141
Math::BigIntはPurePerlな実装だからね…
Math::BigInt::GMPとかXSによる実装があるから、
コンパイルできるならこれらを使うとそれなりに速くなると思うけれど。
http://search.cpan.org/search?query=Mathh%3ABigInt&mode=dist
144nobodyさん:2007/02/24(土) 17:10:20 ID:K7bQHZEY
よく配布されているCGI等で

open(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);

下の方が無駄に変数やリストを使わなくなるので軽いような気はしてるんですが、
イマイチ確信がもてないのです、実際どうなんでしょう?
145nobodyさん:2007/02/24(土) 18:11:51 ID:???
処理の内容によってはマルチプロセスの際に影響はあるかも。
146nobodyさん:2007/02/24(土) 18:42:29 ID:8+oB65y+
>>143
有難うございます。
すぐコンパイルが出来ず確認できないのですが、今度やってみます。
147nobodyさん:2007/02/24(土) 18:58:10 ID:???
インメモリ処理かどうかの違いってことか。
148nobodyさん:2007/02/24(土) 20:14:03 ID:8+oB65y+
割り切れない値であることを確認するにはどのようにすればよいのでしょうか?

45 / 20 = 2.25 (割り切れる)
45 / 21 = 2.1428.. (割り切れない)
149nobodyさん:2007/02/24(土) 20:30:33 ID:???
>>148
小学生か?
こんなところに書き込んでないで学校池いけよ
150nobodyさん:2007/02/24(土) 20:39:49 ID:???
>>149
わからんのなら答えるなよ
151nobodyさん:2007/02/24(土) 20:57:13 ID:???
そもそも問題の定義がなってない。
割り切れるか否かは基数によって変わるわけであって、
コンピュータでの小数表現は2を基数とするのが一般的。
つまりコンピュータにとっては1/5は「割り切れない数」なわけだが、>>148はどうしたいんだろうね。

まあともかくnを基数としたときに割り切れるかは、
その分数を約分した分母がnの素因数の積で構成されているかを判定すればOK
152nobodyさん:2007/02/24(土) 20:57:37 ID:???
m/nが10進の有限小数で表せるという意味だとすると、

m,nの最大公約数を求める。lとする。
n/lが2^x * 5^y(x,yは0以上の整数)という形ならOK

最大公約数の求め方はユークリッドの互除法でも調べてください。
後半は2と5でそれぞれ割り切れるだけ割っていって最後1になるか判定

という感じでいけるんじゃないか?

153nobodyさん:2007/02/24(土) 21:51:38 ID:Iwese7yM
                    朝鮮中央TV
                                 ∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧
                    ______    < 踏んだら孕んだ!抱いたら揉んだ!
                   /:::::::::::::::::::::::::::::ヽ   < 孕んだ振る降る般若だ!
                  /::::::::::::::::::::::::::::::::::::ヽ  < ティムポ擦る無駄、フン出る春巻きはむ無理!
                  |::"´ ̄ ̄ ̄ ̄ ̄ヽ:::|  <  チン毛ちぎり、看板塗る飛騨!
                  |:::|           |:::|  <  陰毛臭いんだ!モッコリ膨らんだ!
                 ヽ/ -=.、   _,=-  ゾ  <  安打!?半田ゴテ適時打!!
                  | |  -ェゝ ";ュ-   |ヽ  <  原チャリ盗んだ!あんだとこら!?
                  ヽト、  ´i `   ,.イ/  < よくちょん切れるハサミだ!
                  〈  i  /L_、  i 〉   _ノ∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨
               __,. -‐ヘ  -=三=-  /──、
          _ -‐ ''"   /  \     /\    ̄゛ー- 、
         ハ       /   |ヽ ̄ ̄//  ヽ、      ∧
         |  ヽ      く     ! .>ーく /     >      / !
           |   |     _>  ∨-、r‐/   <_     /  !
        ∧   !    ヽ     | 厂L/   ■/      i  .∧
       / \  |     \   ∨  !    /      | / ハ


154130:2007/02/24(土) 23:31:04 ID:WjAlsxOj
プログラムでutf-8の文字列を読み込みcp932変換する場合、cp932にない文字
は「?」に変換したいと考えてます。
この場合どのようになコーディングをしたらよいでしょうか?


せっかく131の方が答えてくれたんですが、
よくわかりませんでした。。すみません。。。
155nobodyさん:2007/02/25(日) 00:25:19 ID:???
ファイルアップロードの際に
$CGI::POST_MAX = 1024*1024;とせずに
ファイルサイズを調べて1MBより大きい場合にはじくのとでは
サーバへの負担が違いますか?
あと、POST_MAXを指定してサイズがオーバーしていた場合に
処理が取り消されたという情報はどこかに入るのでしょうか?
156155:2007/02/25(日) 00:29:49 ID:???
ごめんなさい。ぐぐったら出てきました。
最初にやってみるべきでした。
スレよごし、すいません。
157nobodyさん:2007/02/25(日) 05:58:13 ID:???
ム板ってどのスレにも必ず>>151みたいな奴がいる
158nobodyさん:2007/02/25(日) 06:47:46 ID:???
>>157
つ【同一人物】
159nobodyさん:2007/02/25(日) 07:00:21 ID:???
初心者スレなのに「剰余演算子」くらいのヒントも書いてやらないのか…
$hoge = 11 ;
$foo = 3 ;
if ( $hoge % $foo == 0 ){
}
160nobodyさん:2007/02/25(日) 07:31:31 ID:???
別にいいじゃん。
結局質問には一応だけど答えてるツンデレなんだし。
161nobodyさん:2007/02/25(日) 08:41:45 ID:???
そんな低級な話はしてないだろ
>>148をもう一回よく読んでみ
45 % 20 は0じゃないが割り切れると判断するんだぞ
162nobodyさん:2007/02/25(日) 09:25:01 ID:???
割り切れないたびに10倍して割り切れるか確認するのか?
163nobodyさん:2007/02/25(日) 09:26:01 ID:???
分母を1億倍位にして剰余を見る
164nobodyさん:2007/02/25(日) 09:38:58 ID:???
算数大丈夫ですか?
165148:2007/02/25(日) 10:16:04 ID:k71AVSTb
いろいろ有難うございます。
>>149,159,160
% で解決できるなら助かるのですが(>_<)
質問は理解し易く『 45 / 20 = 2.25 』と書いたつもりだったのですが、
難しかったようで、失礼しました。

>>152
有難うございます。
難しい・・・。もうちょっと勉強します。

>>162,163
有難うございます。10倍しても、1億倍してもどこで諦める瞬間を作らないと
いけないですよね。もしかしたら1億1倍のところで割り切れるかもしれない。

>>161 thank you...
166nobodyさん:2007/02/25(日) 12:45:49 ID:???
>>165
> もしかしたら1億1倍のところで割り切れるかもしれない。
( ゚д゚)ポカーン
167nobodyさん:2007/02/25(日) 13:02:07 ID:???
割り切れる事と分数で表せる事は違うような。循環小数とか。
168nobodyさん:2007/02/25(日) 13:02:55 ID:???
数IIIまで履修していない奴のプログラミングは全面禁止にすべきだな。
169nobodyさん:2007/02/25(日) 13:04:45 ID:???
素因数分解とGCD用のモジュールをCPANで拾ってくれば1行で書けそうだ
170nobodyさん:2007/02/25(日) 13:13:05 ID:???
危ねw
数IIIは履修してるけど数ABCを履修してねぇww
171nobodyさん:2007/02/25(日) 13:41:55 ID:???
有理数で無限小数の場合、必ず循環小数になる事を利用して

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";
}

というのはどーお?
172148:2007/02/25(日) 14:24:42 ID:k71AVSTb
>>171
有難うございます。
なんか出来そうですけど、2323 / 1000 なんて場合にちょっと無理ですね。
でもそうしたら今度は元の数字が循環してるかを調べればいいのかな?

ん?でも2つの値が関連するし...。どうだろ、無理かな?
もうちょっと試してみます。有難うございます。
173nobodyさん:2007/02/25(日) 18:42:00 ID:???
理系どころか文系でさえも無い俺は数学はろくにやってないw
やってた頃の成績はやたら良かったけど。
174nobodyさん:2007/02/25(日) 22:31:59 ID:???
センター数2B 33点だった\(^o^)/
175nobodyさん:2007/02/26(月) 05:06:09 ID:1VnrxNPd
質問です。
レンタル鯖に、欲しいモジュールが入っていないときには
どうすればいいでしょうか。

鯖管理者に要望を投げても無視されて、
「欲しいモジュール」を自力でコーディングするのもカッタルイというときです。

「hogehoge モジュールを CPAN からダウンロードしてインストールするなんて技はアリですか?」

(管理者権限の関係からムリっぽい気が・・・)
176nobodyさん:2007/02/26(月) 05:54:19 ID:???
perlまるごと自分が自由になるスペースに入れてそいつを使ってみる
177nobodyさん:2007/02/26(月) 06:41:20 ID:???
前世紀のノリで申し訳ないが、requireでなんとかなる方法もあるかもしれない。
Jcode.pm/jcode.plみたいに。
178nobodyさん:2007/02/26(月) 06:52:35 ID:???
バイナリが必要でないモジュールならコピーするだけで動くのでは?
179nobodyさん:2007/02/26(月) 08:24:24 ID:???
バイナリが必要でもコンパイルさえできれば動くしな。
180nobodyさん:2007/02/26(月) 13:35:52 ID:QboTsacU
「a.cgi」内のサブルーチン「first」の処理中に
「b.cgi」内のサブルーチン「second」を実行するにはどうすれば良いでしょうか?
181nobodyさん:2007/02/26(月) 13:44:05 ID:???
>>180
悪いことは言わないのでsecondはb.cgiから外に出して別ファイルにして、
a.cgiとb.cgiからuseかrequireするようにしとけ。
182nobodyさん:2007/02/26(月) 14:02:02 ID:???
>>181
ありがとうございます。その言に従います。
183nobodyさん:2007/02/26(月) 14:48:32 ID:aE2N5fUY
@hoge = ('a','b','c','d','e');
という配列があったとして、例えば3番目の要素を削除して
@hoge = ('a','b','d','e');
とする方法が分かりません。

foreachで特定の要素を「空」にすることはできるんですが
その要素自体を削除するような方法はないでしょうか?
184nobodyさん:2007/02/26(月) 14:59:24 ID:???
>>183
つ splice(@hoge,2,1);
185183:2007/02/26(月) 15:06:54 ID:???
>>184
ズバリな関数があったんですね…勉強不足です。
foreachで「空以外なら」という条件式でゴリ押ししてた現状から抜け出せます。
ありがとうございました。
186nobodyさん:2007/02/26(月) 15:38:34 ID:04bnguup
ヘッダを次のように指定してもダウンロードダイアログが出てくれず、
ファイル内容が垂れ流されてきてしまいます。


print "Content-type: application/x-gzip; name=archive.gz";
print "Content-Transfer-Encoding: base64";
print "Content-Disposition: attachment; filename=archive.gz";

ヘッダーの設定が間違ってるようですが、どう直せばいいでしょうか?
よろしくお願いいたします。
187nobodyさん:2007/02/26(月) 15:45:12 ID:???
まずヘッダーはいちいち末尾改行が必要
で、ヘッダーの終了部分には連続改行が必要
これ常識ね
188nobodyさん:2007/02/26(月) 15:46:32 ID:???
>>187
あ、抜け落ちてるみたいですが
\\n これででるかな(改行)
をつけ、最後のprint には 連続改行をいれております
もうしわけありません
189nobodyさん:2007/02/26(月) 15:47:39 ID:???
あやしい・・・
190nobodyさん:2007/02/26(月) 15:51:58 ID:???
print "\n";
191nobodyさん:2007/02/26(月) 15:53:52 ID:???
普通に出るじゃん・・・
192nobodyさん:2007/02/26(月) 15:54:29 ID: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 ・・・・

というような出力になってしまいます。

193nobodyさん:2007/02/26(月) 15:58:00 ID:???
・・・申し訳ありませんorz

ソースを見返したら、先頭に
print "Content-type: text/html\n\n";

の一行が入っていました
大変お騒がせいたしました。
申し訳ありませんでした・・・・
194nobodyさん:2007/02/26(月) 17:18:08 ID:???
あるあるww
195nobodyさん:2007/02/27(火) 22:15:55 ID:LieiSn0N
すいません、ちょっと質問です。
perl から Windows アプリケーションを制御したいんですが、
そういうモジュールはありませんか?

たとえば、アプリケーションを起動したのち、
Alt-F でファイルメニューを開いて・・・とか、
アプリケーションを perl スクリプトで操作したいのです。

いや、コマンドラインで制御できるとよいのですが、
コマンドラインの引数を解釈してくれないアプリなのです。
196nobodyさん:2007/02/28(水) 01:50:24 ID:???
何の引数なら解釈してくれるんだよ・・・
197nobodyさん:2007/02/28(水) 02:21:12 ID:???
hoge.exe foo.txt
とかで自動的にfoo.txtを読み込んでくれないよーなアプリってことかな。
198nobodyさん:2007/02/28(水) 06:08:06 ID:???
perlスクリプト(*.pls)とwshを使えばできるんじゃね?

そんなことをするなら最初からJScriptやVBScriptでやったほうが楽だけど。
199nobodyさん:2007/02/28(水) 06:32:17 ID:wbAOzWAx
$commment 中の(英)単語の出現回数を数えたいです。

中身は aaaaa bbbb ccc ddd adwg
なら、5となります.重複は考えなくもいいです。半角英文字です

どのようにすればよいでしょうか? (*- -)(*_ _)ペコリ
200nobodyさん:2007/02/28(水) 08:41:36 ID:???
>>199
\sでスプリット
201nobodyさん:2007/02/28(水) 08:41:36 ID:???
$count = 0;
while($comment =~ /([a-z0-9']+)/gi) #英単語数のカウント
{
$count++;
if($count > 10000){last;} #無限ループ対策
}
202199:2007/02/28(水) 09:06:30 ID:???
(*- -)(*_ _)ペコリ

 最近、乱打無な栄単語を打ち込むスパマーやろうがいまして。。
ありがとうございます
203nobodyさん:2007/02/28(水) 12:37:25 ID:???
>>1ぐらい読もうな
204nobodyさん:2007/02/28(水) 12:51:40 ID:???
>>202
>>201を使うな。
>>200を使え。
205200:2007/02/28(水) 14:36:28 ID:???
>>202
日本語、英文字混在ですか
そういうことなら使えないな
206nobodyさん:2007/02/28(水) 15:34:08 ID:BEaWUL0P
javascriptを読める(じっこうできる)クローラーをつくりたいです。
今はwgetをひたすら呼んでました。javascriptのページはよめないです。
CPAN探したのですが、LWPってので、できるのかはっきりしませんでした。
207nobodyさん:2007/02/28(水) 15:40:23 ID:???
実行できないんじゃなくて、外部jsファイルを読み込めてないのでは?
208nobodyさん:2007/02/28(水) 19:43:20 ID:Oefi/gxX
>>196 さん
とりあえず試したところでは、第一引数を「ファイルー開く」の入力としては解釈するようです。
その他のコマンドラインオプションは皆無。
アプリは「英和翻訳ソフト」です。
特殊辞書を使う翻訳なのと、翻訳内容が極秘なんで excite.co.jp 等は使いたくないのです。

>>198
WSH でぐぐった所、これですよ! ありがとうございました。
209nobodyさん:2007/03/01(木) 12:17:01 ID:???
リファラの解析などをPerlの勉強でしているのですが、
一部の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が続く

と上記のような冗長なコードになったのですが、
もっといい方法などありましたら御教示お願いします。
210nobodyさん:2007/03/01(木) 13:02:53 ID:???
>>209
あんまり変わらないかもしれないけど・・

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;


もっとスマートな方法あるんだろうけど漏れにはこれが限界..
211nobodyさん:2007/03/01(木) 13:13:18 ID:???
携帯サイト用に簡易データベースを作成しているんですが、
auで動作不良があるんです。
まずは簡単に状況説明します。

◎検索ページ(フォーム入力後動作)
 →検索条件をフォームで入力後、サブミット
 →検索結果のページが表示されずエラーメッセージが出る
◎表示データを一定数で区切って次ページに行く(フォーム入力後動作)
 →プルダウンで飛ぶ先のページ数を選択後、サブミット
 →ページが表示されずエラーメッセージが出る

エラーメッセージは共通で以下の通りです。
---------------------------------------------
cgi-lib.pl:Unknown Content-type:application/
x-www-form-urlencorded; charset=shift_jis
---------------------------------------------

なんだろう。docomoは何ともないんだけれど。
212209:2007/03/01(木) 13:23:34 ID:???
>>210
すんませんw 一行プログラミングのように単に短くしたいって意味ではなかったです。

解析部分を関数で別ファイルにする予定なので、
elsif行が続くのは別にいい(しょうがない)と思ってるのですが、
Perl歴が少ないので処理方法自体には問題ないか不安です
213nobodyさん:2007/03/01(木) 13:52:05 ID:???
>>211
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だから一致しなくてエラーになってるんだと思う・・たぶん..
214211:2007/03/01(木) 15:30:30 ID:???
>>213
ありがとうです! 自分もぐぐってみて、
”cgi-lib.plがエージェントのうちCHARSETに対応していない”とかなんとか、
81行目までは見当を付けられたんですが、具体的な書き換え記述が見あたらなくて参ってました。
まず213さんの書き換えで試してみます。
AU手元にないんで、確認後結果報告に参ります。
215 ◆TWARamEjuA :2007/03/01(木) 21:29:21 ID:??? BE:3485748-2BP(6811)
>>209
ようするに、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;
}
216nobodyさん:2007/03/02(金) 00:28:43 ID:???
質問です。
Net::telnetモジュールを利用し、サーバーへTelnet接続し
取得したデータをhtmlで返すCGIをコーディングしています。
telnetログインする側のサーバのレスポンスが遅い為、一度に
複数のコネクションを確立し、接続した全てのサーバへリクエストを
投げて応答を待つシステムを構築したいのですが方法がわかりません。
現在は単一のサーバに対してアクセスを実施し(timeout->120程度)
forループで順次接続しなおす構成になっています。
なにか良い方法があれば是非ご教示下さい。
217nobodyさん:2007/03/02(金) 02:51:40 ID:???
fork or thread
218nobodyさん:2007/03/02(金) 11:40:00 ID:???
> ◆TWARamEjuA

とりあえず糞トリ目障り
219nobodyさん:2007/03/02(金) 13:00:32 ID:???
>>218
目障りなら NG ネームに指定すればいいでしょ
トリップ無しだと NG 指定することができないから、余計目障りだよ?
220nobodyさん:2007/03/02(金) 13:19:36 ID:???
もうずっと前から居るから諦めてる
221nobodyさん:2007/03/02(金) 16:33:38 ID:ShHoFtwt
半角数字で挟まれた「x(半角エックス)」を「×(かける)」に
変換したいのでですがうまくいきません。
例えば「12x20」を「12×20」にする、といった感じです。
当然ですが、
s/\d+x+\d/\d+×+\d/
では無理でした・・・。
どなたかアドバイスお願いします。
222nobodyさん:2007/03/02(金) 16:36:16 ID:???
>>221
カッコ使え。
223nobodyさん:2007/03/02(金) 16:50:46 ID:ShHoFtwt
>>222
即レスありがとうございます。
カッコでグループ化したものを呼び出せるんですね。
s/(\d)+x+(\d)/\1×\2/
ということでしょうか。
ただ、これだと
「12x20」が「2×20」になってしまいました。
\dは数字1文字のはずなのになぜ??
224nobodyさん:2007/03/02(金) 17:18:44 ID:???
s/(¥d)x(¥d)/$1×$2/
としてないのはなぜ?
225nobodyさん:2007/03/02(金) 17:19:51 ID:???
>>223
+の意味を勘違いしてるんじゃない
226nobodyさん:2007/03/02(金) 17:22:59 ID:???
(¥d)+はたぶん(¥d+)を意図してるんだろうけど、
前後の数字だけ保存すればいいんだから(¥d)x(¥d)で十分。

xにも+が付いてるあたり、理解が怪しくはある。
227221:2007/03/02(金) 17:36:02 ID:???
みなさんありがとうございます。
225さん、226さんがご指摘の通り、
「+」の意味を間違えて捉えていました・・・。
自分がやりたかったkとは(\d)x(\d)でした。
224さんの方法でもできました。
正規表現の外で呼び出すことはないので、
s/(\d)x(\d)/\1×\2/
を使おうと思います。

レスを下さった方、親切に教えて下さり本当にありがとうございました。
とても勉強になりました。
228nobodyさん:2007/03/02(金) 18:32:23 ID:5GKaYECY
cgiを独学でスタートした初心者ですが、if else の処理方法でつまずいています。
トップページから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; }
229nobodyさん:2007/03/02(金) 18:52:39 ID:???
>>228
>>1を読んでちょ

print "Content-type: text/html; charset=EUC-JP;\n\n";
を条件文の前にしてみたらどうかな
230nobodyさん:2007/03/02(金) 19:50:22 ID:5GKaYECY
>>228
index.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の内容を表示させるためには、
何が足らないのか、間違っているのかわからない状況です。
231nobodyさん:2007/03/02(金) 19:55:29 ID:???
えーっと
フォームの内容はどこかで取得してるのかな?
232nobodyさん:2007/03/02(金) 20:31:35 ID:???
$lang eq "ja" ⇒ $ENV{QUERY_STRING}=~/\bja\b/
233nobodyさん:2007/03/02(金) 22:29:38 ID:???
「Perlについての質問箱 29箱目」からの移動です。
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/&/&amp;/g;
$print_path =~ s/>/&gt;/g;
$print_path =~ s/</&lt;/g;
$print_path =~ s/"/&quot;/g;
$print_path =~ s/'/&#39;/g;
print $print_path;
234nobodyさん:2007/03/02(金) 23:07:02 ID:???
そもそも $lang に値が入っていない
#!/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 "英語訳ページ"; }
235nobodyさん:2007/03/02(金) 23:44:30 ID:???
($n, $v) = split(/,/, $line);
$hash{$n} = $v;

のようなことをよくやるのですが、
もっとスマートィな書き方はないでしょうか?
236nobodyさん:2007/03/02(金) 23:57:38 ID:???
ハッシュにリストを代入するとキーと値が交互に並ぶと解釈される
リストは1次元に展開されてしまう
の2つを利用して、
%hash = (%hash, split(/,/, $line))
でいいのかな。
237nobodyさん:2007/03/03(土) 00:20:36 ID:???
>>236
全く思いもよりませんでした。素晴らしいです!
ありがとうございます。
238nobodyさん:2007/03/03(土) 00:24:52 ID:???
>>236-237
ループの中で繰り返しやってる場合、ハッシュを作っては捨て
作っては捨てになるから、splitの結果だけテンポラリなリスト
にpushしていって、最後にハッシュ化したほうがいいかも。
239235:2007/03/03(土) 00:32:13 ID:???
>>238
図星ですね・・・ギンギンのループですw
ハッシュ生成ってヘビーなんですね。
thanks
240nobodyさん:2007/03/03(土) 11:39:50 ID:???
>>215
ありがとうございます。遅くなって申し訳ないです。

色々読んで、myでローカル変数化する
ハッシュに対応するkeyとvalueを代入して、forでループさせてlastで終了
とかは理解できたのですが、
next ifの行で比較している $[ - 1 は数値でしょうか?

あとは他にもこういうループで
foreach $key ( keys %hash ) や while ( ($key, $value) = each(%hash) )
などの方法がありますが、どれが適してますでしょうか?
241nobodyさん:2007/03/03(土) 11:51:27 ID:???
$[ - 1の $[ は配列の最初の要素の添え字。
indexは見つからなかった場合に $[ より1小さい値を返す。

普通は $[ = 0; した状態だが、世の中には $[ = 1; としている人もいる。
$[ - 1 と書いてあれば両対応できる。

eachで返される値は制御が出来ないけど、keysでキーを取ってくるなら
sortするなどの制御が可能。
それ以外はここではfor keysでもwhile eachでもあんまり変わらん。
242nobodyさん:2007/03/03(土) 12:30:09 ID:???
>>233
CGI::escapeHTMLを使わないのは何故?
243240:2007/03/03(土) 12:33:09 ID:???
>>241
ありがとうございます。
$[ は検索できず困ってたのですが、おかげさまで何となく分かりました。

ttp://www.rfs.jp/sb/perl/02/05.html
ハッシュのループ方法に関しては↑などを見たのですが、
DBでORDER BYを使い、順序も正確に欲しい場合はどうすればよいでしょうか?

今回の場合は、訪問が多いリファラを最初に比較したほうがループを少なくできるのですが
244240:2007/03/03(土) 13:31:13 ID:???
ハッシュだと順序が分からないのと、同じキーの時に困るような気がするので、
下記のような感じにしてみましたが、これは変だという箇所ありますでしょうか?

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;
}
245233:2007/03/03(土) 14:28:59 ID:???
>>242
こんな便利なものがあったとは知りませんでした(勉強不足)。
ありがとうございました。
246 ◆TWARamEjuA :2007/03/03(土) 14:53:59 ID:??? BE:4356858-2BP(6811)
>>243
→今回の場合は、訪問が多いリファラを最初に比較したほうがループを少なくできるのですが
多い少ないが判っているようでしたら優先順位を付与してあげると良いかもですね♪

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;
}

そろそろ頭の中がこんがらがってきました(哀)
247nobodyさん:2007/03/03(土) 14:59:57 ID:???
$[がいまいち判らないので誰か教えてくり。
1) $[は@hogeの時の$hoge[0]?
2) それとも0?別の例だと$hoge[9]だった場合の9?
3) もしくは配列が@mage = (undef,undef,222,undef,444,);の場合の$mage[2]になる?
  (こんな風に配列にundef入れた事無いから、そもそもやっていいのかさえわからないけどw)

調べてみたけど、ろくに検索に引っかからないから厳しいわ。
248nobodyさん:2007/03/03(土) 15:30:11 ID:???
>>246
それだとGoogleが分かれてしまうのと、後でパターンを増やすのが面倒なので×
処理速度も遅そうかな

( index() != $[ - 1 )  と  ( index() < 0 ) は等価じゃないの?
249nobodyさん:2007/03/03(土) 16:21:57 ID:???
>>247
$[は、リストの先頭の要素を指すために使う「添え字の値」。

$[ = 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
で調べました。
250nobodyさん:2007/03/03(土) 16:35:41 ID:???
なるほど。
$[ は配列の先頭の添え字を何にするか決めているってことですね?
デフォルトは通常 0 と。
251nobodyさん:2007/03/03(土) 16:46:46 ID:???
こういう検索できない単語を調べたい時、手元に本があると便利だよ。
perldoc perlvar でもいいけど。
252 ◆TWARamEjuA :2007/03/03(土) 17:12:05 ID:??? BE:2941439-2BP(6811)
>>248
重複させないようにとなると、DB_FileあたりのR_DUPが必要になるかなぁと。
あと、頻度が多い順っていう優先順位を付けることで処理速度の低下を余計なループを減らす方向で防いでみようと思ったものでして。
このあたりは実際に回してみてベンチなりを取ってみなきゃですね。

ってことでこの辺りの手法はRock54回路でも悩んでいたりしました。
253nobodyさん:2007/03/03(土) 18:16:00 ID:???
>>252
うーん、わざわざプライオリティのフィールド作るより
ハッシュじゃなく配列で先頭から頻度順に並べて処理じゃスマートじゃないかな?
254nobodyさん:2007/03/03(土) 20:32:39 ID:???
要は>>210がいいってこと?
255244:2007/03/03(土) 20:39:49 ID:???
>>244のはどうでしょうか
256nobodyさん:2007/03/03(土) 20:54:36 ID:???
>>249
判りやすい説明サンクス!
やっと理解できたよ。
257nobodyさん:2007/03/03(土) 20:59:50 ID:???
>>255
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;
}
258nobodyさん:2007/03/04(日) 01:36:11 ID:???
URLキーにすればいいかも ><
259nobodyさん:2007/03/04(日) 12:19:16 ID:???
>>244
>>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};
}
260nobodyさん:2007/03/04(日) 13:41:29 ID:Zr7BSS6Z
だったら、これはどうよ。原始的だがテーブルを持たなくていいぞ。
my $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];
}
261nobodyさん:2007/03/04(日) 13:44:51 ID:Zr7BSS6Z
>>260
しまった、
'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];
}


262nobodyさん:2007/03/04(日) 18:25:42 ID:hNT7iFvK
スレ違いだったらすいません。

http://abc/abc.cgi?a=10&b=20&c=30
みたいな感じでリンクした先のページが、au携帯だけうまく表示されません。
PCやドコモ携帯はちゃんと表示されるのですが、auは特殊な仕様なのでしょうか?
263nobodyさん:2007/03/04(日) 18:47:16 ID:???
264216:2007/03/04(日) 21:04:47 ID:cYBOup8B
>>216ですが、どなたかアドバイス下さい。
265nobodyさん:2007/03/04(日) 21:16:10 ID:???
>>264
あたまのほうよろしかったでしゅか?
266nobodyさん:2007/03/05(月) 09:19:57 ID:???
大手で配布されている CGI のリンク処理についての質問です。

ソースはこんな感じです。

$message =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<a href="$2" rel="nofollow">$2<\/a>/g;

(質問1)
([^=^\"]|^) についてです。
前者の ^ は 「を含まない」 を意味し、後者の ^ は行の先頭を意味するものだと思います。
(ただ、1行ずつ処理しているわけではなく $message には記事の全てが入っているので、記事の最初という意味になります。)
そして、[^=^\"] の 2番目の ^ は、単なる リテラル(普通の文字) として扱われますよね。
これは、'=' と '^' と '"' を含んでいないという意味になるはずですが、記事の最初に '=' とかがあったとしても、
正しくリンク処理されます。
これは何故でしょうか?

(質問2)
Firefox だと 長いURLが折り返されないので、URL が 81文字以上になった場合に、
$2 の部分を80文字 + "..." に省略したいと考えています。
このような場合には、どのように改造すれば良いでしょうか?

ご教示いただけると幸いです。
267nobodyさん:2007/03/05(月) 09:58:22 ID:???
質問1に関して、、、
@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";
}
268nobodyさん:2007/03/05(月) 10:17:11 ID:???
>>266
> 質問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;

にするかなぁ
269266:2007/03/05(月) 10:19:40 ID:???
>>267
回答ありがとうございます。
いろいろいれて試してみます。

とりあえず、最初から 267 さんがいれていた2つのものは、両方ともリンクになっていました。
"=http://www.example.com/" はリンクにはならず、"=\nhttp://www.example.com/" はリンクになりました。
改行記号が入ると、別物として処理してるのかなー。

270266:2007/03/05(月) 10:23:14 ID:???
>>268

> 「記事の最初」がどこを指しているのかよくわからないけど、
> URL の直前が行頭か '=' '^' '"' 以外ならマッチする。

なるほど。
納得しました。

正規表現の最初に "^" が来ると、$message の最初という意味になりますが、 "[" が入ったあとだとそれとは無関係になるんですね。
そして、([^=^\"]|^) とあるので、 = や " 以外の次に http … がマッチするということになるわけですか。

質問2についての回答は非常にためになりました。
ありがとうございました。
271nobodyさん:2007/03/06(火) 09:39:12 ID:???
ランダムに「数値.dat」の形式のファイルを一つ展開したいのですが、

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を与え、存在しているかを探す



何か根本的に勘違いしてますでしょうか?
スマートなやり方など御座いましたらお教え下さい。
272nobodyさん:2007/03/06(火) 09:53:26 ID:???
>・その$foo.datが存在すれば、展開
>・$foo.datが存在しない限り、ランダムで$fooを与え、存在しているかを探す

どうみてもそういう風に書いているようには見えないのだが。

実際には

$foo.dat が存在してサイズが0であればランダムで$foo取り直して繰り返し。
存在してサイズが0でなければなんか処理
存在しなければなにもせずに終わり

になっている。
273nobodyさん:2007/03/06(火) 09:57:46 ID:???
間違い。なんかぼけていた。

$foo.dat が存在してサイズが0であれば(-z なら -eも自動的に成立するので)
そのファイルを開いてなんかする。そして$fooをランダムにとりなおして繰り返し。

$foo.dat が存在しないかサイズが0以外なら終了
274nobodyさん:2007/03/06(火) 10:55:03 ID:???
>>271
ファイルが存在しないかサイズが1以上のファイルが存在して、終了しているだけだろ。
あと、ここはwebprog板なので排他制御を行わないと落第。
275nobodyさん:2007/03/06(火) 14:03:48 ID:???
「*****秒はX時間XX分です」のような変換したいです。

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);
}
276nobodyさん:2007/03/06(火) 14:11:06 ID:???
追記です。$jikanに入る秒数は必ず60で割り切れるものです。
277nobodyさん:2007/03/06(火) 14:20:15 ID:???
>>275
$restはマイナスでも真じゃないかね?

localtimeは使いたくないの?

$h = int( $rest / 3600 );
$m = int( ( $rest % 3600 ) / 60 );
でいいような気もする
278nobodyさん:2007/03/06(火) 14:40:05 ID:???
どうもです。

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]って挙動が違うのですか?
279nobodyさん:2007/03/06(火) 14:50:16 ID:???
>> $_と$_[0]って挙動が違うのですか?
まったく別のものです。$_[0]は配列@_の0番目の要素。
280nobodyさん:2007/03/06(火) 14:54:16 ID:???
「perl 特殊変数」でぐぐるといいよ
あとlocaltimeについてもぐぐってみ
281 ◆TWARamEjuA :2007/03/06(火) 20:37:58 ID:??? BE:7841298-2BP(6811)
>>271
先に「数値.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;
282nobodyさん:2007/03/07(水) 15:28:55 ID:JqPAOgE9
 my $flag=0;
 foreach my $tmp (@array) {
  if( $tmp eq 'P' ) { $flag = 1;last;}
 }
 if($flag) { print 'GA!' }
↑の文を↓のように1〜2行に収める事はできないでしょうか?
 if( xxxxxxxx ) { print 'GA!' }
やりたい事は配列の中に任意のデータの有無をチェックしたいのです。
(配列の中身はデータが重複してない事が前提)
できれば、見つかった場合の要素数もわかるとありがたいです。
283nobodyさん:2007/03/07(水) 15:54:12 ID:???
>>282
つgrep

>(配列の中身はデータが重複してない事が前提)
>できれば、見つかった場合の要素数もわかるとありがたいです。

要素が重複してないのなら見つかった場合の要素数は必ず1だと思うのだが...
284nobodyさん:2007/03/07(水) 15:58:54 ID:???
>>283
grepという事は
if(grep(/P/, @array)) { print 'GA!' }
という感じでしょうか?
要素数というのは、配列の何番目の要素か?という事です。
285nobodyさん:2007/03/07(水) 16:11:20 ID:???
RubyやPythonだとindexでできるけど、Perlのindexは文字列専用だな。
同等のsubを自前で定義する方向で。
286nobodyさん:2007/03/07(水) 16:17:35 ID:???
>>284
いやそれ「要素数」とは言わないし。

if (($index)=grep {$array[$_] eq 'P'} 0..$#array) { print "GA! at $index" }
287nobodyさん:2007/03/07(水) 16:23:44 ID:???
>>284
List::MoreUtilsのfirst_index
288nobodyさん:2007/03/08(木) 04:27:59 ID:???
use CGI;
$query = new CGI;
とすると、止まってしまいます。
解決方法をお願いします。

XPのIISでCGIとして動かしています。
Active Perl 5.8.7を使ってます。
289nobodyさん:2007/03/08(木) 07:06:50 ID:???
まずエラーログを確認して>>1にのっとって質問するのがよりよい手順だろうな
290nobodyさん:2007/03/08(木) 15:02:49 ID:???
INPUTフォームに漢字の熟語を入力させたいのですが
記号やひらがななどを入力する人がいるので、JIS漢字以外の文字が
入力されたらエラーを表示したいのですがどうすればいいでしょうか
291nobodyさん:2007/03/08(木) 16:05:39 ID:???
>>290
>>1
> 1: 自分はこういう事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
1はわかったから2と3を書いてくれる?
292nobodyさん:2007/03/08(木) 16:12:32 ID:???
亜-煕はJIS漢字なので、やはり全ての漢字にしようと思い
m/[一-龠]/で試したのですがいくつかの記号が漏れてしまいます。
293nobodyさん:2007/03/08(木) 16:54:41 ID:???
入力文字はどういうコードなんだろうな。
その順序とJISの並びは同じなのかな。
294nobodyさん:2007/03/08(木) 16:54:42 ID:???
Unicode
InCJKUnifiedIdeographs
とかで検索すると幸せになれる
295nobodyさん:2007/03/09(金) 02:16:19 ID:???
仕事でテキスト加工するためにperlを使っています。
レベルは正規表現、ハッシュ、リファレンス等テキスト加工に必要な事は出来ますが
Webからの情報入手、Webへの出力などは未経験という感じです。

そこで、せっかくperlを使ってるならとCGIを勉強しようと思い、
まずはテキスト処理がメインになりそうな2chのスレッド検索CGIでも作ろうと考えています。

素人考えでWebページからテキストを配列に渡せれば、あとはテキスト処理なんでそこそこ簡単かなと
考えていますがこれって結構難しいのでしょうか。

また、どこかに勉強になるサイト何かあったら教えてください。
296nobodyさん:2007/03/09(金) 02:51:20 ID:???
297nobodyさん:2007/03/09(金) 02:52:35 ID:???
> 仕事でテキスト加工するためにperlを使っています。

無理しないで辞表を出すってのも手じゃね?w
298nobodyさん:2007/03/09(金) 14:56:13 ID:???
perlであるファイルの作成日を調べるにはどうすればいいですか?
statだとアクセス日と更新日しか調べられないみたいなのでorz
299nobodyさん:2007/03/09(金) 15:24:43 ID:???
ってstatで調べられますね、失礼しました。
300nobodyさん:2007/03/09(金) 15:35:38 ID:???
ctimeは正確にはファイル作成日じゃねーけど
301nobodyさん:2007/03/09(金) 15:43:22 ID:???
windowsは知らんがunixではそもそもファイルシステムにファイル作成日の
記録がないのが普通なのでとりようがないはず。

ctimeで代用するのは、ctimeが更新されることは比較的少ないのでファイル
作成のときのままになってることが多いからってだけで確実ではない。
ファイルの所有者やパーミッション変えると更新だっけ。

302nobodyさん:2007/03/09(金) 19:01:53 ID:???
mvでも変わったハズ
303nobodyさん:2007/03/09(金) 19:24:27 ID:???
変わんねーよ。
304nobodyさん:2007/03/09(金) 19:27:39 ID:???
かわるじゃん
305nobodyさん:2007/03/09(金) 19:34:06 ID:???
手元のlinuxではかわるね。

% 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
306nobodyさん:2007/03/09(金) 19:36:05 ID:???
変わってねーじゃん松井
307nobodyさん:2007/03/09(金) 19:42:20 ID:???
> Change: 2007-03-09 19:31:39.000000000 +0900
> Change: 2007-03-09 19:31:45.000000000 +0900

どこ見てんだよ。変ってるだろ。
308nobodyさん:2007/03/09(金) 19:45:05 ID:???
変わってるじゃん松井
309nobodyさん:2007/03/09(金) 19:56:17 ID:???
ファイルの属性が変われば変わるってことか。
cp -pでもctimeは変わるんだろうな。
310295:2007/03/09(金) 23:53:38 ID:???
>>296
ありがとうございます。
調べてみたいと思います。
311nobodyさん:2007/03/10(土) 01:34:17 ID:???
>>305
Access … アクセス
Change … 変更

は分かるけど、「Modify」 って何だろう。

http://dictionary.goo.ne.jp/search.php?MT=Modify&kind=ej&from=Mozilla/Firefox
312nobodyさん:2007/03/10(土) 02:29:19 ID:???
>>311
<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>
313311:2007/03/10(土) 02:50:41 ID:???
>>312
なるほど。

Access: 最終アクセス時刻: 最後にファイルにアクセス (開くなど) した時刻
Modify: 最終修正時刻: 最後にファイルを修正 (中身の書き換え) をした時刻
Change: 最終状態変更時刻: 最後にファイルのパーミッション等の状態を変更した時刻

いうことか…。

ありがとう。
314nobodyさん:2007/03/10(土) 04:43:30 ID:???
まだperl初心者って居るんだな
315nobodyさん:2007/03/10(土) 06:39:28 ID:???
↑と初心者を見下して悦に浸る自称上級者
316nobodyさん:2007/03/10(土) 06:54:02 ID:???
単に新規学習者がいるのか、と言ってるようだが
まあどうでもいいや
317nobodyさん:2007/03/10(土) 22:04:20 ID:???
http://www.yumemaboroshi.net/cgi/us-re-detail1.php?mode=sample&s01=3418&hash=c18f1e8c558639207b03c83bb64cc769
このCGIを設置してみたのですが
http://dioaerts.hp.infoseek.co.jp/cgi-bin/wakuwaku.htm
http://dioaerts.hp.infoseek.co.jp/cgi-bin/wakuwaku.csv

このように検索されるものと検索されないものがあります
どうしてだか教えてください
318nobodyさん:2007/03/10(土) 22:25:34 ID:???
あ、最後にコンマがはいってなかったんですね。
自己解決しました吸いませんでした
319nobodyさん:2007/03/11(日) 11:00:28 ID:???
>>315
いや、別に悦にはひたらないが、これからPerlなんか学んでどうするんだろうなとね
320nobodyさん:2007/03/11(日) 11:29:14 ID:???
> いや、別に悦にはひたらないが、これからPerlなんか学んでどうするんだろうなとね

これから学ぶなら何がよいのかね?
321nobodyさん:2007/03/11(日) 12:02:16 ID:SYPe8N9h
>>320
Python.
322nobodyさん:2007/03/11(日) 13:11:23 ID:???
PerlやってるとRubyはすぐ覚えるよ。
初めからRubyでもいいかもしれないけど、ウェブアプリとかちょっとしたツールを作るスクリプト言語にオブジェクト指向の必要性は感じない。
それ以外の分野ならJavaとかCになるだろうし。
323nobodyさん:2007/03/11(日) 14:05:33 ID:???
言語に拘る奴は
何をやらせても低脳
324nobodyさん:2007/03/11(日) 15:05:02 ID:???
Rubyは遅いのがなぁ。
325nobodyさん:2007/03/11(日) 16:45:41 ID:???
別にrubyでもpythonでも良いが、片手間処理用の言語は何か軽くでも使えるようになってればメリット大。
JavaやC++のような重量級言語以外に、ね。
326nobodyさん:2007/03/11(日) 17:00:00 ID:t1Paw2Qe
はじめまして。何をやってもわからないので質問させてください。
print "<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() ; }
としてもひっかかってくれません。。なぜかわからないでしょうか・・
327nobodyさん:2007/03/11(日) 17:01:08 ID:t1Paw2Qe
分解してるところは

sub 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 ;
}
}

になっています。
328nobodyさん:2007/03/11(日) 17:22:11 ID:???
いまどきそんなの自分で書かないだろ。use CGIしろ。
329nobodyさん:2007/03/11(日) 17:35:20 ID:???
昔は自作関数とか作ったりしてたが、
PHPとかもやってると$_GET['page']ってやりたくなるよな

>>327
cgi-lib.plをrequireして&ReadParse;とかでもOK
330nobodyさん:2007/03/11(日) 21:49:08 ID:???
cgi-lib.pl とか、いつの時代の化石だよw
331nobodyさん:2007/03/12(月) 02:10:14 ID:???
そんな化石でも素人がデコード用の手続きを書くよりマシ。
332nobodyさん:2007/03/12(月) 11:05:45 ID:???
自分でそこ書く経験って大事だと思うけど。

>>326
まず$form{'page'}をprintしてみては?ちゃんと入ってる?
333nobodyさん:2007/03/12(月) 14:21:21 ID:???
>>330
cgi-libのほうがシンプルで速い(軽い)ってメリットもあるんじゃね
334nobodyさん:2007/03/12(月) 21:46:55 ID:???
CGI.pmって重いの?
どんなデメリットあるんだろう・・
335nobodyさん:2007/03/12(月) 22:41:31 ID:???
今のマシンでならたいした差なんてないよ。
古いコードの保守ならともかく、これから新規で書くんならCGI.pmがオススメ
336nobodyさん:2007/03/12(月) 23:33:07 ID:???
たしかに重いよな なんでわざわざこんなに重くつくったんだろう。。
337nobodyさん:2007/03/12(月) 23:59:28 ID:???
いまどきCatalyst+TTが普通なのでCGI.pmなんて軽いほう。
338nobodyさん:2007/03/13(火) 00:12:24 ID:???
Cat+DBIC+TTぐらい普通だからな。
339nobodyさん:2007/03/13(火) 00:12:38 ID:???
どうせクエリのパースくらいしか使わないんだったら
CGI::Minimalあたり使ってろよ
340nobodyさん:2007/03/13(火) 00:37:46 ID:7SHHDDju
CDBIで論理削除って表現できる?
色々調べたけどお手上げ…
341nobodyさん:2007/03/13(火) 00:43:35 ID:???
CGI::Lite
342nobodyさん:2007/03/13(火) 00:59:27 ID:???
>>340
単純なテーブルならデータにdel_flgとか持たせとくとか
別にテーブル作ってIDとdel_flgで状態を管理とか
343nobodyさん:2007/03/13(火) 01:21:54 ID:7SHHDDju
>>342
package 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

には生きているデータだけ持ってきたいのだけど…
344nobodyさん:2007/03/13(火) 01:27:58 ID:7SHHDDju
>>343
package Group;
__PACKAGE__->columns(Primary => qw/id/)
__PACKAGE__->columns(Others => qw/name item del_flag/);
・・・
でした。因みに出力はTTです。
345nobodyさん:2007/03/13(火) 01:31:58 ID:7SHHDDju
@data = Item->search_like(name => 'pc', del_flag=>0);
とかだと、Itemの削除したものはあがってこないが、
Groupの方は関係ないから普通に拾ってきてしまうのよね…

>>342 <早速のレスありがとうございます。
346nobodyさん:2007/03/13(火) 04:25:58 ID:???
今時は DBIC じゃね?
347nobodyさん:2007/03/13(火) 07:08:26 ID:???
DBICだと簡単?
348nobodyさん:2007/03/13(火) 10:54:37 ID:???
やることはDBICも一緒
349nobodyさん:2007/03/13(火) 12:59:08 ID:RaCGoxpM
今、掲示板を改造してんだけど
$in{'name'}ってのを$in{'$rand'}ってやって乱数にしたいんだけど
どうやってやればいいんでしょうか?
ちなみに$randは乱数です。
350nobodyさん:2007/03/13(火) 13:14:50 ID:???
$rand = sprintf( "%04d", int( rand( 9999 )));
$in{$rand} = 'hogehoge';
351nobodyさん:2007/03/13(火) 13:20:42 ID:RaCGoxpM
>>350
動きません・・・・
352nobodyさん:2007/03/13(火) 13:26:14 ID:RaCGoxpM
すみません、詳しく書きます。

<input type=text name="OMbqcVSSOZkugP167bljsl3zHt5uVk" size=28 value="">
書き込みのフォームがこんな感じになっていて、name"$rand"ってなっています。
ですが$in{'name'}を$in{'$rand'}にしても書込みをさせてくれません・・・。
どうすればできますでしょうか?
353nobodyさん:2007/03/13(火) 13:28:17 ID:???
%inってたぶんフォームから受け取ったデータなんだろうけど、そのキーを乱数にしたいっていったどういうシチュエーションなんだろうか
354nobodyさん:2007/03/13(火) 13:30:12 ID:???
$in{$rand}

$randにしかるべき文字列が設定されているのが前提だが。
355nobodyさん:2007/03/13(火) 13:34:38 ID:RaCGoxpM
荒らし対策でname="name"って書いてある部分を乱数にかえたいと思ってます。
ですが$in{$rand}ってやっても全然書き込み出来ません・・・。
356nobodyさん:2007/03/13(火) 13:41:49 ID:???
思うにform出力するときと書き込みのときで$randに別の値が入ってるんじゃないか
357nobodyさん:2007/03/13(火) 13:42:19 ID:RaCGoxpM
ではどうすれば同じに出来ますか?
358nobodyさん:2007/03/13(火) 13:43:39 ID:???
乱数じゃなくていいだろ
359nobodyさん:2007/03/13(火) 13:46:07 ID:RaCGoxpM
乱数の方がいいんです・・・
360nobodyさん:2007/03/13(火) 14:05:26 ID:???
スカラー変数の中身に入っている文字列に、右から等間隔で記号を挿入したいんです。
たとえば、$i に 1234567890 が入っていたら、 1A234A567A890 とか、1 234 567 890 といった感じです
いい方法あったら教えてもらえませんか?
361nobodyさん:2007/03/13(火) 14:05:53 ID:???
ロジックは自分で考えろ
コーディングでエラーが出たら質問するといい
362nobodyさん:2007/03/13(火) 14:06:49 ID:???
>>360
日本語含む?
363nobodyさん:2007/03/13(火) 14:10:45 ID:???
>>362
含みません。スペースやタブといった空白文字も含みません。
364nobodyさん:2007/03/13(火) 14:11:09 ID:???
複数のcookieを書き込もうとしているのですが

@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には正しく値が入っています)
365nobodyさん:2007/03/13(火) 14:11:18 ID:???
>>360 数値の3桁コンマ区切りなどで検索すればいい。
366nobodyさん:2007/03/13(火) 14:12:24 ID:???
1 while s/(.*\d)(\d\d\d)/$1,$2/g;
367nobodyさん:2007/03/13(火) 14:16:18 ID:???
>>365-366
ありがとうございました、参考にしながら、自分でも調べてみます。
368nobodyさん:2007/03/13(火) 15:39:13 ID:???
スレッド式の掲示板を作っているのですが、
「スレッド一覧を表示する」のと、「1スレッドの投稿内容を表示する」のは、
別々のcgiで分けた方が良いのでしょうか?それとも一つのcgiファイルで
場合分けした方が良いのでしょうか。
この様な掲示板を作ったことがない素人なので、かなり迷っています。
普通は分けるもんなんでしょうか?
369nobodyさん:2007/03/13(火) 15:52:30 ID:???
普通とか無いから。
フリーで配布してるやつの中身見てみたら?
コーディングスタイルはおすすめできないけど。
370nobodyさん:2007/03/13(火) 16:00:28 ID:???
普通というか、cgiファイルを分散させればそれだけ負荷がかからない(プロセスが滞らない)
と思ったんですが、どうなんでしょうか。
371nobodyさん:2007/03/13(火) 16:12:51 ID:???
負荷を気にするほど重いんならmod_perlなりfastcgiなりにいくべきではないか。
372nobodyさん:2007/03/13(火) 16:41:42 ID:???
1ファイルで分岐させて処理を分けるか
複数ファイルでファイルごとに処理を分けるか
どちらもメリット/デメリットあるのでお好きに。
373nobodyさん:2007/03/13(火) 17:22:38 ID:???
複数ファイルでのデメリットってさ、管理がマンドクサイってだけじゃね。
小分けして複数ファイル管理のほうがUNIX的だな
374nobodyさん:2007/03/13(火) 18:12:46 ID:???
sendmail程気にするようなものでもない。
375nobodyさん:2007/03/13(火) 23:17:29 ID:???
単刀直入に質問。IPに改行が入ってることってあるの?
376nobodyさん:2007/03/13(火) 23:29:41 ID:???
あるある。そりゃあしょっちゅうよ。
377nobodyさん:2007/03/13(火) 23:34:43 ID:???
ねーよ
378nobodyさん:2007/03/14(水) 02:26:48 ID:???
普通は無いけど、データは全て検証するのがセキュリティの基本だよ。
IPアドレスだったら正規表現で入力段階で正当なものかを確認。正当じゃなったらサニタイズじゃなくて、エラー処理な。
基本的にIPアドレスは安全だけど、サーバソフトの脆弱性などで不適切なデータが来る可能性は完全に否定できないから、リスクは最小限にすべき。

ついでに、リモートホストはもろ好きな文字列を指定できるから超注意。
殆どの配布CGIでは何の対策もしていないが、DNS登録権限があれば、リモートホストにタグいれることだって出来る。

そして、出力時には、全ての変数 (汚染の可能性があるかないかは別にして) に対してHTMLタグの無効化処理を行うか、
出力文字列も全部無効化するサブルーチン通して、タグが必要な場合には、別サブルーチンを通すべき。
たかが、XSSであっても、同じサーバ上のすべてのサービスに影響がでるし、Cookie漏洩したらセッションハイジャックされるのだから。
379nobodyさん:2007/03/14(水) 10:33:43 ID:???
要約すると、へぼはCGI作成禁止と。
380nobodyさん:2007/03/14(水) 11:53:05 ID:???
>>378
出力時にエスケープしとけばセキュリティ上は問題ないのでは?<へぼの考え
381nobodyさん:2007/03/14(水) 12:43:20 ID:DiCI2BZs
質問していいですか?

<a href="2ch.cgi?page=2">2ch</a>

のように2ch.cgiにpage=2というようなパラメータを渡すときなのですが、
渡すパラメータを数種類もためせたい場合はどうやればいいのでしょうか?
382nobodyさん:2007/03/14(水) 12:53:48 ID:???
2ch.cgi?page=2&aaa=bbb&ccc=ddd

ただし XHTML なら & じゃなくて &amp;
383nobodyさん:2007/03/14(水) 12:55:05 ID:DiCI2BZs
>>382
ありがとうございます!たすかりました!
384nobodyさん:2007/03/14(水) 13:55:05 ID:???
ナウなCGIでは&ではなく;で区切る。
385nobodyさん:2007/03/14(水) 15:23:52 ID:???
/ で区切るのもSEO的にグッドです
386nobodyさん:2007/03/14(水) 19:55:54 ID:???
/ってディレクトリと間違えそうだな
2chも/なんだっけか
387nobodyさん:2007/03/14(水) 19:59:38 ID:???
見ての通りWebPorg板だから深く考えないで良いよ
388378:2007/03/14(水) 23:35:50 ID:???
>>380
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) だけ。
389nobodyさん:2007/03/15(木) 00:13:01 ID:???
そんなことより過去ログ倉庫が規約違反だか何だかで
表示されないんだけど強制アフィでも仕込んでたんか?
390nobodyさん:2007/03/15(木) 02:32:50 ID:???
>>388
今北産業
391nobodyさん:2007/03/15(木) 02:36:48 ID:???
>>390
CGIを作るのに必要な勉強はPerl言語の勉強だけでは無い。
その前にTCP/IPの仕組みやDNSの仕組み、Apacheなどのサーバの仕組み、Linuxの仕組みなどを勉強すべきだ。
そうしないとセキュアなプログラミングをすることはできん。
392nobodyさん:2007/03/15(木) 05:31:26 ID:???
>>391
そんなことなんかどうでもいいので、セックスするのに必要な知識を教えてください。
393nobodyさん:2007/03/15(木) 05:54:55 ID:???
>>378、388
はどこから突っ込んでほしいのかな?
394nobodyさん:2007/03/15(木) 06:03:54 ID:???
> はどこから突っ込んでほしいのかな?

アナルのほうに中田氏でおねがいします。
395nobodyさん:2007/03/15(木) 08:46:50 ID:???
あ゙あ゙あ゙あ゙あ゙あ゙あ゙過去ログ見に来たのい゙い゙い゙い゙
396nobodyさん:2007/03/15(木) 10:48:13 ID:???
>>394
アーッ!
397nobodyさん:2007/03/15(木) 11:24:31 ID:???
>>386
つmod_rewrite
398nobodyさん:2007/03/15(木) 12:00:10 ID:???
>>388
> (host名に < や > を入れることも可能。)
そんなresolverのバグを力説せんでも。
まともなresolverならそんな名前が返って来たらエラーを返す。
399nobodyさん:2007/03/15(木) 13:41:02 ID:???
>>388
手元で実験できるマシンで実験してみたが、FreeBSD 7-currentも玄箱linuxも、
"<"や">"が入った名前ははじく。Windowsは今実験できん。

おまえは、どんな腐った環境を前提にものを言っているんだ?
400nobodyさん:2007/03/15(木) 21:01:34 ID:???
>>398-399
bind1 (1990年ごろ公開) とか
401399:2007/03/15(木) 23:10:10 ID:???
Win2Kはエラーにしてないな。
Windowsをサーバにしない理由が一つ増えた。
402nobodyさん:2007/03/16(金) 00:39:54 ID:???
せめて2003だろ
403nobodyさん:2007/03/16(金) 02:10:14 ID:???
逆引きの設定してない、正引きと食い違うIPアドレスなんて、いくらでもある。
そんな厳密な制御してもクレームの山になるだけだと思うけど。
404nobodyさん:2007/03/16(金) 02:20:09 ID:???
>>403
そういういい加減な処理をしたいなら、リモートホストのほかにIPアドレスも記録するべき。
犯罪予告の投稿者ホストが政府機関に成りすましたホストだったらどうするの?
下手したら管理者が責任を問わされるぞ
405nobodyさん:2007/03/16(金) 03:22:19 ID:???
>>404
べつにどうでもよくね?
406nobodyさん:2007/03/16(金) 03:26:33 ID:???
>>405
ひろゆきみたいに告訴されて賠償地獄になってもいいならご自由にどうぞ
407nobodyさん:2007/03/16(金) 03:33:49 ID:???
てst
408nobodyさん:2007/03/16(金) 04:18:14 ID:???
> ひろゆきみたいに告訴されて賠償地獄になってもいいならご自由にどうぞ

べつにどうでもよくね?
409nobodyさん:2007/03/16(金) 10:09:23 ID:???
ひろゆきは逃げ続けてるんだよなw
一番性質が悪いタイプw
410nobodyさん:2007/03/16(金) 10:35:41 ID:???
>>391
> その前にTCP/IPの仕組みやDNSの仕組み、Apacheなどのサーバの仕組み、Linuxの仕組みなどを勉強すべきだ。

おれIPとかUNIXとか全くわからないんだけど
どう勉強すればいい?
411nobodyさん:2007/03/16(金) 10:40:57 ID:???
>>404
おめーが記録したログに信憑性なんか無いから心配しなくて良い。
412nobodyさん:2007/03/16(金) 12:42:30 ID:???
>>404
そういうの書き込みされたら、すぐに削除すればいいんじゃない?
大体ここみたいに大きなところを管理しているわけじゃなかろうに…
413nobodyさん:2007/03/16(金) 18:46:21 ID:???
鯖に入ってないモジュールをuse hogeしてるから、
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; で指定しちゃって問題ないのかな。
414nobodyさん:2007/03/16(金) 18:56:35 ID:???
適当なデレクトリ作って
そこにモジュールいれて
use lib すればいいよ
415nobodyさん:2007/03/16(金) 19:06:52 ID:???
おお、ナルホド。
それならまとめて放り込めば良いのね。
ありがと!

416nobodyさん:2007/03/17(土) 02:24:03 ID:???
417nobodyさん:2007/03/17(土) 04:24:56 ID:tNPzkWAm
perlで文法が間違っているのを指摘してくれるソフトってないでしょうか?
毎回メモと睨めっこしているんですが
よろしくおねがいします
418nobodyさん:2007/03/17(土) 04:28:18 ID:???
冗談顔だけにしてよ。
419nobodyさん:2007/03/17(土) 05:06:00 ID:tNPzkWAm
無理なんでしょうか?
420nobodyさん:2007/03/17(土) 05:33:05 ID:???
>>419
perl -cw スクリプト.cgi
とか。
421nobodyさん:2007/03/17(土) 05:35:33 ID:???
一番手っ取り早いのは、色付けしてくれるエディタを使用することだな。
422nobodyさん:2007/03/17(土) 08:44:30 ID:FBwp50T+
>>421
mkeditor つかってますが、他にいいの有ったら宜しく。
423nobodyさん:2007/03/17(土) 09:48:25 ID:???
vimを使え
winならgvimがいいな
424nobodyさん:2007/03/17(土) 09:50:25 ID:???
Emacsじゃないの?
425417:2007/03/17(土) 16:18:30 ID:tNPzkWAm
420さん
ぐぐっても出てこなかったです

421さん
terapadを使っていますが
よく;を打つのを忘れたりします
そのせいで三十分ぐらい睨めっこ
426nobodyさん:2007/03/17(土) 16:20:18 ID:???
配列に重複要素があるか調べるにはどう書けばよいのでしょう・・・

重複を取り除いてから、元のと要素数を比較するという
チンポな方法しか思いつきません。
427nobodyさん:2007/03/17(土) 16:47:02 ID:???
my @array=qw(a b b c d d e f);
my %hash;
map { $hash{$_}++ } @array;
print keys %hash;
428nobodyさん:2007/03/17(土) 16:55:18 ID:BFzI3Dy+
\nと入力すると、改行じゃなくてスペースがブラウザに表示されます。
なにが原因だと思われますか?
OSはwindowsです。
429nobodyさん:2007/03/17(土) 16:58:19 ID:???
原因はお前だ
<br>にしとけ
430nobodyさん:2007/03/17(土) 16:58:24 ID:???
どんなコードなのか
431nobodyさん:2007/03/17(土) 17:16:42 ID:BFzI3Dy+
>>429
コマンドプロンプトで実行したらちゃんと改行されてました。
432nobodyさん:2007/03/17(土) 17:18:20 ID:???
そりゃそうだ
433nobodyさん:2007/03/17(土) 17:26:11 ID:???
>>427
そ、それは!
434nobodyさん:2007/03/17(土) 17:56:03 ID:???
質問させてください。
下記のロジックで、どういう原理で@aryの中身が変わってしまうのか。
foreachステートメントは”値を取り出す”のではなくて、
C言語でいう、ポインタが入るみたいなイメージですか?

@ary = ('0', '1', '2');
foreach $value (@ary){
$value = '-';
}
print $ary[0];
435nobodyさん:2007/03/17(土) 18:20:39 ID:???
エイリアスだから配列の値が変わる
436nobodyさん:2007/03/17(土) 18:27:40 ID:???
>>435
なるほど。Perlではエイリアスというのですね。
レスありがとうございました。
437nobodyさん:2007/03/17(土) 20:25:10 ID:???
>>425
グーグルで「perl cw 文法チェック」って検索するといいよ。
438nobodyさん:2007/03/17(土) 21:19:19 ID:???
>425
「perl」「-cw」でぐぐったら出てきませんでしたというなら、
まずgoogleの使い方を見直すべきだと思う。
439nobodyさん:2007/03/17(土) 21:41:37 ID:???
Perl CGIでチャットスクリプトを作る場合、何人もの人がログインしている
場合、複数のPerlプロセスが長時間立ち上がりっぱなしになってるってことですか?
それとも、読み、書き込みの度に別々のプロセスが立ち上げなおすってことですか。
440nobodyさん:2007/03/17(土) 21:52:12 ID:???
ソケット通信でCGIを呼び出す場合、どうやって引数を渡せばいいんですか?
441 ◆TWARamEjuA :2007/03/17(土) 22:09:00 ID:??? BE:2613683-2BP(6811)
(´-`).。oO(やっぱりHALだから?)
442nobodyさん:2007/03/17(土) 22:15:31 ID:???
>>441
答えられないんなら黙ってろ
443nobodyさん:2007/03/17(土) 22:58:00 ID:???
>439
作り方によるのかもしれないが、特に何も意識しなければ別々のプロセスが立ち上がると思う。
444nobodyさん:2007/03/18(日) 00:30:19 ID:???
>>440
ソケットで直接呼びにいくならCGIじゃないね。
プログラム板へどうぞ。
445nobodyさん:2007/03/18(日) 01:31:19 ID:???
LWP::UserAgent
446439:2007/03/18(日) 03:59:41 ID:???
>>443 ありがとうございます。m__m 結構サーバには負担ですね。niftyで設置は許されてるのかしらん。
447nobodyさん:2007/03/18(日) 13:48:42 ID:???
答えられないんじゃなくて
どこから突っ込んで良いか分からない
448nobodyさん:2007/03/18(日) 15:30:25 ID:???
A
print "all", &total(1..1000), ".\n";
print "all" . &total(1..1000) . ".\n";

B
print "all", "all", ".\n";
print "all" . "all" . ".\n";


AとBのそれぞれで結果が同じだった
『,』と『.』の違いって何?
449nobodyさん:2007/03/18(日) 15:33:14 ID:???
,はリストとして出力。
.は連結した上で出力。
.だとバッファに一回格納するからメモリを食う。
printだからたまたま同じであって、returnとか、ほかの関数では結果が変わるので注意汁。
450448:2007/03/18(日) 15:39:53 ID:???
>>449
とても助かりました
ありがとう!
451nobodyさん:2007/03/18(日) 16:01:01 ID:???
$, = ", ";
とか
$, = " / ";
みたいに値を変えてみると違いがわかると思うよ。
452nobodyさん:2007/03/18(日) 17:57:24 ID:???
joinの方が速い
453nobodyさん:2007/03/19(月) 01:00:53 ID:???
perlとlinux勉強はじめました。
・ログファイルの容量を定期的にチェック
・制限が超えたら、空のファイルにする
ということをしたいと思ってます。

それで、perlでなにか出来ないかと調べたところ
デーモン化という方法があること知りました。
use Proc::Daemon
sleep関数使おうと思ってますが、もっと良い方法あるでしょうか。
perlに限らず、linuxの機能やその他のアドバイスでもお願いしたいです。
454nobodyさん:2007/03/19(月) 01:20:03 ID:???
cronの方がええよ。
455nobodyさん:2007/03/19(月) 01:31:00 ID:y4PXC6RO
場違いな質問ですみません。
入門書見ながら掲示板作って出来上がったら目標がなくなってしまいました。
次の材料におもしろいCGIなんかがあったら教えてもらえませんか?
456nobodyさん:2007/03/19(月) 01:34:42 ID:???
RSSリーダーなんかいいんじゃね?
457nobodyさん:2007/03/19(月) 01:37:03 ID:y4PXC6RO
>>456
ありがとうございます。
早速、ぐぐってきます。
458nobodyさん:2007/03/19(月) 01:45:06 ID:???
PlaggerLDR でよくね?
459nobodyさん:2007/03/19(月) 02:29:39 ID:???
>>454
ありがとうございます。
ぐぐってみます。
460nobodyさん:2007/03/19(月) 10:26:01 ID:???
やっぱり春だからだろ。
461nobodyさん:2007/03/20(火) 14:43:14 ID:???
HTMLを読み込み、<body>と</body>で挟まれた部分を抜き出そうとしてますがうまくいきません。
正規表現で下記のようにしましたがマッチしないです。
$html_template =~ /<body>(.*?)</body>/i;
全ての改行を削除してから上記の文に掛けてやると抽出できます。

改行とかを削除しないで指定した範囲を抜き出すにはどうすればよいでしょうか?
462nobodyさん:2007/03/20(火) 14:57:48 ID:???
改行もマッチさせればいいんじゃね?
463nobodyさん:2007/03/20(火) 15:01:02 ID:???
$html_template =~ /<body>\n(.*?)</body>/i;

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。
464nobodyさん:2007/03/20(火) 15:02:52 ID:???
ミスったw

\n 加えても no match でした。
465nobodyさん:2007/03/20(火) 15:15:32 ID:???
m{<body>(.*)</body>}s
466nobodyさん:2007/03/20(火) 15:17:08 ID:???
>465
サクっとでけたw
mの有無で変わるものなのか・・・thx
467nobodyさん:2007/03/20(火) 15:19:51 ID:???
>>461
ちがう。肝はsだよ。mつかわないでこう書いてもいいし。

$html_template =~ /<body>(.*?)</body>/is;

s
文字列を単一行(single line)として扱います。つまり、``.''が通常はマ ッチしないような改行を含めた、全てのキャラクターにマッチするようにします。
468nobodyさん:2007/03/20(火) 15:22:25 ID:???
なるほど。
m 抜きでやってきたら同じ動きをした。
以前同じようなことで試行錯誤した記憶があるから、さすがに今回で覚えたかなw

重ね重ねありがとぅ。
469nobodyさん:2007/03/20(火) 17:17:28 ID:???
m区切り文字区切り文字
の区切り文字が/のときに限ってmを省ける、というのがPerlでの//の正体。
470nobodyさん:2007/03/20(火) 21:52:03 ID:???
/<body>(.*?)<¥/body>/;
471nobodyさん:2007/03/22(木) 22:01:09 ID:gLp6RvZ+
すいません複数引数があるときの
まとめて引渡し方がワカラないのですがなんでしたでしょうか?

sub test{
my $data1=shift;
my $data2=shift;
   :
}
というのを
sub test{
my @data=ほげほげ
}
と出来た気がするのですが↑のほげほげに入れる単語なんでしょうか?

以上 ご教授いただけるとありがたいです
472nobodyさん:2007/03/22(木) 22:03:27 ID:???
@_

shiftは、引数を省くと、メインでは@ARGV、サブルーティン内では@_が
対象になる。
473nobodyさん:2007/03/23(金) 00:37:10 ID:ZyRaN274
質問です。
Catalyst + DBIx(PostgreSQL)で開発しているのですが、Helperスクリプト経由で
Schemaを作る場合、public スキーマのテーブルしか見てくれません。
スキーマを指定する方法は無いのでしょうか?

直感で、Alter roll loginid SET search_path TO myschemaしたけど駄目でした。
474nobodyさん:2007/03/23(金) 02:26:03 ID:??? BE:88313524-PLT(12980)
ヘルパーとSchemaクラス云々だからCatalyst::Model::DBI::Schemaだよね?
DBD::PgがPgのスキーマをちゃんとサポートしてないから
どっかで
$schema->storage->dbh->do("SET search_path TO myschema, public");
みたいなことを自前でやらないとだめなんじゃないかな
てけとうでご免
というかpublicスキーマは使わな(ry
475nobodyさん:2007/03/23(金) 03:33:10 ID:???
俺はヘルパー使わないで、Schema自分で書いたな。
476nobodyさん:2007/03/23(金) 23:55:51 ID:ZyRaN274
回答ありがとうございます。
>>474
かなり色々なものでラッピングされちゃってて、手が出しにくい状況です。
あと、publicスキーマを使いたくないから悩んでいるわけで。

>>475
やっぱ男らしくそうですか。

いまのところ、publicスキーマでヘルパー走らせて、Dropしてから本当のスキーマにCreate tableするという便利だか不便なんだかわかんない状況で使ってます。
テーブル数が多いとそこそこ楽な気もするが、どのみちエクセルでテーブル設計書を作っているから、そこからDDLとスキーマをマクロで吐き出すようにしたほうが潔いような気もする今日この頃。
477nobodyさん:2007/03/26(月) 04:44:44 ID:???
utf8なコードで、マルチバイトが含まれてるかを判定するにはどのようにすれば
いいでしょうか。先頭1ビットで判定するみたいなことまで調べたのですが、
正規表現で範囲指定することは可能でしょうか?
478nobodyさん:2007/03/26(月) 08:04:04 ID:???
そのマルチバイトってのは
Perlの内部的なワイド文字か
それともただのUTF-8の文字列かどっち?
479nobodyさん:2007/03/26(月) 09:18:04 ID:???
/\P{IsASCII}/ とか?
480nobodyさん:2007/03/26(月) 12:48:08 ID:???
ありがとうございます。

>>477さんので解決したっぽいです。ちなみにuse charnames ":full"しなくても
動きました。

>>476さん

違いをよくわかっていません。が、調べられそうなので調べてみます。
481nobodyさん:2007/03/26(月) 18:31:41 ID:???
アンカがずれてるのは俺の環境が原因かと思って
ログを何度も読み込みしなおしてしまった
482480=477:2007/03/26(月) 22:30:29 ID:???
>>478,>>479でした。失礼しました!
483nobodyさん:2007/03/27(火) 20:50:22 ID:VNeopaMK
ニワンゴ(メールを送信するとそのメールに記された内容に基づいてスクリプトが実行され結果がメールで返ってくる)のような仕組みを自分で構築したいのですが、Perlでそれをやろうとしたら具体的にどんな処理が必要になるのでしょうか?
メールの解析は出来そうなんですが、いつ送信されるか分からないメールを待って、メールが来たらそれを受けて処理を始める仕組みをどう作れば良いのか分からないので教えて頂けませんか?
484nobodyさん:2007/03/27(火) 20:51:46 ID:???
適当なSMTP鯖使えばええやん
485nobodyさん:2007/03/27(火) 21:07:13 ID:WKbYIT6w
つうかニワンゴとPerlでググれば答えが出てる件
486nobodyさん:2007/03/28(水) 11:06:28 ID:???
スレッド式の掲示板で同じIPアドレスからでも
スレッドごとに違うIDを表示したいのです。
どういう風にやったらよいのかよくわからないので
参考になるような例を教えて欲しいです。
487nobodyさん:2007/03/28(水) 11:08:23 ID:???
ID生成にスレッド識別用のコードも利用すれば?
488nobodyさん:2007/03/28(水) 11:22:02 ID:???
>>487
折角のレスありがとうございます。
それをPerlでやるとなると、どういう風な感じになるのでしょうか?
そもそも別のIPから同一のIDを出さない、しかしIDからIPがばれないようにする
という所で、もう行き詰まって、いっぱいいっぱいです。
489nobodyさん:2007/03/28(水) 11:47:27 ID:???
ふつーcryptに突っ込んでるだけじゃない?
490nobodyさん:2007/03/28(水) 11:52:32 ID:???
>>489
GNU拡張の$1$〜使うなら別だが素のcryptは先頭8文字しかみないので
場合によっては役に立たない。特にIPアドレスを文字列で食わせたり
したらアウトだね。

491nobodyさん:2007/03/28(水) 12:09:26 ID:???
ハッシュ関数ぐらい自分で書け
492nobodyさん:2007/03/28(水) 12:18:19 ID:???
>>490
そうです、単純にやったのでは文字数の問題があるのと
あと、IPアドレスって数字と区切りの点のみを暗号化するってことじゃないですか
やろうと思えば簡単にIDからIPアドレスの一部がわかっちゃうのではと
だから他の人はどうやってるのか、ちょっと具体例が知りたかったのです
493nobodyさん:2007/03/28(水) 12:20:41 ID:???
自分用にパスワード自動生成スクリプト作っています。

配列 @character を次のように定義しました。
@character = ('a'..'z', 'A'..'Z','0'..'9');

しかし "l" (小文字のエル) や "1" (数字の一) 等の文字は紛らわしいので配列から排除したいです。

@character = ('a'..'k', 'm-z', 'A'..'Z','0'..'9'); みたいにやるとコードが汚くなるので、
一度配列を定義した後、特定の文字の要素を削除したいのですが、要素 'l' を削除するスマートな方法はないでしょうか?

初歩的な質問で申し訳ないですが、よろしくです。

494nobodyさん:2007/03/28(水) 12:41:03 ID:???
Perl の勉強用に Windows 版 ActivePerl 5.8.8.820 をデフォルト設定でインスコしました。
.pl ファイルをダブルクリックすると実行されるんですが、終わった後に勝手にコマンドプロンプトが終了してしまいます。
ダブルクリックのみで実行して、終わったらそのままコマンドプロンプトを終了させない方法は無いでしょうか?
教えていただけたら嬉しいです。
495nobodyさん:2007/03/28(水) 12:48:08 ID:???
@chars = ('a'..'z', 'A'..'Z', '0'..'9');
@omit = qw(1 l);

map { $idx{$_} = $i++ } @chars;
map { splice(@chars, $idx{$_}, 1); } sort { $idx{$b} <=> $idx{$a} } @omit;

print @chars,"¥n";
496493:2007/03/28(水) 12:48:29 ID:???
とりあえず、なんとか自力でできました。
「これは酷い」という部分があったら、教えてくれると助かります><

#!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;
497493:2007/03/28(水) 12:49:25 ID:???
>>495

す、凄い…。
>>496 のごちゃごちゃになっていた部分が凄いシンプルに!
登場した関数をぐぐって調べてみます。
ありがとうございます。
498nobodyさん:2007/03/28(水) 12:52:27 ID:???
map BLOCK ARRAYは短く書くために使っているので、
for (ARRAY) BLOCK に置き換えると理解しやすいと思われ。
499nobodyさん:2007/03/28(水) 12:52:50 ID:???
sleep
cmd /K perl
500nobodyさん:2007/03/28(水) 12:55:13 ID:???
ん?いっぱいレスが挟まった。
>>499>>494 の回答。
501nobodyさん:2007/03/28(水) 13:03:46 ID:???
>>493
@character = grep !/l|1/, ('a'..'z', 'A'..'Z','0'..'9');
502494:2007/03/28(水) 13:04:35 ID:???
>>499
thxです
前者は動かない…('A`)
------------------
print STDOUT 'aaa';
sleep;
------------------
だと何も表示されずに固まります。
理由は最後まで実行してからコマンドプロンプトに結果送っているからだと思われます。

後者は、バッチファイルやショートカットを作って、
"cmd /K perl ファイル名" を呼び出すってことですね。
こっちはできました。
503493:2007/03/28(水) 13:06:31 ID:???
>>501
シンプルすぎて感動で涙が出ました…。
(l または 1) にマッチするもの以外を配列に突っ込む、日本語で書くことをそのままPerlにしたといった感じですね。
504495:2007/03/28(水) 13:06:40 ID:???
>>501
ぽむ☆

なにをややこしく考えていたのだろうorz
505nobodyさん:2007/03/28(水) 13:09:01 ID:???
>>493 逆にしてもいい
@character = grep 'bilqDIO019' !~/$_/, ('a'..'z', 'A'..'Z', '0'..'9');
506nobodyさん:2007/03/28(水) 13:20:15 ID:???
>>505
なるほどね
右の内容が順番に評価されて $_ には各項目が入る
パターンマッチ演算子を使ってその文字列の中にアルファベットがあるか調べる
単純かつ美しい流れ

しかしこんなくだらん命題でいろいろな答えがでるとはおもわんかった
507nobodyさん:2007/03/28(水) 13:25:54 ID:???
TIMTOWTDI
508nobodyさん:2007/03/28(水) 17:03:34 ID:sUHWjomT
ソケットで獲得したページからリンクタグを抽出して表示させたいんですがうまくいきません

while(<SOCK>){
while(s/\n|\r\n|\r//is){}
if($_ =~ /(<a href="(http:[\w\.\~\_\-\/\?\&\+\=\:\%]+)")/is){
push @img, "$2\n";
}
}

なんか獲得できるのとできないのがあるみたいで・・・
$_に複数個あるときも1つしか抽出できませんでした
509nobodyさん:2007/03/28(水) 17:10:42 ID:???
>>508
そういうときはソケットから読んだ文字列がどうなってるか確かめて、

1)ソケットから読んだ文字列がおかしい
2)ある文字列のときにif以後がうまく働かない

のどちらであるか切り分けしてから質問するものだ。
510nobodyさん:2007/03/28(水) 22:46:18 ID:???
>>508
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の前に別の属性が記述されている場合とか
「"」じゃなくて「'」で括られていたりコーテーションがついていなかったり
する場合も考慮するのが普通かと
511510:2007/03/28(水) 22:51:27 ID:???

my @img = map {"$_\n"} (/<a href="(http://.*?)"/gis);

my @img = map {"$_\n"} (/<a href="(http:\/\/.*?)"/gis);
に訂正
偉そうに書いておいてエスケープ忘れた…
512nobodyさん:2007/03/29(木) 00:42:31 ID:???
>>509
今後の参考にさせていただきます^^;

>>510
>最初の一個しか抽出できない
あ〜・・・だから抽出したリンク数が合わなかったんですね^^;
ありがとうございます。

これからmap関数?を調べて(初めて見るんで;)それから試してみようと思います
513nobodyさん:2007/03/29(木) 12:49:04 ID:???
スレッドごとに違うIDを表示したいという件で質問した者ですが、自己解決しました。
回答はもう結構です。お騒がせしました。
514nobodyさん:2007/03/30(金) 04:04:21 ID:???
WinXP 上の ActivePerl で、再帰的にファイル名を収集しています。

「表」というディレクトリに chdir して、
その中で opendir, readdir とかしたいのですが、うまくいきません。

うまくいく方法があればお願いします。
515nobodyさん:2007/03/30(金) 06:41:02 ID:???
なんかその質問ム板で見た記憶がある
答えは忘れたけどw
516nobodyさん:2007/03/30(金) 07:44:15 ID:???
File::FindとかFile::Find::IteratorとかIO::AllとかPath::Classとか
517nobodyさん:2007/03/30(金) 07:44:58 ID:???
File::Finder忘れてた
518nobodyさん:2007/03/30(金) 11:12:45 ID:Ov/YkxL/
sub loadFormdate
{
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.

が出てきました
正しいプログラムをコピペしても出てきたんですが
どこが違うか教えていただけないでしょうか??
519nobodyさん:2007/03/30(金) 11:53:25 ID:???
$value =~ tr/+/ /;
スラッシュがぬけてる。
520nobodyさん:2007/03/30(金) 12:14:19 ID:???
> File::FindとかFile::Find::IteratorとかIO::AllとかPath::Classとか

File::Find と Path::Class はうまく扱えませんね。
521nobodyさん:2007/03/30(金) 12:17:30 ID:???
> なんかその質問ム板で見た記憶がある
> 答えは忘れたけどw

Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/10

これもうまく動かない。
522nobodyさん:2007/03/30(金) 20:49:19 ID:???
>518みてて思ったんだけど、

s/%([\da-f]{2})/chr hex $1/ieg;

s/%([\da-f]{2})/pack 'H2', $1/ieg;

どっちがはやいんだろ。
523nobodyさん:2007/03/30(金) 21:28:36 ID:???
use strict;
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);
524nobodyさん:2007/03/30(金) 21:29:20 ID:???
Benchmark: timing 100000 iterations of chrhex, chrhexi, packh2, packh2i...
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
525518:2007/03/31(土) 06:34:34 ID:x8D9Mjhz
>>519さん
あっ本当ですね
でも文法でひっかかるのはその下の
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;という部分なんです
526518:2007/03/31(土) 07:58:19 ID:x8D9Mjhz
>>519さんの言うとおりにしたら出来ました
エラーってでるとこが悪いとは限らないんですね
ありがとうございました
527nobodyさん:2007/03/31(土) 11:00:31 ID:???
だから、/を補えば出なくなるが?
/がないから、s/の/までがtrだと思われてるわけだろ?
528nobodyさん:2007/03/31(土) 11:01:12 ID:???
スマン、526が目に入ってなかった。
529nobodyさん:2007/04/01(日) 07:53:31 ID: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のプログラムは実行されず終わるんではないでしょうか?
よろしくおねがいします


530nobodyさん:2007/04/01(日) 08:34:15 ID:???
自分で確かめてみればいいじゃん
531nobodyさん:2007/04/01(日) 08:43:42 ID:???
>>529
# ローマ数字(I、II、III、…)は機種依存なので使うのをやめましょう
# 本によれば、というからには、本のタイトルや出版社など原典がわかるようにしましょう

%FORMについてなにも説明がありませんが、はフォームデータを解析・デコードして入って
いるのだと思います。で、Iが真ならばIIは評価されないというのはその通りです。

なお、「$FORM{'adminpass'}がなかった場合」というのは、%FORMに adminpassという
キーが存在しなかった場合、という意味です。普通パスワードの入力欄は、inputタグを
使うのであり、空欄のままsubmitを押しても、"adminpass="という文字列が送られて
きますので、それを%FORMに格納した場合、 adminpassというキーは存在しているので、
Iは常に偽となります。パスワードが空欄かどうかを判定するには、existsではなく
空文字列との比較($FORM{adminpass} eq "")をする必要があります。
532529:2007/04/01(日) 09:36:29 ID:uYKSgLT/
>>530さん
自分で確かめたら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章で認証プログラムを作っているのですが
533nobodyさん:2007/04/01(日) 10:44:05 ID:??? BE:154548427-PLT(12980)
そんな本捨ててしまいなさい
534nobodyさん:2007/04/01(日) 13:23:47 ID:???
>>532
・I → printGatePage() → II → loadUserfile()
という流れだと思い込んでるから、自分で確かめても if と elsif を両方通ってると思うだけで。

・何かのフォームからPOST → Iが真 → printGatePage() → exit  # >>532のHTMLを吐いて一旦終了
・続いて「ゆーざーかんり」ページからPOST → 同じスクリプトが叩かれる → Iが偽 → II
…こう動いてるような気はしませんか。
535529:2007/04/01(日) 15:33:33 ID:uYKSgLT/
>>533さん
本当に捨ててやりたいです
でも独学なのでこの本が一番分かりやすかったんで…

>>534さん
つまり
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
でもう一度同じとこに戻っていることですよね??
ありがとうございました 大変助かりました
536nobodyさん:2007/04/03(火) 16:20:52 ID:7w7pj3iq
普通に動くが・・・

use 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); }
537nobodyさん:2007/04/03(火) 20:04:01 ID:Ex+wZs3r
【リダイレクトについて】
LocationヘッダをContent-type:text/htmlを出力した後に
使いたいのですが何か方法はないでしょうか。
538nobodyさん:2007/04/03(火) 20:51:15 ID:???
>>537
<q cite="http://www.studyinghttp.net/cgi-bin/rfc.cgi?3875#Sec6.2.2">
スクリプトはいかなる他のヘッダフィールドも message-body も
返してはならない
</q>
539nobodyさん:2007/04/03(火) 20:52:16 ID:???
http://homepage2.nifty.com/~~~/utf8_decode.pll

これなんですが、標準入力をリダイレクションでファイルに変更すると
標準出力されません、なぜでしょうか?
540539:2007/04/03(火) 20:53:22 ID:???
環境はXPproSP2,ActivePerl-5.8.8.820です。
541539:2007/04/03(火) 20:54:01 ID:???
失礼しました。下記が正しいです。

http://homepage2.nifty.com/~~~/utf8_decode.pl
542nobodyさん:2007/04/03(火) 21:07:53 ID:???
どこでヘッダ吐いてんのさ
543539:2007/04/03(火) 21:12:28 ID:???
>>542
私への質問でしょうか?
すみません、意味がわかりません。
申し訳ありません。
544nobodyさん:2007/04/03(火) 21:22:35 ID:???
CLIだしム板に振ろうかと思ったら、向こうからこっちに来たのか。

Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/163-178
545537:2007/04/03(火) 21:22:59 ID:???
>>538
つまりはできないということなのでしょうか?
もしできないのであればCGIにてhtmlを出力した後に
別ページを表示することはMETAタグを使わずには打
開策すらないのでしょうか…。
546539:2007/04/03(火) 21:27:10 ID:???
>>544
そうです。お願いします
547nobodyさん:2007/04/03(火) 21:49:45 ID:???
>>547
はいできません。CGIやHTTPのしくみをよく勉強しましょう。
548537:2007/04/03(火) 22:09:15 ID:???
>>547
勉強になりました。ありがとうございます。
549nobodyさん:2007/04/04(水) 09:32:06 ID:???
もしかしたらどっかのブラウザのバグでできるかもよ、うまくやればドメインを偽って…
550nobodyさん:2007/04/04(水) 14:01:56 ID:???
Content-Typeの前にLocationを置くなら>538のすぐ後にある
6.2.4. Client Redirect Response with Document
にできるのかな。
551539:2007/04/04(水) 20:34:07 ID:???
自己解決しましたよ。

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をセット
552nobodyさん:2007/04/04(水) 21:42:58 ID:???
とりあえずだ、Perlと関係ないことに気がつこうな
553nobodyさん:2007/04/04(水) 23:16:32 ID:???
Perlに関係あるじゃん
とりあえず、正常動作おめ
554nobodyさん:2007/04/05(木) 00:54:13 ID:???
OSおよびコマンドラインの話題だなどう考えても
555nobodyさん:2007/04/05(木) 05:46:52 ID:???
>>553 = >>539 だなどう考えても
556nobodyさん:2007/04/05(木) 11:31:17 ID:???
posfix(v2.2)のperlでの使い方について質問させてください。
配送エラーのとき、$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のプログラミングで、足らないことがあるのでしょうか?

よろしくお願いします。
557nobodyさん:2007/04/05(木) 11:42:22 ID:???
本当にこうソースに書いているのなら、

> $from_mail="[email protected]"; # $from_mailは存在します。
> $to_mail="[email protected]"; # $to_mailは存在しません。(hoge2.jpは存在しないものとします。)

メール送信以前の問題なので$from_mail,$to_mailの値をチェックすることを
お勧めします。

ヒント: 文字列リテラルへの(配列)変数の埋め込み
558nobodyさん:2007/04/05(木) 11:43:28 ID:???
$from_mailも$to_mailも@hogeが変数展開されてる。

シングルクォートで

$from_mail = '[email protected]';
$to_mail = '[email protected]';

としてやればおk

# hoge.jpは実在するドメインだから、こういうときの例にはexample.comを使おうな
559nobodyさん:2007/04/05(木) 12:29:53 ID:???
>>557
>>558
お返事ありがとうございます。
シングルクォートに変更し、存在するメールには、
送信できること確認できました。

[cgi]
$from_mail = '[email protected]';
にしてみましたが、配信エラーの通知がされませんでした。
また、ドメイン検索で存在しないことを確認したドメインを
指定してもだめでした。

[outlook]
手作業で送信したとき、配信エラーが返って来るか確認してみました。
存在しないことを確認したドメインで、outlookでyahooや他のメールサーバから
送信すると戻ってきましたが、'[email protected]'は、戻ってきませんでした。

[考察]
ドメイン検索で存在しないことを確認したドメインで
outlookから送信すると、普通にエラーが帰ってきました。
cgiだと帰ってきません。cgiでなにかおかしいんじゃないかと思ってます。

open (MAIL,"| $mail_pass -t")の-tオプションが無いと
メール送信できなかったので付けてます。

思い当たることなどありますでしょうか。
よろしくお願いします。
560nobodyさん:2007/04/05(木) 13:09:03 ID:???
エラーメールのあて先はenvelope fromで決まるが、それはヘッダのfromとは
まったく無関係で、送信プログラムにsendmail(postfixのsendmail互換コマンド)
を使っているならばプログラムを実行したユーザのアドレスになるのがデフォルトで、
変更したい場合は-fオプションで指定する必要がある。

open (MAIL,"| $mail_pass -t -f $from_mail")

561nobodyさん:2007/04/05(木) 16:00:15 ID:???
>>560
丁寧な解説ありがとうございます。
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サーバから普通に送信できるので、大丈夫だと思うのですが。

ん〜。難しいです。
562nobodyさん:2007/04/05(木) 16:40:06 ID:???
>>561
postfixのログを見られるなら見るのが一番だが、レン鯖などで
見られないなら、まず自分に送ってみて届いたメールが思い通りに
なっているか確認するのが基本だな。

envelope fromはたいていreturn-pathというヘッダに保存されるので
それが自分が設定したつもりのものか確認するといい。
563nobodyさん:2007/04/05(木) 16:56:54 ID:???
>>562
自宅サーバで、勉強してます。
違うcgiの過去の受信メール見てみるとReturn-Path:があるときと、
無いときがありました。ということは、cgiがおかしいのかもです。

どうもありがとうございました。
原因がわかりましたら、報告いたします。
564nobodyさん:2007/04/05(木) 18:06:22 ID:2CVq1dn3
質問です。当方の掲示板にて半角を使いたいとの要望がありました。

で、ググった結果jcodeg.plを知り、これをアップロードして、半角文字のみで
書き込みのテストをしたらちゃんと半角で表示されました。

とここまでは良かったのですが、文章に全角と半角文字を混ぜた状態で
投稿すると、投稿後の記事内の文章が全て全角で表示されてしまいます。

入力した通りに投稿するには、jcodeg.plのドコを変更したらよいのでしょうか?
565nobodyさん:2007/04/05(木) 18:58:00 ID:???
Encode.pmにしてutf8で書く
566nobodyさん:2007/04/05(木) 18:59:13 ID:???
改造スレ行った方がいいんじゃね
567nobodyさん:2007/04/05(木) 19:04:47 ID:???
>>563
今までのレスを斜め読みしただけで見当ハズレかも試練が
OP25ってオチかな?
568nobodyさん:2007/04/06(金) 07:42:58 ID:???
>>567
port25は開けていました。

試しにコマンドラインで、[email protected]に送信してみました。
--------------------------
# /usr/sbin/sendmail -t
Envelope-From:"普段のメール"
To:[email protected]
.
--------------------------
で送信しましたが、配送エラーのメール返って来ませんでした。
・コマンドのオプション
・Envelope-From:"普段のメール"で、何かあるのか。
 いろんなメール指定してみましたがダメでした。
・ヘッダーオプションで他に何か必要か
ぐらいと思うのですが、どのあたりがおかしいでしょうか。

これが解決したら、perlにそのまま反映すれば
配送エラー返ってくる気がするんですが。。。
よろしくお願いします。
569nobodyさん:2007/04/06(金) 09:53:13 ID:???
>>567
Envelope-From: などというヘッダはない。

# /usr/sbin/sendmail -t [email protected]
To: [email protected]

本文…
.
#

のように指定します。-fの直後に指定するのがenvelopeアドレスです。
上記の場合、envelopeアドレスに何かメールを戻したいなら、Toヘッダのアドレスを
実際に存在しないアドレスとか、ドメインにしてみないと、Toのアドレスに普通にメールが
届いて終わるので注意。

さもなくば、telnet localhost 25 でMTAと直接交信してみるとか。
570nobodyさん:2007/04/06(金) 12:41:32 ID:???
>>569
お返事ありがとうございます。
#/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)
571570:2007/04/06(金) 19:26:09 ID:???
あまりにもスレ違いなので、linuxスレに行かせていただきたいと思います。
経過ですが、存在しないメールアドレスに送信した場合、
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

あとは、再送待ちじゃなくて、配送エラーが送信すればいいんですね。
再送のメールはどこにあるのとか、いろいろ、つまずいてます。
あとちょっとのような気がしてきました。

丁寧にレスありがとうございました。
572570:2007/04/07(土) 04:16:46 ID:???
maximal_queue_lifetime=0
で解決しました。

ログを見ることと、検索能力が少しアップしました。
ありがとうございました。
573nobodyさん:2007/04/07(土) 18:44:41 ID:MSfJ44Rv
Perlプログラム内でグローバルIPを取得するにはどんなコマンドを使用すれば
よいですか?
Linuxです。
574nobodyさん:2007/04/07(土) 18:50:58 ID:???
外部の鯖にIPだけを表示するSSI
とか置いてそこからlwpなりで適当に
取ってくればいいんじゃないすか
575573:2007/04/07(土) 19:10:45 ID:MSfJ44Rv
>>574
PerlでグローバルIPを取得する関数がないとすると、
シェルで組んだ方がよさそうですね。。

ありがとうございました
576nobodyさん:2007/04/07(土) 19:31:41 ID:???
診断君を利用するんだ
とか勝手なこと言ってみる
577nobodyさん:2007/04/07(土) 19:56:03 ID:???
「持っている全部のIPアドレスからプライベート領域に該当するものや
127.0.0.1みたいなのを取り除いて残ったもの」とすればよさそうだが、
これを複数もつホストもあるだろうなぁ。

578nobodyさん:2007/04/08(日) 03:05:36 ID:???
コンピューターに直接グローバルIPが振られているのか、
ルータやファイアウォールがあってNATされているのかで話が違ってくる。

後者の環境の方が多いんじゃないか。
だとすると、外部のサーバにアクセスしてそのサーバ側から教えてもらうとか。
あるいは、ルータの管理画面を自力で取得してパースするとかね。
579nobodyさん:2007/04/08(日) 04:54:35 ID:???
>>573
場合によってはこんな方法も

use Socket;
print inet_ntoa(scalar gethostbyname($ENV{HTTP_HOST}));
580nobodyさん:2007/04/08(日) 06:44:51 ID:???
> ルータやファイアウォールがあってNATされている
俺はDDNSの更新する時ルータに教えてもらってる
581nobodyさん:2007/04/08(日) 09:30:52 ID:???
シェルスクリプト相談室
http://pc11.2ch.net/test/read.cgi/tech/1112553783/

本人か?
582nobodyさん:2007/04/08(日) 09:31:57 ID:???
番号抜けた。その板の552
583nobodyさん:2007/04/08(日) 10:08:34 ID:???
1〜500の数字が数字ごとに1列ずつ並んでいるファイルがあるのですが、
そこから「10」という数字の列だけを参照するには
どうすればいいのでしょうか?
index関数だと100や210など10が含まれていたら
抜き出してしまうので悩んでいます。

検索で調べる場合の検索用語でもかまいませんので、アドバイスお願いしますorz
584nobodyさん:2007/04/08(日) 10:54:12 ID:???
ファイルの内容を
詳しく日本語で
585エスパー:2007/04/08(日) 11:35:44 ID:???
>>583
をエスパー日本語訳してみる。
こんな内容のファイルがあります。
--------
210 hoge
10 foo
100 guge
10 zoo
123 boo
--------
この場合 "10 foo" と "10 zoo" の行だけを抜き出したいのですが、index関数だと
210、100 といった行も含まれてしまいます。
どしたらいいの? お前らとっとと教えろ。
586583:2007/04/08(日) 12:42:51 ID:???
index関数にこだわりすぎてました。
$xx =~ /^$yy$/ でいけました。お手数かけました、ごめんなさい。
587nobodyさん:2007/04/08(日) 12:58:04 ID:???
fooとかzooとかも付かず、本当に数だけが並んだファイルだったらしい。
だがな、それなら eq で比較するだけでもよさそうだな。
588nobodyさん:2007/04/10(火) 04:15:40 ID:???
使ってる人がいるんだかどーだかわかんないけど、>>1
> 過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
これ見ようとするとリダイレクトされて過去ログ閲覧不可なのね。

> 現在、mirrorhenkan/perl/ はFREESPACE利用規約の禁止事項に
> 抵触しているためアクセスを制限しております。
589nobodyさん:2007/04/11(水) 01:18:30 ID:???
#@配列に代入
open(IN, $file);  
@list = <IN>;
------------------------------------
#Awhileで一行ずつ読み込んで処理
open(IN, $dfile);
while ( $line = <IN >) {
    #$lineを区切り文字を分割して、何か処理
}

何十Mというサイズの大きいCSVファイルを扱うときが前提です。
@だと配列に格納するみたいですが、メモリの消費は大変でしょうか?
Aのほうがよいでしょうか?
590nobodyさん:2007/04/11(水) 01:35:16 ID:???
>>589
(1)の方はCSVが1GBならメモリも1GB以上使うわけだが、(2)は
CSVのサイズが1MBでも10GBでも変わらない。
ってことはわかってるわけだな。

答えわかってんじゃん。
しかし、割り切って(1)の方法を使う場合もあるよ。
書き捨て的なスクリプトとかだと。
っちゅうか、丸数字やめね?
591nobodyさん:2007/04/11(水) 03:38:11 ID:???
>>590
パソコンの仕組みとperlの勉強を、はじめたばかりで、
メモリの動きとか、あまり考えたこと無かったので、
ちょっと自信がありませんでした。^^;
どうもありがとうございました。
592nobodyさん:2007/04/11(水) 04:20:00 ID:???
> (1)の方はCSVが1GBならメモリも1GB以上使うわけだが、

そんなコンパクトに収まるかよw
593nobodyさん:2007/04/11(水) 10:31:55 ID:???
今更ながらどうもコマンドラインがよく飲み込めてないかもしれないので、
少しお尋ねします。
例えば
perl -pi.bak -e "tr/A-Z/a-z/"*.html
とか便利ですよね?
これを.plとして使いたいのですが無理なのでしょうか?
コマンドラインから打ち込むしか手がないのでしょうか?
594nobodyさん:2007/04/11(水) 10:41:24 ID:???
595nobodyさん:2007/04/11(水) 10:41:25 ID:???
マルチポストやめれ
596nobodyさん:2007/04/11(水) 10:45:21 ID:???
すみません。最初にかきこんだとこはふさわしくないかもと思って
こちらに変えました。
申し訳ない。
597nobodyさん:2007/04/13(金) 14:21:28 ID:ZxZihQHU
%ENV のように、どのpackage内からでも呼び出せる変数を作るのはどのようにしたらよいのでしょうか?
598nobodyさん:2007/04/13(金) 14:45:10 ID:???
%{^_HOGE}のように名前を^_ではじめる。

詳しくはperlvar(1)の

Technical Note on the Syntax of Variable Names

を読め。
599nobodyさん:2007/04/13(金) 16:11:59 ID:???
>>598
美しくないので却下します
もう少しマトモな回答しなさい
600nobodyさん:2007/04/13(金) 17:45:43 ID:???
ちょ、教えてもらってるのに却下って・・・

$::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++;
601nobodyさん:2007/04/13(金) 18:12:42 ID:???
何をやりたいのか知らないけど、モジュール使って名前空間わけて必要に応じて
importするのが普通の方法なので、あまり変なことをせず従っておいたほうが
なにかといいと思われ。
602597:2007/04/13(金) 20:19:19 ID:ZxZihQHU
>>598, >>600, >> 601
ありがとうございます。試してみます。

何に使うってわけじゃなくて、そういうことが出来るのなら知りたいなと思いまして。有難う御座いました。

>>599
顔が見えないからってそういう言い方はしないほうがいいでしょうね。
603nobodyさん:2007/04/14(土) 04:03:04 ID:???
掲示板やデータベースなどのスクリプトを作成しているんですが、
検索機能をつけて、検索語句を$wordとし、
$dataに一致するものがあれば、って形でやってます。

if($data =~ /\Q$word\E/){

すると、「[」で「ー」もヒットしてしまったりします。
これは「ー」に「[」のコードが含まれているからだと思うのですが、それを除外する方法はどうしたらよいでしょうか?
604nobodyさん:2007/04/14(土) 04:08:26 ID:???
つ【utf8】
605nobodyさん:2007/04/14(土) 04:17:21 ID:???
>>604
なるほどutf8という方式だとコードの重複がないんですね
検索語句と、検索対象をutf8に一旦エンコしてから、ってやり方にしてみます。
有難う御座いました。
606nobodyさん:2007/04/14(土) 05:37:58 ID:???
jcode::convert(*data, 'euc');
みたいな感じに簡単にできると思ってましたが、複雑ですね。
一時的に対象の$変数をutfに変換して戻す簡単な方法は御座いませんでしょうか?
調べた限り、utfでスクリプトを書くことが前提の記事ばかり出てきてしまいます。
607nobodyさん:2007/04/14(土) 10:35:22 ID:???
encode guess
608nobodyさん:2007/04/14(土) 11:07:17 ID:???
ハッシュで自動的に補完されるのを防ぐにはどのようにするのでしょうか?

my %hash = ();
$hash{a}{b}{c}{d} = 'test';

↑の場合だと自動的に {b}{c}{d}の部分が無いのに自動的に作られてしまいます。こういうのを防ぎたいのですが・・
609nobodyさん:2007/04/14(土) 11:22:25 ID:???
期待する動作をするものを作ってtieするとか。
既にありそうだけど。
610nobodyさん:2007/04/14(土) 12:46:48 ID:???
611nobodyさん:2007/04/14(土) 12:50:45 ID:???
>>606

http://pc11.2ch.net/test/read.cgi/tech/1173880452/10

utf8でスクリプト書くことがそんなに困るの?
今あるsjisやeucのスクリプトをエディタなどで変換するだけでしょ。
612nobodyさん:2007/04/15(日) 03:41:41 ID:???
>>611
困るというか、モバイル機などでutf8がバケる機種があってそれに対する対策が自分はまだわかってないってだけです。
気分を害してしまったのならすみません。
613nobodyさん:2007/04/15(日) 03:57:25 ID:???
utf-8が化ける機種なんかがまだあんのか?
614nobodyさん:2007/04/15(日) 09:33:34 ID:???
俺は携帯サイトを作るとき、3G 端末以外は切り捨てて作る
古い機種つかってる人なんか無視
615nobodyさん:2007/04/15(日) 11:29:23 ID:???
普通にutf8でスクリプト組んで
古い機種の携帯からのアクセス時だけ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;
}

みたいに
616nobodyさん:2007/04/15(日) 14:24:51 ID:???
>>612

611のリンク先をよく読んで。
utf-8を使うのは、あくまでもPerlスクリプトだけであって、
入出力はsjisだよ。
617nobodyさん:2007/04/16(月) 03:22:14 ID:???
>>616
有難う御座います。勉強してみます。
618nobodyさん:2007/04/16(月) 08:23:29 ID:???
横から質問なんだけと、漏れも前から疑問に思ってた。

「Perlスクリプトはsjisで、内部で扱うデータは
utf8というのはできない」という事で、FAなのかな?
619nobodyさん:2007/04/16(月) 11:00:24 ID:???
そもそもPerlスクリプトをsjisではかかない。
Windows上であっても。
620nobodyさん:2007/04/16(月) 13:15:51 ID:MjOOmdj6
行数が多く、サイズも大きなファイルの指定した箇所を読み込みたいのですが、
どのような方法がよいでしょうか?

指定方法は、
1.X行目からY行分
2.最終行(何行目かは分からない)から数えてX行目からY行分
の2通りです。

621nobodyさん:2007/04/16(月) 14:24:24 ID:???
>>618
Perlで扱うマルチバイト文字は、内部的には「常に」utf8だよ。
use encoding を使えばsjis でスクリプトを書くこともできるが、
副作用があるから、よく理解した上で使わないといけない。

>>620
File::Tieを使うのが吉
622nobodyさん:2007/04/16(月) 14:48:25 ID:???
>>621
Tie::Fileじゃなかったっけ?
623620:2007/04/16(月) 17:55:42 ID:???
>>621-622
Tie::File で幸せになれそうです。
ありがとう。
624nobodyさん:2007/04/16(月) 18:55:47 ID:???
if(($x > -1 && $x < 1) && ($y > -1 && $y < 1)){

}

このような条件式をもっとスマーティーに書きたいのですが・・・
良きアイデアをお願いします!
625nobodyさん:2007/04/16(月) 19:12:41 ID:???
if (abs $x < 1 and abs $y < 1) {
  &foo;
}
626nobodyさん:2007/04/16(月) 19:18:36 ID:???
サンクスです!
なんか自分が情けなくなってきました・・
627nobodyさん:2007/04/16(月) 21:56:54 ID:???
>>624

$xも$yも0だったら真としたいんじゃないの?
お前さんは >>625 で本当にいいの?
628nobodyさん:2007/04/16(月) 22:07:23 ID:???
>>627
なるほど。
しかし、>>624が意図していることが実は>>625だったってことも考えられる。
629nobodyさん:2007/04/16(月) 22:28:33 ID:???
>>627
OKです・・・絶対値すら忘れている自分に鬱もう詩嚢
630nobodyさん:2007/04/16(月) 22:29:15 ID:???
メ欄に入れてさらに鬱
631nobodyさん:2007/04/16(月) 22:35:41 ID:???
脱線するけど、もとのコードの
$x > -1 && $x < 1
は、個人的には直感的じゃないと思った。
こう書くんだとしても
-1 < $x && $x < 1
にしたほうが視覚的に分かりやすい。
632nobodyさん:2007/04/16(月) 23:05:14 ID:???
-1 < $x < 1
とか書けたら一番幸せなんだけどな。

# ソースフィルタ使えばできるか?
633nobodyさん:2007/04/16(月) 23:17:54 ID:???
Perlに限らず、よく言われる話だよな。
634nobodyさん:2007/04/16(月) 23:28:48 ID:???
Pythonは -1 < x < 1 と書けるね。
635nobodyさん:2007/04/16(月) 23:51:39 ID:???
Perl実行中のメモリ監視することって可能?
他のサービスも同時に動いていて、Perlが使用してるメモリだけを知りたい。
636nobodyさん:2007/04/17(火) 03:37:59 ID:???
topとかじゃダメ?
637nobodyさん:2007/04/17(火) 06:11:09 ID: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);
}

638637:2007/04/17(火) 06:12:56 ID:nSKTWe9a
(2)#----------2重登録チェック----------
&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;
}


宜しくお願い致します。
639nobodyさん:2007/04/17(火) 09:23:10 ID:???
>>637-638
二重登録チェックの方法はひとまず置いといて、
ログファイルが消えちゃったってことは
書き込みの段階でしくじってるんじゃないの?

ありがちな例だと
 × open (FILE, '> file.txt'); # 上書き(つまり消える)
 ○ open (FILE, '>> file.txt'); # 追加書き込み
とか。
640nobodyさん:2007/04/17(火) 09:43:54 ID:???
男女別のファイルがどうこう言ってる割にプログラムには欠片も反映されて
ないし、ここで回答もらえるレベルに達してない質問の典型だね。
「日本語でOK」「エスパー回答者さんよろしく」ということで。

質問する側にも最低のスキルは必要で、問題を理解してもらえないことには
どうにもならんよ。
641nobodyさん:2007/04/17(火) 10:34:42 ID:???
>>624のが素朴な疑問なんだが、
$x===0 && $y===0 こんなん駄目?
642nobodyさん:2007/04/17(火) 10:35:21 ID:???
改造スレ池
643nobodyさん:2007/04/17(火) 13:55:12 ID:???
>>641
perlで同値演算子使えたっけ?
ってか、>>625の意図で正しいらしいから、
元々ダメだけど。
644nobodyさん:2007/04/17(火) 17:05:48 ID:???
ひねくれモンには
! int $x and ! int $y
って手もある罠、、、
645nobodyさん:2007/04/17(火) 17:06:59 ID:???
>>637 
キミみたいなのがスクリプト書くと、クロススクリプティングの餌食になるだけ。
何もしないのが吉。
646nobodyさん:2007/04/17(火) 17:13:38 ID:???
スクリプティングがスクリプディングに見えた
647nobodyさん:2007/04/17(火) 21:26:07 ID:???
>>644
イイ!
648nobodyさん:2007/04/17(火) 23:26:16 ID:???
初心者ってどの程度のこと言うの?

何となくスレの雰囲気から察すると
『はじめてのPerl』マスターレベルは初心者じゃないよね、もう。

『続・はじめてのPerl』に至っては
題名だけ聞くと優しそうだけど、
マスターしたら、CPAN Authorくらいなれちゃうし。

俺的には、『はじめてのPerl』読みこなし中レベルだと解釈してるが、どうか?
649nobodyさん:2007/04/18(水) 00:03:35 ID:???
「はじめてねperl」を理解できても、自分なりの書き方ができない奴は初心者
じゃないかな
650nobodyさん:2007/04/18(水) 00:12:31 ID:???
クロススクリプティングってなに?
651nobodyさん:2007/04/18(水) 08:05:12 ID:???
XSSのことじゃね?
652nobodyさん:2007/04/18(水) 10:28:13 ID:???
IPv4アドレスを4バイト固定でファイルに保存したり、
ファイルから読み込むことは可能でしょうか?

pack('C4', 255, 255, 255, 255) とすると4バイト(FF FF FF FF)になるかと思ったんですが、
8バイト(C3 BF C3 BF C3 BF C3 BF)になってしまいます・・・
653652:2007/04/18(水) 11:33:42 ID:???
ファイルハンドルをbinmodeでバイナリモードにしたら解決しますた。orz
654nobodyさん:2007/04/18(水) 11:56:14 ID:???
>>618
> 「Perlスクリプトはsjisで、内部で扱うデータは
> utf8というのはできない」という事で、FAなのかな?

リテラルの話であれば、Encode.pm で明示的に変換して使う分にはやりたい放題です。
Perl 5 の時点ではデフォルトで use bytes 状態なので、スクリプト内のリテラルが SJIS でも UTF-8 でも iso-8859-1 でも、perl にとってそれらは単なるオクテットシーケンスに過ぎません。
655nobodyさん:2007/04/20(金) 14:39:02 ID:???
mod_perlオンリーの日本語書籍出してくれないかなぁ?
当たり前のようにmod_php前提のPHPに「Perl遅いし」とか言われても仕方ない。
656nobodyさん:2007/04/20(金) 15:21:01 ID:???
mod_perlがApache標準Moduleになってさえくれれば・・・
657nobodyさん:2007/04/20(金) 15:30:53 ID:???
> print "<center><b>すでに$nameさんは登録されています</b><br>\n";
> print "「戻る」を押して入力しなおしてください</center>\n";
にしてもきったねーHTMLだな
658nobodyさん:2007/04/20(金) 15:59:34 ID:???
時代は ClearSilver だよな。うん。
659nobodyさん:2007/04/20(金) 17:22:02 ID:???
lighttpdとApacheの橋渡しをしてくれるモジュールとかないんかね。
660nobodyさん:2007/04/20(金) 22:18:03 ID:???
よく探してください><
661nobodyさん:2007/04/21(土) 05:09:19 ID:???
> lighttpdとApacheの橋渡しをしてくれるモジュールとかないんかね。

なにそれ?w
662nobodyさん:2007/04/21(土) 09:34:59 ID:???
リバースプロキシ立てれば?
663nobodyさん:2007/04/21(土) 13:00:06 ID:???
エスパーの俺様はApacheのモジュールを、そのままlighttpdに
ロードできるようにするモジュールは無いか? という質問だとわかる。
664nobodyさん:2007/04/21(土) 18:05:32 ID:TzVmcQvU
通常の関数のように
引数を省略すると$_が渡される
ようなサブルーチンを作る方法はある?
665nobodyさん:2007/04/21(土) 18:17:53 ID:???
$_[0]
666nobodyさん:2007/04/21(土) 18:21:27 ID:???
>>664
どんな引数が渡されたか見て、渡されてなかったら $_ を使えばいいのでは?
667664:2007/04/21(土) 18:37:51 ID:TzVmcQvU
>>665-666
うわ、言われてみれば単純な話ですね…
ありがとうございました
668nobodyさん:2007/04/23(月) 15:02:16 ID:NvRgzOji
SSIで動くカウンターの中にprint "Location:…"を入れたのですが、
カウンターの箇所に「Location:…」も表示されてしまいます。
カウントした数字だけ表示して、指定したURLに遷移させる機能を保持するにはどうしたらいいですか?

何かトンチンカンなこと言ってたら指摘お願いします。
669nobodyさん:2007/04/23(月) 16:33:16 ID:LAYu+KhN
出来るならワンタッチで、しかも「情報起業」に特化した
ホームページ作成ソフトがあったらいいのに・・・。

もし、プロ並みにキレイなホームページが作成が出来たとしたら、
情報商材で一旗あげようと思っているあなたの人生は変りますか?

【早くも成功者続出!】起業サイトビルダー
http://www.infotop.jp/click.php?aid=16484&iid=5683
670nobodyさん:2007/04/23(月) 17:00:46 ID:???
>>668
どういうタイミングで遷移させたいのか。
表示したらすぐに遷移してしまったら、表示を見る暇がない。
クリックしたら、であれば、出力したカウント文字列なりイメージにaタグを張ればよいです。
671nobodyさん:2007/04/23(月) 18:06:45 ID:???
>>670
すいません説明不足でした。

今作っているのは、
メールフォームに入力して送信ボタンを押すと、
送信完了ページにアクセスカウンタが表示されるというもので、
SSIを使ってそのページにカウントを表示させています。
672nobodyさん:2007/04/23(月) 18:14:15 ID:???
>>671
使い方を間違えているような悪寒
673nobodyさん:2007/04/24(火) 14:35:35 ID:???
>>671
送信完了ページにSSIのカウンタを表示させているのはわかったが、なぜカウントの出力と一緒に
Locationヘッダを出力しようと思ったのか、それを書いてくださいよ。
674nobodyさん:2007/04/25(水) 03:14:10 ID:???
エスパー登場。

Location(も使い方間違ってるがw)じゃなく、
入力したフォームの値を隠し属性にして
同時にカウンタも仕込んだ別のページを表示させる。
675nobodyさん:2007/04/25(水) 04:08:26 ID:???
別のエスパー。

・静的HTMLで作られた送信完了ページの冒頭に<meta>でrefreshでも入れとく。
・動的に吐かれる送信完了ページを吐く前の段階でカウント*だけ*して(表示要らない)
 送信完了ページを吐く代わりに Location: を吐いて希望のページに飛ばす。

期待してる動作はこんな感じなんじゃないのかな。
676nobodyさん:2007/04/25(水) 16:31:04 ID:???
さらに別のエスパー只今 \( ̄^ ̄)/ 参上!!

送信完了ページはCGIが吐き出すタイプだね?
その中にSSIのカウンタを仕込もうとしてprint "Location:カウンターのスクリプト"とか書いたんじゃないの?
メールフォームのスクリプトにカウンターの機能を組み込んで送信完了ページに書き出せばいいじゃん。
SSIなんて必要ないよ。
677nobodyさん:2007/04/25(水) 18:21:45 ID:???
すみません、質問させて頂きます。
やりたいことはフォームに入力されたデータを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で受け取った指定行を一括で同時編集するソースがわかりません。
お手数おかけしますが是非ご教授ください。
678nobodyさん:2007/04/25(水) 20:05:49 ID:???
ループを使って1行ずつ編集したら?
679nobodyさん:2007/04/25(水) 23:47:47 ID:???
>>678
たとえば、下記のようなデータが投げられたときのソースを教えていただければと思います。
mode=edit&no=1_g9gnt3&text1=hoge1&text2=huga1&no=2_ghtt3d&text1=hoge2&text2=huga2
こんな感じのデータが投げられたときどうやったらやりたいことができるのか、
全く持ってわかりません。。
680678:2007/04/26(木) 00:06:04 ID:???
パラメータを解析することは出来るみたいだし、何が問題なんだろう。

分解できないのか? 変数に格納できないのか? ループが分からないのか? 顔が濡れて力が出ないのか?
681nobodyさん:2007/04/26(木) 00:12:28 ID:???
あまりに初歩的過ぎる上に、単なる教えて君にしか見えない。
さらにはスレ違いの予感さえする。
でもヒマなので、親切にしてやる。

(1) &で分割してから配列に格納。
(2) ループで配列内を、=で分割してからハッシュに格納。
あとは…分かるな。

普通は、CGI.pm使うのが一般的だろうな。
682nobodyさん:2007/04/26(木) 00:42:18 ID:???
>>680
>>681
わざわざご親切にありがとうございます。

流れとしては
[&]で分割後配列へ格納→配列分ループ→ループ中に[=]で分割→noと一致する行があれば書き換え
という感じかと思い、色々ソースを書いてみましたが無限ループにはなるは、
配列分のループが上手く行かないとかぐっちゃになってしまって。。
(それで具体的なソースが欲しくなり、教えて君になってしまいました。。すみません。。)
ちょっと外出先にソース忘れてきちゃったので明日もう一度やってみます。
ハッシュとCGI.pmについて教えていただいたので調べてみます。
ありがとうございます。
683nobodyさん:2007/04/26(木) 01:27:54 ID:???
>>682
方法論としては間違ってないので、単純ミスだろうな。
ソース晒せば一瞬で解決するような問題だと思う。
684682:2007/04/26(木) 10:14:48 ID:???
下記のようなソースを書いてみましたが上手く動きません。。
アドバイス、、よろしくお願いいたします。。

$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);
685nobodyさん:2007/04/26(木) 10:50:46 ID:???
$logfileの中身とどういう風に動いて欲しいかの説明がないと
書いたとおりに動いてるだろと言われて終了だよ。

あとはエスパーさんよろしく。

なぜ/&n/でsplitするのかとか、あとでまたsplitするのはなぜかとか
$text1, $text2はどこへいったのかとか、@lineどんどん太るぞとか
いろいろつっこみどころはありそうだが。
686682=677:2007/04/26(木) 10:59:54 ID:???
>>685
レスありがとうございます。
$logfile は下記です。
log.txt
------------------------
1_g9gnt3<>text1<>text2<>
2_ghtt3d<>text1<>text2<>


------------------------
やりたいことはログの一括編集です。
(掲示板なんかの編集機能などログファイルの一行だと思いますが
  それの複数行を一括で編集するような機能)
&nの理由は&だけで分割したらforループ時回数がわからなくなってしまうなぁ、、
というなんとなくでやってみました。ループ中にもう一回splitした理由は
=で分割しないといけないかなぁ、、という理由です。
@lineが太るということについてはわかりません、、すみません。。
687nobodyさん:2007/04/26(木) 12:23:48 ID:???
>>684
あまりにアレすぎて添削する気が萎えるので、チェックポイント。
・フォームデータのデコードは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プログラムでデータを受けたときに参照しやすいようにすると吉。
つづく
688nobodyさん:2007/04/26(木) 12:27:08 ID:???
・同じname属性で複数の値があるときは、CGI.pmは配列として参照できるから、
 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に全部食わせるので、ファイルサイズがでかいとメモリも食います。
689nobodyさん:2007/04/26(木) 13:30:23 ID:???
初心者にそんなソース見せてもまた質問が増えるだけだろアホか
「input nameの付け方が悪い」
これだけでおk
690nobodyさん:2007/04/26(木) 14:21:39 ID: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";
691nobodyさん:2007/04/26(木) 14:25:00 ID:???
>>690
本を一冊読め・・・
ソースにはディレクトリなんてひとかけらも出てきてないだろ
クエリ受け取ってそれ表示してるだけ。
もうなんていうか死ねばいいのに。
692690:2007/04/26(木) 14:25:54 ID:2xFOBqUQ
# 4.クエリをアンパサンド( & )で分割
my @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 が不要になったのでクロス
}


と、このように書いてみましたがエラー表示が出て動きません><
エラーの詳細がわからないので直し方がわかりません。
エロイ人教えてください。
693nobodyさん:2007/04/26(木) 14:28:28 ID:???
エラーログ見ろ
694nobodyさん:2007/04/26(木) 14:30:01 ID:???
■ Perl言語 ■ 何でも質問コーナー ■
http://mixi.jp/view_bbs.pl?id=17607679&comm_id=1401396
Perlに関すること、cgiに関すること
なんでも質問できるコーナーです(たとえばApacheとかでもOKとします!)
(Web系であればOK)

ルール:
Google検索で調べてわかるようなことでも質問してもOKです
(初心者のうちは、どの情報を取捨選択したらイイのかわからないと思うので)
回答してくださるかたは、暖かく質問者を迎えてやってください
o(^^o) (o^^)o


ここ池
695nobodyさん:2007/04/26(木) 14:30:49 ID:???
>>684
スクリプトの2行目に
use CGI::Carp qw(fatalsToBrowser);
と書きましょう。

シンタックスエラーの原因が表示されるようになります。

# まずは、これでいいんじゃね?>ALL回答者
696682=677:2007/04/26(木) 17:01:44 ID:???
>>687-688
ずっとあれからやってたのですがなぜかハッシュに代入されなくて
ソース部分を別CGIとして作り、データを投げたところ上手く行きました。
これからもっともっと勉強して色々覚えたいと思います。
本当にありがとうございました!
697nobodyさん:2007/04/26(木) 23:13:22 ID:???
複数のLWP::UserAgentオブジェクトををマルチスレッド風に
動かすにはどうしたらいいのでしょうか?

IO::SelectはIO::Socketでないと使えないのでしょうか?
698nobodyさん:2007/04/27(金) 09:34:20 ID:???
LWPを無理矢理マルチスレッドに使うくらいだったら
素直にsocket使うべき。
699nobodyさん:2007/04/27(金) 14:53:44 ID:???
POE
700nobodyさん:2007/04/27(金) 20:33:48 ID:???
POE知らなかった!
入所前(7年前)にはそんなの無かったはず

いやぁ〜プログラミングは楽しいね
701nobodyさん:2007/04/27(金) 21:57:47 ID:???
POEってわりと大きいから、ちょっとしたものだったらlwpでシングルスレッドのほうが早かったりもするけどね。
702nobodyさん:2007/04/27(金) 22:44:25 ID:???
遅いサーバが混じってたらしぬる
703nobodyさん:2007/04/28(土) 00:13:57 ID:???
lwpってあまりタイムアウトの設定が効果ないよね?
下のように書いても5秒どころか30秒位待たされることがあるよ。
なんでだろう?

$ua = LWP::UserAgent->new;
$ua->timeout(5);

704nobodyさん:2007/04/28(土) 01:22:35 ID:???
$ua->timeout( $secs )

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.
705nobodyさん:2007/05/02(水) 11:13:15 ID:sZgTnz1H
素朴な疑問ですがお願いします。

my $a = 2/3;
としたら一体どうなるのでしょうか?
割り切れない数なのでforの∞ループみたいに悲惨なことになりますか?

今暗算練習のCGIを作ってます。足し算引き算までつけてあるのですが、
割り算もつけようかなと考えてたらこの問題にぶちあたりました。

my $a = int (rand 100) / int (rand 100);
実際はこんな感じで使おうと思ってたのですが、割り切れない計算になったときどうなるのでしょうか?
適当なところでやめてもらえるのでしょうか?
それとも/演算子に対して「小数点第5位まででやめろ」という命令をあらかじめだしておけるでしょうか?
706nobodyさん:2007/05/02(水) 11:14:07 ID:???
やってみ
707nobodyさん:2007/05/02(水) 11:19:00 ID:???
なんでやったらすぐ分かる事を
やらずに質問するの?
脳の一部に障害のある方ですか?
708nobodyさん:2007/05/02(水) 11:28:03 ID:???
>∞ループみたいに悲惨なことになりますか?
これが気になってんだろう
709nobodyさん:2007/05/02(水) 11:35:47 ID:???
無限ループをプチッと殺せない環境で作ってるのかな。

> my $a = int (rand 100) / int (rand 100);
これ、計算せずにエラー吐いてくれるときがあるよ。
710705:2007/05/02(水) 11:58:22 ID:sZgTnz1H
>>709
その通りです。

>ときがあるよ。
というのは運任せという意味ですか?
それともuse strictのような無限ループコードストップモジュールでもあるという意味ですか?
711nobodyさん:2007/05/02(水) 12:12:57 ID:???
ランダムだから分母に0がきたらエラーになるさ
712nobodyさん:2007/05/02(水) 12:20:33 ID:???
初心者スレらしくて素晴しいね!
713nobodyさん:2007/05/02(水) 12:46:53 ID:???
なんで無限ループになるなんて思い込んだんだか
714nobodyさん:2007/05/02(水) 13:12:51 ID:???
>>60
>#!〜から始まる1行目(名前を忘れた)に変数を初期化するオプションがあったはず
SpeedyCGIのオプションって、
ttp://perldoc.jp/docs/modules/CGI-SpeedyCGI-2.21/SpeedyCGI.pod
ここ見つかりましたが、
#!/usr/bin/speedy
にどんなオプションつければ、いいでしょうか?
715705:2007/05/02(水) 13:22:14 ID:sZgTnz1H
>>711
なるほど。
では0ではないときの全てが無限ループのような事になってしまうのですか?
716nobodyさん:2007/05/02(水) 13:40:10 ID:???
>>715
君にはこの言葉を送ろう

「馬鹿の考え休むに似たり」
717nobodyさん:2007/05/02(水) 13:47:59 ID:???
あれもこれも無限ループになりそうで怖い→リモートで作るのをやめよう
という発想にはならんのかな。
718705:2007/05/02(水) 14:14:41 ID:sZgTnz1H
どなたかわかる方はいませんか?
my $a = 2/3;
print $a;
とすると無限ループのように延々6.6666666666666666666666666666666666...
となるんでしょうか?ならないんでしょうか?
719nobodyさん:2007/05/02(水) 14:16:22 ID:???
しねばいいのにwwwwwwwww
720nobodyさん:2007/05/02(水) 14:28:30 ID:???
まあ氏ぬべきだな
721nobodyさん:2007/05/02(水) 14:33:08 ID:???
>>718
自分で試してみてはどうでしょうか
というか自分で試さないのはなぜでしょうか
私はPerlの実行環境がないのでPHPで試してみました
結果は
0.66666666666667
でした
ただみんながこの結果になるとは限りません
パソコンの環境(特にCPU)が変われば結果も変わることが多いです
722nobodyさん:2007/05/02(水) 16:04:38 ID:???
× 分かる人が居ない!
○ あまりに馬鹿すぎて答えたくない
723nobodyさん:2007/05/02(水) 16:13:48 ID:???
[これはひどい][死ねばいいのに]
724705:2007/05/02(水) 17:33:02 ID:sZgTnz1H
>>721
ありがとうございます!
なるほどです。適当なところで打ち切るようになっている可能性が高いわけですね。
ではその打ち切る桁数、小数点第何位までせよという命令は出せますか?出せませんか?

私の環境では小数点第15位のところで四捨五入されるようです。
小数点第30位まで計算させるなどはperlで制御はできないものなのでしょうか?
725nobodyさん:2007/05/02(水) 17:42:01 ID:???
Perlがどうこう以前に

コンピュータのことをもっと勉強してください。
726山本山:2007/05/02(水) 18:10:10 ID:???
わかりました。
727nobodyさん:2007/05/02(水) 18:57:52 ID:???
標準モジュールで出来るけど
その方法は絶対お前に教えてやんねー
少しは自分でやってから質問しろカス
728705:2007/05/02(水) 19:05:56 ID:sZgTnz1H
ずっと無視されてるのにどうしてそんなに絡んでくるんだ?
そんなにカマって欲しいのか?
確実に俺より頭いいだろうに精神年齢は俺以下じゃ恥ずかしいよ。

回答する気がなければ無視を決め込むというのがどこのスレでも回答者の大人のマナー。
729nobodyさん:2007/05/02(水) 19:15:55 ID:???
このスレの存在意義を考えれば
自然と答えは出てくるさ
730nobodyさん:2007/05/02(水) 19:24:54 ID:???
ずっと煽り続けて
いつか >>728 みたいにキレる所を
見るのが楽しみで仕方がないから
731nobodyさん:2007/05/02(水) 19:25:46 ID:???
質問者が回答無視してどうすんだよww
732nobodyさん:2007/05/02(水) 23:06:30 ID:???
あまりに哀れ杉だったので…
packとかsprintfでも適当にググってください
でなきゃ数値変換あたらでさがせばヒントぐらいはでてくるかと

で、それが分かったらプログラミングは卒業してください
733nobodyさん:2007/05/02(水) 23:59:24 ID:???
>>705
もし、あなたが誰かに「カップラーメンの待ち時間を3分から5分に
変えたら味はどうなりますか?」と質問されたら、どう答える?

 とりあえず「味が変わります」と答えたとして、
 更に「どう味が変わりますか?」と質問されたら?

 それに対して「美味しくなくなります」と答えたとして、
 更に「どの位美味しくなくなりますか?」と質問されたら?

 それに対して「食えなくもない不味さ」と答えたとして
 更に「じゃあ、4分なら大丈夫ですか?」と質問されたら?

書き込みから>>705には、そういう質問者の感じがする。
だから、みんな「自分で試してみろ」と答える。
すごく自然。大人な対応。精神年齢も低くない。
むしろ、不自然なのは、そこまでしても自分で調べようとしない>>705
734nobodyさん:2007/05/03(木) 02:48:42 ID:4s8Yv8pi
open関数では別のサーバーにあるファイルは展開できないようなのですが、別サーバーのファイルを読み込む方法ってありますか?
教えてください
735nobodyさん:2007/05/03(木) 03:40:24 ID:???
6.6666666666666666666666666666666666
っていうのは循環(無限)小数でしょ。算数(数学)をもう少し勉強してね。
無限ループっていうのは、
while (1) { print "6" }
のように、永遠に終わらないループのこと。
int(rand(100))は、何から何までの整数を返す可能性があるかわかって使っていましたか?
なお、コンピュータは内部的には2進数で計算しているので、丸め誤差というのがあるよ。
でかい小数桁数を扱うためのモジュールはあるけど、その手前のことをすべてこなしてから考えたら?
736nobodyさん:2007/05/03(木) 04:03:11 ID:???
>>705
> それとも/演算子に対して「小数点第5位まででやめろ」という命令をあらかじめだしておけるでしょうか?
my $a = sprintf "%3.5f",int (rand 100) / int (rand 100);
これじゃダメ?
第5位までの結果を出せ、ってので、主旨とはそれるけど
737 ◆TWARamEjuA :2007/05/03(木) 09:18:53 ID:??? BE:1961429-2BP(6824)
(´-`).。oO(パンチ2/3の次は無限ループかぁ。。。)
738nobodyさん:2007/05/03(木) 10:27:51 ID:???
>734
IO::Allが助けになるかもしれない
739nobodyさん:2007/05/03(木) 11:12:02 ID:???
LWPにダウンロードと同時にファイルに書き出してくれる関数なかったっけか
740nobodyさん:2007/05/03(木) 13:51:24 ID:???
>>374
プロトコルは何を使う?
741nobodyさん:2007/05/03(木) 15:42:37 ID:???
>739
&LWP::Simple::getstore
742nobodyさん:2007/05/04(金) 04:42:05 ID:???
>>737
パンチは2/5なw
743nobodyさん:2007/05/04(金) 16:26:45 ID:???
掲示板スクリプトにて

書き込みと表示を同一スクリプトでやる場合はファイルロックすればいいと思うんだけど、
書き込みと表示を別スクリプトにした場合、
書き込み用でログファイルに書き込みしてる時に表示用でログファイルを開くとログファイルが壊れると思うんだけど、
こういう場合はどういう風にすればいいの?
744nobodyさん:2007/05/04(金) 16:38:32 ID:???
別スクリプトでもロックすれば問題ないよ。

こういう頓珍漢な質問してるようだとロックを正しく理解してないから
勉強しなおせ。
745nobodyさん:2007/05/04(金) 16:51:01 ID:???
ロックはアクセス権
一度に1プロセスのみがアクセスしていいよという自前のルール
ルールを無視したプロセスが一つでもあれば壊れる
746nobodyさん:2007/05/04(金) 17:23:16 ID:???
>>744-745
ありがとう
勉強してみる
747nobodyさん:2007/05/05(土) 02:51:43 ID:???
PHPみたいにperlの公式マニュアルってないですか?
748nobodyさん:2007/05/05(土) 03:25:19 ID:???
英語版ならあるよ。
PHPみたく日本語版の公式マニュアルはないけど。
749nobodyさん:2007/05/06(日) 23:46:01 ID:???
perldoc がある。
コマンドラインにて
perldoc -h
して使い方をまなんで、
perldoc perl
perldoc perlfaq1
perldoc perlre
あたりから入れ
750nobodyさん:2007/05/07(月) 02:13:17 ID:???
CGIでjpegファイルを読み込んで画像処理をしたいんですが
それぞれの画素のRGB値を一発で配列に入れてくれるようなモジュールありませんか?
751nobodyさん:2007/05/07(月) 02:51:49 ID:???
>>750
cpan で探せば?
動かす鯖によっては、全く動かないか、アカウント停止食らうだろうね。
752nobodyさん:2007/05/07(月) 03:16:37 ID:???
そういったメモリをガスガス使うような事は自鯖でやってください
753nobodyさん:2007/05/07(月) 11:11:07 ID:???
一発で入れてくれるやつは知らんが
X/Y値を指定してRGB情報を取ってくる
モジュールならどこかで見た覚えがあるので
後は気合と根性で
754nobodyさん:2007/05/07(月) 11:35:40 ID:???
Image::MagickのgetPixelsでも使えばいいんでないの?
メモリが足りるかどうかは知らんけど。

ttp://www.imagemagick.org/script/perl-magick.php
755750:2007/05/07(月) 21:07:25 ID:???
レスありがとう。参考にして色々試してみます。
メモリは気を付けます。
756nobodyさん:2007/05/08(火) 00:26:12 ID:???
(JPG の場合) 640W * 480H * 32bit = 1,228,800 byte = 1.2MB

でけぇ〜
是非共有鯖ではやってくれるな
757nobodyさん:2007/05/08(火) 00:59:03 ID:???
フルカラーは24bitだろ。
32bitってのは、ビデオメモリに展開する時の話であって。
758nobodyさん:2007/05/08(火) 01:11:06 ID:???
とは限らないんだなそれがまた
759nobodyさん:2007/05/08(火) 01:24:11 ID:???
(PNG の場合)
760nobodyさん:2007/05/08(火) 18:48:57 ID:???
ラジオボタンをチェックさせて処理結果を表示させるCGIで、
処理結果を表示した状態からラジオボタンのフォームへ復帰するのに、

print
$cgi->td($cgi->a(href=>{$ENV{SCRIPT_NAME}},
$cgi->input({type=>"button", value=>"戻る"})));

と書いてローカルのapache2.2に置いてiceweselで動作をチェックしたら戻るボタンで正常に復帰したのですが、IEでチェックしたら戻るボタンが機能しませんでした。

仕方なくJavaScriptを使って

print
$cgi->td(
$cgi->input({type=>"button", value =>"戻る",
onClick=>"history.back(-1)"}));

と書いてみたらIEでも戻るボタンが機能したのですけども、これではJaveScriptが使えないブラウザから使えません。
w3mとかでも使いたいので、なんとかJavaScriptに頼らない良い方法は無いでしょうか?
ブラウザの名前を取得してIEとIE以外で場合分けするしか無いのでしょうか?
761nobodyさん:2007/05/09(水) 01:46:37 ID:???
戻るボタンがブラウザの「戻る」ボタンなのかINPUTタグのボタンなのか
イマイチ意味不明だけど、$cgi->aの引数が違うんじゃね

> $cgi->a(href=>{$ENV{SCRIPT_NAME}},
$cgi->a({ href => $ENV{SCRIPT_NAME} },

それとAタグの中にINPUTタグ入れてるみたいだけど君は正しいと思うのかい?
762nobodyさん:2007/05/12(土) 23:27:21 ID:???
Perlメモの改行コードを統一するのところでわからないところが
あるので質問させてください。
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 に変換されているので必要ないのではと思ったのですが。。
763nobodyさん:2007/05/12(土) 23:50:46 ID:???
説明ちゃんと嫁

いちばん頭に書いてある

s/\x0D\x0A|\x0D|\x0A/\n/g;

を高速化したのが

s/\x0D\x0A/\n/g;
tr/\x0D\x0A/\n\n/;

1行目だけだと足りないだろ。
764nobodyさん:2007/05/13(日) 00:11:57 ID:???
>>762
tr のことを調べよう。
2行めは \x0D\x0A と一続きになったものを処理してるわけじゃない。
765nobodyさん:2007/05/13(日) 00:19:19 ID:???
>>763
>>764
解決しました。
764さんの述べられている通りtrは \x0D\x0A と一続きに
なったものを変換しているものと思い込んでいました。
ありがとうございました。
766nobodyさん:2007/05/13(日) 21:00:15 ID:J1kSit9o
ちと質問させてください。
掲示板のスパム対策に、"http"って文字列が5個以上投稿に含まれてる場合に
その投稿を弾こうと思って

if($FORM{'comment'} =~ /(http){5,}/){ &error(); }

とやったんですが、どうやらちゃんとマッチできてないようです。
どこがおかしいんでしょう・・・
767nobodyさん:2007/05/13(日) 21:10:24 ID:???
a{n,} てのは n回以上の「繰り返し」へのマッチだす。
768nobodyさん:2007/05/13(日) 21:13:04 ID:???
/(http){5,}/
は "http" が5個以上連続したら、って意味だから
"httphttphttphttphttp" って文字列が含まれてないとマッチしない

@l = ($FORM{comment} =~ /http/g); if (@l >= 5) 〜
とかすればいいんでないかい
769nobodyさん:2007/05/13(日) 21:35:09 ID:???
$FORM{'comment'} =~ s/http/http/g;
か、
scalar(@tmp = $FORM{'comment'} =~ /http/g);
じゃまいか。
770nobodyさん:2007/05/13(日) 22:45:32 ID:J1kSit9o
>767-769
初歩的な勘違いだったんですね・・・
ありがとうございます。
771nobodyさん:2007/05/14(月) 03:20:34 ID:ha/4Ezv5
変数 $aaa
特定の文字列 「HOGE」
を、
$aaa「HOGE」$aaa「HOGE」$aaa「HOGE」$aaa.......
というように$aaaで「HOGE」を挟む形で並べたいのですが、
while(){
$fuga .= "$aaa「HOGE」";
}
$fuga =~ s/「HOGE」$//;

とやるのはおかしくないでしょうか?
何となく野暮ったい感じがするんですが、
こういった処理のセオリーみたいなものはありますか?
他にも「これの方がまだマシ」という書き方があれば是非アドバイスお願いします。
772nobodyさん:2007/05/14(月) 03:42:42 ID:???
>>771
$fuga = $aaa;
while( ... ){
$fuga .= "「HOGE」$aaa";
}

あとは、0回の繰り返しも必要なら、全体をifで囲むとか。
773771:2007/05/14(月) 03:55:40 ID:???
>>772
おぉ、なるほど!
先に$fugaに入れてしまえばスマートにいきますね。
こんな時間に即レス、ありがとうございました!
774nobodyさん:2007/05/14(月) 06:53:09 ID:???
>>771
my @aaa = ( $aaa, $aaa, $aaa, ........) ;
$fuga = join q{「hoge」}, @aaa ;
775nobodyさん:2007/05/14(月) 09:28:37 ID:???
$fuga = "${aaa}「HOGE」" x 回数 . $aaa
難しく考えすぎ
776nobodyさん:2007/05/14(月) 17:37:17 ID:oZfrkKb+
$insertid = $dbh->{mysql_insertid};
接続直後だと 0 になるのですが、
DB接続→INSERT後にしかAUTO_INCREMENTの値を取得できないのでしょうか?
またその場合、INSERT前に取得して利用したい場合どういう方法がありますでしょうか?
777nobodyさん:2007/05/14(月) 18:15:30 ID:???
けつまでしーくしてそのレコードを取得すりゃえぇやんけ
778nobodyさん:2007/05/14(月) 18:36:36 ID:???
>>776
先に欲しいなら、AUTO_INCREMENTを捨てて、自前で発行するしかないんじゃない?
779nobodyさん:2007/05/14(月) 18:37:28 ID:oZfrkKb+
cronで色々と処理後にMySQLのレコードは削除してしまうので
普段テーブルにはレコードがありません。

でもphpMyAdminでは「次へ Autoindex」と見れるので、何か方法があると思うのですが
780nobodyさん:2007/05/14(月) 19:45:44 ID:???
INSERT後にUPDATEしないでDELすりゃ取得できるんじゃ?
きれいな方法かどうかは知らないけど・・・
781nobodyさん:2007/05/14(月) 19:55:30 ID:???
>>779
それはshow table statusで調べているのだと思われる。
普通のプログラムでこれから値を抜き出して使うのは
おすすめしません。

多分何か変わったなことをしようとしているからそんな
値が必要になってるんじゃないかという気がするので
そもそもそこに立ち戻って考え直したほうがいいんじゃ
ないか。
782nobodyさん:2007/05/14(月) 20:00:29 ID:oZfrkKb+
SHOW TABLE STATUS LIKE 'テーブル名'

phpMyAdminでは↑のSQLでテーブル情報取得してるんですね。
DBIで上記SQL発行して、Auto_incrementフィールド読み込んで処理することにします
783nobodyさん:2007/05/14(月) 22:36:32 ID:???
INSERT前に取得したとして
別プロセスもINSERT前に同じ値を取得したりして整合性とれるの?
784nobodyさん:2007/05/15(火) 12:03:46 ID:???
>>783
ほぼ同時に処理された場合か。
でもそれって mysql_insertid でも言えるんじゃね
785nobodyさん:2007/05/15(火) 14:22:47 ID:???
まぁ何をやりたいのか、DB、テーブルの設定が分からない以上話すだけ無駄だよね
786nobodyさん:2007/05/15(火) 14:46:32 ID:???
>>784
普通に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.
787nobodyさん:2007/05/16(水) 23:40:17 ID:???
utf8なCentOSに、eucで書かれたCGIスクリプトを持ってきてutf8に変換し、
HTMLをcharset=UTF-8にしただけで普通に動いたのだけれど、use utf8 やら
binmodeなんたらを書かなくても良いものなの?
逆にuse utf8やらbinmode STDOUT を指定したら文字化けしたけど。
788nobodyさん:2007/05/17(木) 00:12:41 ID:???
あたりまえだ
789787:2007/05/17(木) 00:23:58 ID:???
んんん?All utf8な環境で書く場合は、従来のAll eucやらsjisと同様に
書けば良いという事?
790:2007/05/17(木) 09:28:17 ID:???
>>788
あたりまえの理由を書けよクズ
それともしらないのか?
791nobodyさん:2007/05/17(木) 10:24:33 ID:???
1さん乙ですwww
7921:2007/05/17(木) 11:35:11 ID:???
嘘です
793nobodyさん:2007/05/17(木) 14:27:16 ID:???
入力された文字列にUTF-8フラグを付け忘れて文字化けしてるんじゃ?
794nobodyさん:2007/05/17(木) 18:46:04 ID:???
A---------------------------
while (defined($_ = @log)) {
処理
}
----------------------------

B---------------------------
while (@log) {
処理
}
----------------------------

C---------------------------
foreach (@log) {
処理
}
----------------------------


foreachだと配列を最初に全部読込む
whileだと1つずつ読み込む
AとBは同じ意味

だと思って負荷のかかりそうな場所をCからBにしたら、
無限ループになっちゃうんだけど、どこが間違ってるの?
795nobodyさん:2007/05/17(木) 18:57:19 ID:???
本嫁本
796nobodyさん:2007/05/17(木) 19:31:20 ID:???
それじゃ常に真が帰ってる
あと、すでに配列に入ってるなら置き換えは意味ないよ
797nobodyさん:2007/05/17(木) 19:32:16 ID:???
>>794
まあなんだ、配列をその形で処理したいんならCでやっとけ
798794:2007/05/17(木) 21:10:10 ID:???
なるほど
799nobodyさん:2007/05/17(木) 22:21:08 ID:???
while (defined ( $_ = shift @log )) { }
には、それなりに置き換える意味が無くもないんだが。。。
800nobodyさん:2007/05/17(木) 22:36:56 ID:???
while (@log) {
 すごい処理($log[-1]);
 pop @log;
}

B方式でも無限ループにならないようにはできるけど、なんつーか、アレだなぁ。
801nobodyさん:2007/05/17(木) 22:50:58 ID:???
Cには@logの中身を書き換えようっていう意思が感じられるが、
Aは何のために$_に入れてるんだか・・・
802nobodyさん:2007/05/18(金) 02:50:38 ID:Sqfh/ayx
$hinch = 170;
$hinch =~ s/(\d)/int($1*2.54 )/e;#掛け算
print $hinch;

だとおkなのに

$hinch = 170;
$hinch =~ s/(\d)/int($1/2.54 )/e; #割り算
print $hinch;

だとアウトなのはなんで?
803nobodyさん:2007/05/18(金) 03:03:35 ID:???
/が多いから。
804nobodyさん:2007/05/18(金) 03:03:48 ID:???
なんでわざわざ正規表現使って四則演算すんだよ
そんなだから単純な構文ミスに気がつかない。恥ずかしすぎるぞ、質問者。
805nobodyさん:2007/05/18(金) 03:17:06 ID:???
いや、ファイルの中の大量にあるpをinにしないといけなくてな。
ごめんよ。|||でいけたのでOKになりました。
806nobodyさん:2007/05/19(土) 01:05:51 ID:???
なんかもっと難しい質問ないの?

世の中簡単過ぎて詰まらないな
807nobodyさん:2007/05/19(土) 02:55:16 ID:???
神田いる?
808nobodyさん:2007/05/19(土) 07:44:53 ID:???
じゃ御言葉に甘えて。
perl -le 'print q{p N$} ^ " E<H";'
これが何故 Perl になるか教えて。出典: perlop
809nobodyさん:2007/05/19(土) 08:19:35 ID:???
アスキーコードと2進数と排他的論理和についてよく
考えればわかるよ。先頭一文字についてはこう。

ord('p')=112=0b01110000
ord(' ')= 32=0b00100000
-----------------------↓ビットごとに排他的論理和をとる
ord('P')= 80=0b01010000

他の文字についても同様。
810nobodyさん:2007/05/19(土) 10:59:19 ID:OAH9Js2+
たとえば

use CGI;
$obj->new CGI;
$obj->remote_host();

でリモートホストが返ってきますが、こういった類の「値を取得するメソッド」は、

$host = $obj->remote_host();

としてメインパッケージに覚えさせておくのと、必要になるたびremote_hostするののどっちがいいんでしょうか?
処理の効率やソースの美しさなどの観点で理由も併せて教えていただければうれしいです。

個人的には、remote_hostの処理量が少ないならば必要になるたび呼び出して、
処理量が多いならば何度も実行するわけにはいかないからメインパッケージに覚えさせる方がいいと思うのですがどうでしょうか。

自分でモジュールも開発していたりするのですが、初回実行時に処理をしてオブジェクトのメンバ変数にして覚えておいて、
次回からの実行時には処理をせず覚えておいたメンバ変数を返す、ということもできそうですがどうでしょう?

よろしくお願いします。
811nobodyさん:2007/05/19(土) 11:03:09 ID:???
windows環境でマルチスレッドな動作をするスクリプトを書くときは
どうやってますか?

cygwin perlを使えばforkを使えますがモジュールの追加が面倒、、、
activestate perlでできないでしょうか?

812nobodyさん:2007/05/19(土) 15:14:05 ID:???
ActivePerlでもfork普通に使えるけど…
forkが嫌ならthreads.pmとかどうよ
813nobodyさん:2007/05/19(土) 15:27:37 ID:???
814nobodyさん:2007/05/19(土) 19:28:23 ID:???
>>812

active perl 5.6から5.8へアップしたら動いた!
いつの間にか便利になったものだ
815nobodyさん:2007/05/20(日) 00:12:34 ID:???
>>810
いいんじゃない。
でもremote_host()の中身は、スカスカ。
816nobodyさん:2007/05/20(日) 00:33:27 ID:???
> 'remote_host' => <<'END_OF_FUNC',
> sub remote_host {
>  return $ENV{'REMOTE_HOST'} || $ENV{'REMOTE_ADDR'}
>  || 'localhost';
> }
> END_OF_FUNC

スカスカっていうか、業務内容があっさりしてるよね。
gethostbyaddr() を叩くわけでもなく。
817nobodyさん:2007/05/20(日) 00:35:23 ID:???
>>810
remote_host() に関して言えばどちらもさして変わりません。

効率から言えばキャッシュしておいて参照するほうが総合的に良いでしょう。変数の為のメモリ領域を投資してメソッドコールのオーバーヘッドを回避できるからで、これはそう悪い取引ではないように思います。
ただし、>>815 が言うように remote_host() は「スカスカ」 (通常、定義済の %ENV ハッシュを参照して返すだけ) なのでその差は僅かです。

従って、あえて気にするとすれば remote_host() の「処理量」ではなく、「実行回数」ですが、どの程度差が出るのか調べてないのでわかりません。

> 自分でモジュールも開発していたりするのですが、初回実行時に処理をしてオブジェクトのメンバ変数にして覚えておいて、
> 次回からの実行時には処理をせず覚えておいたメンバ変数を返す、ということもできそうですがどうでしょう?

もうお分かりかと思いますが、その方法では少なくとも処理効率面でのメリットは出ません。もちろんコードが明瞭になる、あるいは設計上そうなっているのが自然であるといった理由でそうすることは常に可能です。

また、モジュールを書かれているとのことなので参考までに、なぜレキシカル変数を使わず、明示的に「メインパッケージ」に拘っておられるのかはお聞きしておきたいところです。
818nobodyさん:2007/05/20(日) 12:07:45 ID:LynxL8Gs
MySQLやSQLiteが使えない上に、
標準モジュール以外ではピュアPerlのモジュールしか使えない環境下で
SQLに適したデータを扱うにはどうしたらいいでしょうか?
これまではData::DumperやStorableを使ってきたのですが、
SQLもどきが使えてなおかつ早い方法があればご教示お願いいたします _ _
819nobodyさん:2007/05/20(日) 14:12:51 ID:???
>>818
その案件に関する契約を投げる。
820nobodyさん:2007/05/20(日) 14:45:34 ID:???
Sprite.pmはPurePerlだったような…
821nobodyさん:2007/05/20(日) 15:07:59 ID:xkL2RLiD
Googleで、ある文字列(例:2ちゃんねる)の検索結果1000件分のURLを抽出したいと思っています。

そこで次の方法について教えてください。

1.Googleの検索結果のHTMLファイルをローカルにダウンロードする方法
2.ダウンロードしたファイルからURLとページのタイトルを抽出する方法

よろしくお願いします。
822nobodyさん:2007/05/20(日) 15:19:57 ID:???
禁止です
823nobodyさん:2007/05/20(日) 15:49:24 ID:???
ほとんどプログラム作成依頼だなw
824nobodyさん:2007/05/20(日) 15:58:24 ID:???
1. LWP
2. RegularExpression
825nobodyさん:2007/05/20(日) 16:13:41 ID:???
PURE PERLなSQL鯖とそれ用のDBD書けばおk
826821:2007/05/20(日) 16:19:15 ID:???
>>824
1は、LWPのgetstoreを使えばできそうですね。どうもありがとうございます。
827nobodyさん:2007/05/20(日) 17:32:02 ID:g+N1wV/c
IPの範囲が216.98.224.0/20 (216.98.224.0〜216.98.239.255) だとして、
216.98.228.0が上記範囲範囲内にあるかどうか
調べるにはどうやれば良いのでしょうか。
828nobodyさん:2007/05/20(日) 18:25:55 ID:???
一旦IPをintに変換すれば楽になるんじゃないかな
829nobodyさん:2007/05/20(日) 19:14:12 ID:???
おれだったらunpackで2進変換して先頭20バイトが同じかどうか
830818:2007/05/20(日) 22:14:02 ID:???
>>820
thx!それが最良解みたいですね。それでいってみます!
831nobodyさん:2007/05/21(月) 02:51:41 ID:???
>>827俺は超初心者なんで短い文を作れないが、とりあえず↓みたいなのでどうかな?
メモ帳に↓を丸々コピペして、拡張子を.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;
832nobodyさん:2007/05/21(月) 02:58:24 ID:???
↑ごめ。

試したら常に8になって範囲内でも5にならないw

失敗作スマソ 出直してくる
833nobodyさん:2007/05/21(月) 03:16:08 ID:???
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]){ 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文は無効でつか?
834nobodyさん:2007/05/21(月) 03:23:35 ID:???
あ、もう1回試したら成功しますた。
連書きスマソです。
>>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を返す
}
835nobodyさん:2007/05/21(月) 03:24:45 ID:???
>>833

if文の中のif文は有効。
この場合、二番目のifはfalseになっているだけ。

頑張れ
836nobodyさん:2007/05/21(月) 03:39:36 ID:???
>>835
がんがりますた

先生!
>>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[]を省いた分だけ早い気がすることに今気付きましたがどうなんでしょう!?
837nobodyさん:2007/05/21(月) 03:51:16 ID:???
my $cidr = '216.98.224.0/20';
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に負けてるかも知れない。
838nobodyさん:2007/05/21(月) 03:57:41 ID:???
>>836
俺は>>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
839nobodyさん:2007/05/21(月) 04:07:14 ID:???
>>838
第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を返す
}
840nobodyさん:2007/05/21(月) 04:24:55 ID:???
ついでに最近知ったmapってやつを使ってみました。
ここまで短くできるとは思ってなかった罠。


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
}
841nobodyさん:2007/05/21(月) 04:29:16 ID:???
my $ip="216.98.228.0";#調べたいIP
my @hani=("216.98.224.1","216.98.239.255");#最小と最大の範囲

のときは8でいいの?
842nobodyさん:2007/05/21(月) 04:33:53 ID:???
IPのことよく知らないけど、なんとなく8じゃダメっぽい?

一番右のが範囲外でも、それより右が範囲内で且つイコールじゃない場合は5を返さないといけないのかな?
それなら書き直しかも・・・
843838:2007/05/21(月) 04:34:09 ID:???
それ、俺が余計なことを言ったせいだ。がんばってる人、ごめん。
844nobodyさん:2007/05/21(月) 04:34:39 ID:???
× それより右
○ それより左

とりあえずもうちょっとがんがってみまつ
845838:2007/05/21(月) 04:40:44 ID:???
すまそん、ボケてる。
元のコードでも return 8 (5であるべき)だね。酔っ払ってるときに書くのは控えよう。
846nobodyさん:2007/05/21(月) 04:50:58 ID:???
CIDRなら、
> 216.98.224.1
みたいに1で始まることは無いから、考慮しなくてもいいんじゃないか。
別の用途も考えているのなら、話は別だけど。
847nobodyさん:2007/05/21(月) 05:11:04 ID:???
とりあえずでけた。

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で短くしてみまつ。
848nobodyさん:2007/05/21(月) 05:33:12 ID:???
できますた。

#!/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;
849nobodyさん:2007/05/21(月) 05:36:13 ID:???
あ、ちょっと勘違いしてますた。完全書き直しorz
850nobodyさん:2007/05/21(月) 05:44:45 ID:???
あ、>>848で大丈夫でした。
疲れてボケてるので眠ります。
851nobodyさん:2007/05/21(月) 05:53:07 ID:???


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が出ないとダメ。

また起きてからにしてマジ眠ります。
852nobodyさん:2007/05/21(月) 07:41:50 ID:???
気になって眠れなかったので続けてみました。
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;
853nobodyさん:2007/05/21(月) 08:19:03 ID:???
うわぁ。
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とどっちがいいでつか?
854nobodyさん:2007/05/21(月) 08:23:32 ID:???
って>>837に既に答らしきものがあったな・・・俺の夜一日はいったいOTZ
855nobodyさん:2007/05/21(月) 08:25:10 ID:???
初心者は回答しなくて宜しい
856nobodyさん:2007/05/21(月) 08:29:27 ID:???
激しくスマソ。
便乗して練習してたんだけど、さすがにレスしすぎだな俺orz
857nobodyさん:2007/05/21(月) 09:18:44 ID:???
Net::IP
858nobodyさん:2007/05/21(月) 11:26:17 ID:???
こういう試行錯誤してるのをみるのはいろいろためになるしいいんでないかに?
859nobodyさん:2007/05/21(月) 12:42:09 ID:???
「初心者」質問スレとしては「オーソドックスな解」が展示されない方が問題ないか?
まあ、答えるまでもないって意見があるだろうけどさ。


--- 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} } ;
860nobodyさん:2007/05/21(月) 14:30:17 ID:???
>>859
それはねーよ!
861nobodyさん:2007/05/21(月) 14:52:30 ID:ZiElqTGz
1、掲示板の連続投稿を禁止したい
2、以下のようなプログラムを足しました。
# 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が正常に作動していません
とでました><

どこに問題があるか教えてください。
862nobodyさん:2007/05/21(月) 15:11:25 ID:???
>>861
その「500」は、HTTPステータスコードと呼ばれるもので、
エラーコードではありません。

まず、あなたのPCにPerlをインストールするところから始めましょう。
863nobodyさん:2007/05/21(月) 15:12:14 ID:???
>>861
構文としてはif( =~ が間違ってると思われ。
まぁ、前回IPでの比較より前回投稿内容との比較のほうがよいのかなーと。
(単純に連続投稿を拒否りたいなら話がそれたのはスマン)

つかREMOTE_ADDRを$ipに入れてるのにwhileで$ipに読み込ましたらぐっちゃになるよ。
864nobodyさん:2007/05/21(月) 15:13:09 ID:???
>>859
そのサブルーチンhogeは、"216.98.224.0"から"216.98.239.255"を全て文字に変換してるんでつか?
で、mapのおかげで文字と1が対として%addrに入っていくと。
で、最後のif文で"216.98.228.0"をサブルーチンhogeで文字にして、$hddr{文字}って形にしてそれが存在すればtrueを返す

という感じの処理でOKでつか?
ハッシュもq{}なんて書き方もA3x1とかの意味とかもよくわからないけど。

メモリーとかの効率的には良いのかな?
文は短いけどhogeで文字に変換する量が多い気がしまつ
865861:2007/05/21(月) 15:30:13 ID:ZiElqTGz
ご指摘ありがとうございます。変数の被りを修正します。変数の中の文字列
をマッチングで調べるフリーのソースをどこかでパクって着ます。
866nobodyさん:2007/05/21(月) 15:34:23 ID:???
>>861
その前にプログラミングの勉強をしたほうがいいんじゃないか...
867nobodyさん:2007/05/21(月) 17:01:24 ID:???
>>864
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 して確認を。
868nobodyさん:2007/05/21(月) 17:07:07 ID:???
>>861
俺は初心者で、そんなオープンとかクローズとか作ったことは無いが、
俺なりに修正してみる。
と、その前に、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されないので、ファイルを閉じて処理を続行させる。
}
869nobodyさん:2007/05/21(月) 17:27:30 ID:???
q{}とかqq{}って言う書き方はじめて知った。
これ何か利点あるの?
870nobodyさん:2007/05/21(月) 17:34:25 ID:???
>>868

while (<IN>) {
@a=@_; #ファイルを一行ずつ配列@aにコピー
}
my$a=pop @a; #最後の配列(一番下のIP)を$aに格納

この辺は
@a = <IN>;
$b=$a[$#a];
でいいような。
871nobodyさん:2007/05/21(月) 17:34:45 ID:???
nobody権限で動くCGIからApacheの再起動をする方法ってありますか?
方法が書いてあるページのURLでもいいです。エロい人教えてください。
872nobodyさん:2007/05/21(月) 17:36:17 ID:???
>>869
1. q{ } なんかでスペースを入れる時目立つ
2. 同様に ', " のプリント時にも便利。エスケープを考慮に入れんでもよくなる
3. ワンライナー時に便利
4. 趣味の問題
873nobodyさん:2007/05/21(月) 17:47:36 ID:???
>>861

>>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されないので、ファイルを閉じて処理を続行させる。
}
874nobodyさん:2007/05/21(月) 17:53:58 ID:???

プログラムの最初の行、正しくは
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)}
875nobodyさん:2007/05/21(月) 18:14:05 ID:???
>>867トンクス
理解しますた!
876nobodyさん:2007/05/21(月) 18:26:31 ID:???
オレもPerlは超ド素人なんだけど、
ip.txtの書式を1行目が最新になるようにした方が良いのでは。
そしたらwhileで1行目だけ取れば済むし。
ログの長さにもよるけど、最新のIP抜くためだけに
@a=<IN>;
とか、メモリの無駄遣いな気がして気持ち悪いんだけど、
そういう話は筋違いかな。
877nobodyさん:2007/05/21(月) 18:38:08 ID:???
>>876
俺もそう思う。
だけど>>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)}
878nobodyさん:2007/05/21(月) 19:04:20 ID:???
もっとまとめてみます。(サブルーチンにするメリットは、プログラムに組み込むときに変数が被らない。)


#サブルーチン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)}
879nobodyさん:2007/05/21(月) 19:06:33 ID:???
>>867
テーブル作るんなら大小判定する関数作って、計算するつどキャッシュを
作成する方が効率的だと思うがなあ・・・
もし、オーソドックスという点にこだわるなら・・・
880nobodyさん:2007/05/21(月) 19:30:47 ID:???
>>879
俺の読解力が足りんのかもしらんが、
そもそもの目的が「大小判定の確定」であるわけで、
"大小判定する関数作って"ってその時点で終了じゃん。
今回は 3つのIP addrの大小関係の確定だよ?

汎用化したいなら、"計算する都度キャッシュ"ってのが
登場するかもしらんが今回の何処にその必要があるの?
881nobodyさん:2007/05/21(月) 20:05:29 ID:???
>>867
# print "true\n" if $one <= $query and $two >= $query ;
と、これ
my %addr = map{ $_ , 1 } $one .. $two ;
print "true\n" if defined $addr{ $query } ;
明らかに後者のほうがコストが高いよね。
そこまでしてハッシュテーブルを作る意図は?
882nobodyさん:2007/05/21(月) 20:06:35 ID:???
>>867はモダン云々以前に問題が多すぎ。

・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進数で扱われてる。
883nobodyさん:2007/05/21(月) 20:14:10 ID:???
なんでこんな事してるのかしらんが、
自分で書くなら>>829がどう見ても一番オーソドックスだろ。
ネットマスクも知らない輩が紛れ込んでるんですか><
練習なら別のスレでやった方がいいんじゃね。

回答としては>>857
884nobodyさん:2007/05/21(月) 20:20:24 ID:ESAJpJh1
Debian4.0 apache2.3.3 perl5.8.8 CGI.pm3.15 です
CGIプログラミング第2版のサンプルコードで
CGI.pmによるファイルのアップロードを試みてますが
my $q = new CGI; 直後に生成される一時ファイル
/var/tmp/CGItemp58428 がどうしても空ファイルになります
CGI.pmのどこかを修正したら改善するでしょうか?
885nobodyさん:2007/05/21(月) 20:48:55 ID:???
掲示板の連投制限の話してる人へ

普通時間も考慮してあげないと人気ないサイトだと
いつまでたっても書き込みできないと思うんだ。

#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;

886nobodyさん:2007/05/21(月) 21:13:22 ID:???
IPネタの人はいい初心者が頑張ってるなと思って生ぬるく見守ってたけどいい加減あきてきた。
おっちゃんが使い方も教えてあげるから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;
887nobodyさん:2007/05/21(月) 21:18:15 ID:???
>>884
enctype?
888nobodyさん:2007/05/21(月) 21:27:52 ID:???
>>871
sudoでnobodyユーザが再起動できるコマンド叩けるように設定してあげれば?

889nobodyさん:2007/05/21(月) 23:18:03 ID:???
ネットマスクも知らん初心者でつ。

>>885dクス
さすがにほれぼれしまつ。

>>886
難しい・・・けどトンクス
890861:2007/05/21(月) 23:57:03 ID: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);
891871:2007/05/22(火) 01:38:22 ID:???
>>888
そうだ、sudo使えばできそうです!ありがとうございます!
全然perlの質問じゃなかったです…orz
892nobodyさん:2007/05/22(火) 01:46:59 ID:???
結構危険なのでランダムでなおかつ長めのディレクトリに置くことをオススメする。
893nobodyさん:2007/05/22(火) 03:30:33 ID:???
>>889
IO::File::flockもNet::IPも標準のモジュールじゃないけど
(たしか)pure perlなんで使いやすいと思うよ
適切なディレクトリほってファイルあっぷするだけで使える。
んで>>885>>886もモジュールがすごいだけでコード自体は大して難しい事してない

>>890
これから勉強するなら
use strict;
use warnings;
はいれといたほうがいいよ。
あと、ほんとはテスト用の環境用意するべきだけど
せめて
use CGI::Carp qw(fatalsToBrowser);
いれとくと、エラーの原因わかりやすくなるので
おすすめ

>>892
sudoへのアドバイス?
sudoの設定できるくらいだし専用サーバなんじゃ?
しっかりIP制限とか認証かけといて
gracefulのみならそんなに危険でもないんじゃないかな(楽観主義)


894nobodyさん:2007/05/22(火) 07:30:54 ID:???
即時でなくていいのなら

CGIはnobodyで書ける決められたところにファイルを作る

cronか何かで定期的にそのファイルができてないかチェック、
できていたらapache再起動

とすると安全かもね。
895nobodyさん:2007/05/22(火) 11:36:17 ID:???
>>894
なぜそれで安全になるのか理解できないというか
待ち時間が増えて不便なだけかと思うのですがどうでしょうか?

より安全に行うなら、suexec使うとかメール使うとか
UID変更できる方法にするべきだと思うんです。
896nobodyさん:2007/05/22(火) 11:48:38 ID:???
sudoの設定間違いやsudoで起動できるようにしたコマンドのつくりが
甘くて権限昇格したままいろいろやられるというのは防げるだろ。

もちろんcronの方はapacheを再起動できる権限をもったユーザで
はじめから動かすのが前提。ここでsudoとか使っちゃ意味なし。

UID変更がからむとsudoにしろsuexecにしろメールにしろ相当注意
して作らないと予期しない穴ができちゃうことがあるから、
はじめからやらないのが安全なのです。

あとは便利さと安全のトレードオフになるのでポリシー次第。
897nobodyさん:2007/05/22(火) 13:45:40 ID:???
>>886が何をやってるのかさっぱりわからない…むずかしいなー
898nobodyさん:2007/05/22(火) 13:47:53 ID:???
>>896
とりあえずsudoは危ないプログラムなんですね。
ポリシーというか考え方の違いだけみたいなので気にしなくてよさそうです。

わざわざ便乗質問に答えていただいてありがとうございました。

899nobodyさん:2007/05/22(火) 21:26:32 ID:7d28ZEnp
-P オプション で使えるCのプリプロセッサですが
起動が多少遅くなるので
別な方法がないか教えてもらえませんか

使用用途としては
下記のようなものです
単にifで分けると モジュール部もすべて読み込むようなので
両方ともないとエラーになりました
evalで囲めばそれっぽくうごきますが
しっくりきません。

#ifdef HOGEHOGE
use HOGEHOGE;
〜〜〜
#else
use HOGEHOGE2;
〜〜〜
#endif
900799:2007/05/22(火) 21:47:05 ID:???
すみません プログラム板に引っ越します
901nobodyさん:2007/05/22(火) 22:17:27 ID:???
use tt; ?
902チラシの裏:2007/05/23(水) 12:08:09 ID:???
条件 ? 真のときに評価 : 嘘の時に評価;という式を3項演算子といいます。
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,$_)}
といった感じで利用するのを想定してあります。
903チラシの裏:2007/05/23(水) 12:09:06 ID:???
refが帰ってこなかった場合は、(Net::IP->new($_[1]) or die(Net::IP::Error()) )を評価します。
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 等が
返ってくる可能性がありますがそろそろマニュアル読んどけ・・・となります。
904nobodyさん:2007/05/23(水) 14:41:44 ID:rLN6zRz3
1)半角カタカナを含む投稿やNGワードを含む投稿を弾きたい
2)元はそんな機構のない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'}
905nobodyさん:2007/05/23(水) 14:54:40 ID:???
$s=$form{'title'}.$form{'name'}.$form{'coment'}.$form{'memo'};

エスパーじゃないのであしからず。
906nobodyさん:2007/05/23(水) 15:06:06 ID:hQrYM6c4
すみませんが 質問させてください

あるファイル(数万行の数字データ)の上から1行ずつ順番に読み込んで
最終行になるとまた1行目に戻って・・・という作業をしたいのです
途中でプログラムを閉じて再開したときも次の行から開始が可能であれば
もう言うことナシですが,残念ながら自分では何とも出来ず

丸2日間ネット上で調べに調べ

srand();
open(FILE, "data.txt");
rand($.) < 1 and $line = $_ while <FILE>;
close(FILE);
$line =~ s/\n//g;

とランダムで1行読み込む仕様で妥協するのが限界でした
もし上記作業がperlで可能でしたら申し訳ないですが
教えていただけないでしょうか

可能な方いらっしゃいましたら どうかお願いします。
907nobodyさん:2007/05/23(水) 15:16:05 ID:???
>>906
誘導されて移動したのに「いつ終わるんだそれは」からやり直しですか。
で、向こうと同時進行?

Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/753-767
908nobodyさん:2007/05/23(水) 15:17:20 ID:???
処理の内容をもう少し具体的に書いてくれないと何とも言えないなぁ。
というか、どの程度の理解の下で実行しようとしているんだろうか。
そっちの方が怖い。
909nobodyさん:2007/05/23(水) 15:22:20 ID:???
むしろム板の範疇なのでは?とオモタ。
まさか鯖で扱うのか?
910nobodyさん:2007/05/23(水) 15:23:41 ID:???
$SIG{HUP} = $SIG{INT} = $SIG{PIPE} = $SIG{QUIT} = $SIG{TERM} = \&savepos;

sub savepos{
open(SAVEFH, ">position.txt");
print SAVEFH $readpos;
close<SAVEFH>;
}

適当だがw
911905:2007/05/23(水) 15:26:05 ID:???
あまりに長くなるのもご迷惑かと思い
「いつ終わるんだそれは」からは省略しました
申し訳ないです
「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行ずつ
順番に表示していくのが目的です

自分ではなんとかなるかな・・・と甘く考えてたんですがもし
私の予想に反してかなり大変なものになるのでしたら諦めます
正直 なんとかしたいのはやまやまですが 無茶を言うつもりじゃないですので
その辺りはご理解ください・・・
912チラシの裏:2007/05/23(水) 15:28:02 ID:???
tellの結果覚えといてseekで移動してeofなら頭に戻って読み込む
って感じでできないかな?
913nobodyさん:2007/05/23(水) 15:28:40 ID:rZP+yFAn
>>904
テキストエリア分しかアンエスケープしてないのでは?w
ちなみにjcode.plにはh2zという半角->全角変換が付いています。
914nobodyさん:2007/05/23(水) 15:29:05 ID:???
駄目だこの質問者
回答を無視しやがる
俺はもう答えないわ
915nobodyさん:2007/05/23(水) 15:32:29 ID:???
>>912 名前が残ってたOTL
916nobodyさん:2007/05/23(水) 15:32:52 ID:???
> ご理解ください
なんて言い回しを使うやつにろくなのはいない
917nobodyさん:2007/05/23(水) 15:36:05 ID:???
もう諦めろ
918nobodyさん:2007/05/23(水) 15:38:07 ID:???
>>911
>5秒おきにIEでdata.txtの上から1行ずつ
>順番に表示していくのが目的です

これを最初に書けよな・・・。

JavaScriptにしとけ。
http://pc11.2ch.net/test/read.cgi/hp/1178526934/
919906:2007/05/23(水) 15:38:28 ID:???
お騒がせしました
簡単にできると甘く考えてました

まさかそんな大変似なこととは知らず申し訳なかったです

912 さんのヒントをもとに検索しながらもうすこし頑張ってみます
それでダメなら諦めます
920nobodyさん:2007/05/23(水) 15:45:00 ID:???
>>911
仕様を聞いた限りでは添字をファイルから読み込んで、++して
更新しながら自分(aaa.cgi)を呼び出して行くだけのような気がする。
921nobodyさん:2007/05/23(水) 15:47:01 ID:???
仕事がすすんでなくて現実逃避中なんです。
#!/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;
922nobodyさん:2007/05/23(水) 16:02:06 ID:???
@hoge = ('c','r','f','a','e','f',.....);
というような英字一文字のみの配列があり
その要素を置換する場合、どうするのが一番スマートでしょうか?
(配列に入れる前に置換しておくことは都合上できません。)
923nobodyさん:2007/05/23(水) 16:05:45 ID:???
お前は検索するより先にまず基礎を固めたほうがいいと思われ。
ファイル入出力の仕組みとかぜんぜんわかってないだろ。
924906:2007/05/23(水) 16:06:48 ID:???
>>920
うまく伝わって安心しました
まさにそのとおりです
結構単純な作業なので なんとかなるか・・・と安直に考えてました

>>921
忙しいとこありがとうございます!
今 使わせていただきましたが 私の使い方(コピペ位置?)が悪いのでエラーが出ています
しかしこれだけのものをいただけるとなんとか出来そうな気がしてきました
それにしてもまさかこれほど膨大なものになるとは思っても見ませんでした・・・
本当にありがとうございます
925nobodyさん:2007/05/23(水) 16:07:28 ID:???
一番かしらないけどこういうこと?
my @hoge = ('c','r','f','a','e','f',...);
my %table = ('置換前文字列' => '置換後文字列',...);
@hoge = map { exists $table{$_} ? $table{$_} : $_ } @hoge;

>配列に入れる前に置換しておくことは都合上できません。
どういう都合か興味があるので教えてもらえませんか?

926nobodyさん:2007/05/23(水) 16:08:13 ID:???
grep tr/r/R/,@hoge;
927nobodyさん:2007/05/23(水) 16:09:16 ID:???
>>922
要素を置換とだけいわれても何のことやら。どういう風に置換したいのか書け。
928922:2007/05/23(水) 16:27:02 ID:???
>>925
なるほどハッシュを使えばうまくいきますね!
ありがとうございます。

事前に置換しておけない理由は、配列内の要素はそれ自身も別の処理で利用していて、
置換後の変数が確定するのがその処理よりも後になることがあったからです。

助かりました。ありがとうございました!

>>926
レスありがとうございます。
mapで対応できそうなので、そちらを利用したいと思います。

>>927
言葉足らずですみませんでした。
今更遅いですが、英数一文字に対して一つの「特定の文字列が代入されている変数」に置換したいと考えていました。
929nobodyさん:2007/05/23(水) 16:33:07 ID:???
>>928
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万件処理時

930nobodyさん:2007/05/23(水) 16:40:39 ID:???
trだと変数は使えないか。

$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万件処理時
931nobodyさん:2007/05/23(水) 16:47:14 ID:???
mapやforではなくgrepで回すのってなにか利点があるのでしょうか?

932nobodyさん:2007/05/23(水) 16:55:23 ID:???
配列をテーブル使って変換だから、hashでtableを実装して、map使うのが筋。

だけど、変換後の配列へのアクセスは十分多いんだよねぇ?
少ないなら、必要になるたびにhashにアクセスすれば十分。
そうなるとそもそも「置換」である必要がない。

単に、『1文字の英数字をキーとして、対応する変数を返す』ための処理に何が良いか?
という問題に帰着することがわかるから、hashに対応表を構築するという解は自然。

問題設定のやり方を考えた方がいい。
933nobodyさん:2007/05/23(水) 16:57:55 ID:???
grepをそのままmapに置換しても動きますよ。
平均で0.02秒程度遅くなりますけどね。

後学のために今5件置換まで試したけど
7件越した辺りでテーブルに追い付かれそう。
934nobodyさん:2007/05/23(水) 17:04:23 ID:???
>>933
英数字は大文字小文字合わせて 10+26+26 = 62あるから、
半分ぐらいしか元にないとしても30項目ぐらいのtableをlookupしたほうがいいでしょ、たぶん。
tr中で変数展開はevalしないと無理だし。

元ネタで英数字になっているkeyが、数値だったら配列によるtable lookupに書き換えられて、
もっと速くなったりしないのかな。perlの添え字演算遅いからhashと大差ないかも。。
935nobodyさん:2007/05/23(水) 17:10:35 ID:???
>>934
ちなみにテーブルを作る時間は抜いてあります。

      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";

こんな感じ。
936935:2007/05/23(水) 17:18:41 ID:???
あぁうそです。テーブル作る時間も完全に含んでます。
sでtrみたいな変換(aをA、bをBみたいな)は出来ないのかなぁ。。
937nobodyさん:2007/05/23(水) 17:19:55 ID:???
>>935
> 10 @hoge = map { exists $table{$_} ? $table{$_} : $_ } @hoge;
この処理で、$table{$_}=$_ な状態を予め用意しておけば、条件判断が省けて、なお速くないですか?
keyは最大でも62通りに限定されているわけですし。

5-7行目の処理は push @hoge, ('r')x1000000; でいいんのでは?
938nobodyさん:2007/05/23(水) 17:28:38 ID:???
で、たぶん、%tableは、
%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',
...
);
こんなふうに構築すればいいんじゃないかと。
939nobodyさん:2007/05/23(水) 17:38:52 ID:???
>>937
まぁそうですね。色々試しましたが、後方参照は既に別の場所で
使ってるスクリプト内と、そうでないスクリプト内で比較が大幅に
変わりますので、後方参照に手を出したとこで降りました。

結論としては変数使うか使わないかが全てですね。
使わないならgrep tr/abcd/efgh/,@hoge;が最速だし、
一番わかり良いと思いますよ。
940nobodyさん:2007/05/23(水) 17:54:23 ID:???
>>939
いや、「置換」て言葉に惑わされちゃだめですよ。
元の'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 〜 と同等(うちの環境では)
941nobodyさん:2007/05/23(水) 18:10:06 ID:???
>>940
たんなる大文字小文字変換だったりしてw
942nobodyさん:2007/05/23(水) 18:21:56 ID:NYd4g07l
logファイルの1行だけ書き換えるにはどうすればいいのでしょうか?
943nobodyさん:2007/05/23(水) 18:53:38 ID:???
なぜgrepなんだ?あと同じ@hogeに入れるくらいならfor使う方が自然な発想じゃないか?
for(@hoge){tr文}
944nobodyさん:2007/05/23(水) 19:03:08 ID:???
>>933のmapよりgrepの方が早いって話がきになって
ベンチマークとってぷ板に聞いてきました。
http://pc11.2ch.net/test/read.cgi/tech/1173880452/778-

>>943
うんうん、元のデータを変更しないで新しい配列作るならforかmapだし
元のデータ変更していいならforが自然だと思うのです
945nobodyさん:2007/05/23(水) 21:25:36 ID:???
grep が不自然っていうよりか、今の用途で使うのは

同じ箸だからってんで火箸で料理を作ってるようなモンだろ?
で、「火箸の方が固いし腐らないよ」って主張してる。

言い過ぎに感じるかもしらんが、それくらい変。
上司にバレたら呼出くらうし、部下にバレたら、それ以降
何を言ってもフィルターかけられて見られる。
946nobodyさん:2007/05/23(水) 21:45:44 ID:???
>>945
> 上司にバレたら呼出くらう
それはねえだろw
茶のみながら「perldoc読みなおせ」くらいで済むんじゃないw
947nobodyさん:2007/05/23(水) 22:52:24 ID:???
>>904
$sに代入しているタイトルは $FORM{'title'}
タイトルが記入されていませんのエラー判定のタイトルは $form{'title'}
違う変数だわな。
use strictを指定してperlに教えてもらいなさい。
948906:2007/05/23(水) 23:06:05 ID:???
すみません
数値を数万個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行目から再び読んでくれるようにする行程です

急遽必要になって必死でやったんで これでも感動ものです・・・^^;
949nobodyさん:2007/05/24(木) 00:10:10 ID:???
>>948
例えば、「こんなガスコンロ自作したいので教えて」とド素人が言ってきて
その道の人が色々と安全に自作できるように作り方を教えてあげた。
ところが、ド素人ゆえに理解できないのか理解する気がないのか、
アドバイスも何もかも無視して、
「ムチャクチャなんですけど、何とか作ってみました。あと一息ですが、ここまでできただけでも感動ものです!」
と自分なりにガスコンロを作り上げた。
ところが、ガス管は外れかかってるし、火力は調節できないし、という危険な装置だった。
聞けば、既にその装置を試用しつつ改良を加えているらしい。
さて、ここで一番問題なのは、非常識な当の本人だけではなく
そいつと同じマンションにたまたま居合わせてしまった他の住人までもが
危険な状態にさらされてしまうってことだ。
950nobodyさん:2007/05/24(木) 00:12:36 ID:???
要するには

共有鯖でやってくれるな

ってことだな
951906:2007/05/24(木) 01:02:23 ID:???
あー 自分のPCで動かすんで大丈夫です
心配おかけしました
952904:2007/05/24(木) 02:43:26 ID:???
Σ(@@;;;;;
大文字と小文字か・・・っ!!

ありがとうございました(><)
953861:2007/05/24(木) 10:14:27 ID: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にならなかったら怖いので実行できない
954nobodyさん:2007/05/24(木) 11:21:06 ID:???
いちいち他人に聞かなきゃできないんだったら
やめちまえ
955nobodyさん:2007/05/24(木) 11:43:03 ID:???
-e とかつかえよ
で、ここは宿題を教えてもらう場所じゃないからな
956861:2007/05/24(木) 11:51:00 ID:hyRyij45
申し訳ありませんでした。
製作環境を先に作ることにします。
ウインドウズ用のパールが借りているサーバーと一部互換性がなくうまくいき
ませんでした、やはりリナックスを買うべきでしょうか><


957nobodyさん:2007/05/24(木) 11:53:09 ID:???
日本語でおk
958nobodyさん:2007/05/24(木) 12:30:25 ID:???
>>948

>>620-623 を嫁
959nobodyさん:2007/05/24(木) 12:30:41 ID:???
>>953
それ常に0ですからwってか改造スレ行ってください。

>>948
自分で頑張るのはいい事だと思うけど頑張る方向まちがった感が…
張られたソースと数レス前みれば解決しそうな内容なのにな

960906:2007/05/24(木) 15:10:45 ID: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行目に戻る方法!
ほぼ徹夜でやって未だ成功しておりません.....
961nobodyさん:2007/05/24(木) 15:45:15 ID:???
while(1) {
}

で囲めばよくね?
962nobodyさん:2007/05/24(木) 15:51:49 ID:???
もはやどこまで本気なのか。。 $#array とだけ書いておこう。
963nobodyさん:2007/05/24(木) 16:14:37 ID:???
てか tell/seek を使ったほうがメモリの節約にもなるだろう・・・
もう無視でいいんじゃね?
人の話聞かないんじゃアドバイスするほうも惨めだわ
964906:2007/05/24(木) 17:06:14 ID:???
>>961
助かりました!
私の場合ブラウザの「更新」を押す度にdata.txt内の次の数字が
表示されるようにしたかったのですが「while」のヒントをいただいて
調べていると「if」が使えることに気付きました

>>962
$#arrayは何か使いやすい重要なヒントなんだと思います
しかし検索すると「$#」の部分が無視されてうまく検索できません
コレを使うともっともっと改良の余地があるのでしょうね・・・

>>963
すみません。。
tell seekについては調べたのですが「xxxバイト先を指定する」とからしく
xxx行目を指定する場合に私の知識では上手く使いこなせず断念してしまいました
気分を害してしまい申し訳ないです・・・


以下が完成したものです
これで更新を押す度にdata.txt内の次の行が表示され,最終行に行くと
1行目に戻っているようです
なんか表示までが多少モッサリした気がしますが・・・
965906:2007/05/24(木) 17:07:31 ID:???
(続き)
なにかもし「ここはいくら何でもこうした方がよい」的なアドバイスがあれば
宜しくお願いいたします

#!/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

以下略
966nobodyさん:2007/05/24(木) 18:14:03 ID:???
>>906
>>893>>921はみてるんだろうか?
967nobodyさん:2007/05/24(木) 18:16:18 ID:???
data.txtがまったく変更されないか、後ろに付け足すのみならば、
どこまで読んだかを行数ではなくファイルの先頭からのバイト数で
管理することができる。そうすればseekが使えて、これはいちいち
ファイルを読み出して行数数えなくてもいいので効率的。

途中の変更があったりするんならあきらめて頭から読むしかないが、
それはいかにも効率が悪いのでそもそもデータの持ち方から普通は
考え直すね。
968nobodyさん:2007/05/24(木) 22:39:15 ID:???
同時アクセスあった場合どうなるの?
ロックとかもしないとね。うん。
969nobodyさん:2007/05/24(木) 22:53:09 ID:???
めんどくさいからDB使えよ
970nobodyさん:2007/05/24(木) 23:45:29 ID:???
今度はリファクタリングか。
完成品渡すまで帰らないんじゃないか。
971nobodyさん:2007/05/25(金) 17:41:48 ID:???
外見(css, 独自項目など)をカスタマイズ可能なカレンダーを生成(HTML)するような
フレームワークなりなんなりのモジュールってないですかね?
972nobodyさん:2007/05/25(金) 18:41:39 ID:???
973nobodyさん:2007/05/26(土) 02:02:39 ID:???
まだ、やってたのか…。↓やるから、この話は終わり。

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;
974nobodyさん:2007/05/26(土) 02:03:44 ID:???
>>973
あ、ちなみに>>906に対してのレスね。
975nobodyさん:2007/05/26(土) 02:05:58 ID:???
どうせなら 7line にしたらかっこよかったのに
976nobodyさん:2007/05/26(土) 02:17:39 ID:???
動作確認したら、間違ってた(w
ついでに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;
977nobodyさん:2007/05/26(土) 02:20:21 ID:???
$p==0?なんたら:かんたら
って
$p?かんたら:なんたら
にならない?
978nobodyさん:2007/05/26(土) 02:35:14 ID:???
>>977
なるね。…ていうか勢いで書いて>>973を上げた時点で動作確認すら
してなかったので、細かいツッコミは、かんべんしてくださいな(^_^A
979nobodyさん:2007/05/26(土) 02:40:03 ID:???
いやいや1行は78文字ですからw
980nobodyさん:2007/05/28(月) 09:50:25 ID:???
>>976
数万行のファイルをそのままメモリですか、そうですか
981nobodyさん:2007/05/28(月) 10:24:47 ID:???
亀レスな上にひどい内容www
半年ROMってろ
982nobodyさん:2007/05/28(月) 12:09:53 ID:???
相手するなよ。
983nobodyさん:2007/05/28(月) 17:39:54 ID:???
空気読まずに>>906のお馬鹿さんにプレゼント
・一気読みするよりはましだけど>>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);
}
984nobodyさん:2007/05/28(月) 18:41:47 ID:???
■やりたいこと
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>";
985nobodyさん:2007/05/28(月) 18:51:03 ID:???
print "<td>$flag</td>";

print "<td>$xx</td>";

でやってみ
986984:2007/05/28(月) 19:07:25 ID:???
>>985
やってみました。
・・・アホでした・・・orz
 if($flag eq 6){
  $flag=0;
  print "</tr><tr>";#ここが認識されてない?
     ~~~~~~~~~~~<td>〜書いてないから、ですね。
ヒントどうもありがとうございました。
987nobodyさん:2007/05/29(火) 13:03:16 ID:???
>>984
それ、最後が「</tr><tr></table>」にならないか?
988nobodyさん:2007/05/29(火) 13:25:03 ID:???
ならない。最後のtrが抜けるので最終行をprint "</tr>\n</table>\n";にしないといけない。
989nobodyさん:2007/05/30(水) 01:25:04 ID:???
print "Content-Type: text/plain\n\n";
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を読ませると途中で
ストップしてしまうことがあるみたいですが、同じ症状に出くわした人とかいますか?
990nobodyさん:2007/05/30(水) 01:32:18 ID:???
タイムアウトやんw
991nobodyさん:2007/05/30(水) 01:43:53 ID:???
それがサーバ側のプロセスは死んでなくて何かreadで待ってるっぽいし、
ブラウザもタイムアウトしないしどうなってるのかなと…。
992nobodyさん:2007/05/30(水) 06:26:25 ID:???
しっかし平然とwhile(1)するな。信じがたい。
993nobodyさん:2007/05/30(水) 09:06:59 ID:???
>>988
???
だから、最終行を「print "</tr></table>"」にしないと
結果の最後が「</tr><tr></table>」になるって事だろ?
>>997の言ってる意味わかってんの?
994nobodyさん:2007/05/30(水) 09:34:17 ID:???
>>993
やってみれば?
995nobodyさん:2007/05/30(水) 09:48:23 ID:???
0〜6は要素数7ですよ
だから割り算があってないの
算数からやり直してください
996nobodyさん:2007/05/30(水) 10:15:46 ID:???
正直俺にも>>997の言っている意味は判らん。
997nobodyさん:2007/05/30(水) 10:18:16 ID:???
>>219についてですが、削除に値しない場合は理由を教えてください。
「声優のウンコを食べる」
は7.エロ・下品の削除対象に適応できて、
「声優の子宮に住み羊水を飲む」
には適応されない理由を教えてください。我儘言ってすみません。
998nobodyさん:2007/05/30(水) 10:33:06 ID:???
スレ違い
板違い
気違い
999nobodyさん:2007/05/30(水) 11:15:48 ID:???
次スレは任せた
1000nobodyさん:2007/05/30(水) 11:34:32 ID:???
Perlコーディング初心者質問スレ Part 55
http://pc11.2ch.net/test/read.cgi/tech/1180492034/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。