2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :nobodyさん:2009/09/03(木) 23:51:12 ID:???
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/


2 :nobodyさん:2009/09/03(木) 23:52:22 ID:???
[プログラミング自体の経験が無い奴はまずココを読め]
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://ascii.asciimw.jp/books/books/detail/4-7561-3057-7.shtml
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/

[オンラインマニュアル]
最新のドキュメント: ttp://perldoc.perl.org/
perl5.8.xのドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perldoc きまぐれ訳: ttp://fleur.hio.jp/perldoc/
perldoc.jp: ttp://www.perldoc.jp/

[モジュール]
CPAN: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perlの小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl5.8Unicodeメモ]
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html


3 :nobodyさん:2009/09/04(金) 05:49:19 ID:???
いちおつー。

4 :nobodyさん:2009/09/04(金) 13:17:39 ID:???
4様

5 :nobodyさん:2009/09/04(金) 15:10:46 ID:???
私が立てた過疎スレもどうぞよろしく

【Perl,CGI】参考書籍 第四版
http://pc11.2ch.net/test/read.cgi/php/1250989562/

6 :nobodyさん:2009/09/10(木) 01:26:11 ID:tlO5UesG
最初の質問させていただきます。
演劇サークルで次に演じる脚本があるのですが、その脚本が、セリフが役名:セリフか役名:セリフで区切ってあり、
ト書きとわかりづらいということでhtmlのtableを使って表にしようとしたのですが、文法チェックにかけると
syntax error at C:\cgi\henkan\sreplace.cgi line 10, near ") {"
syntax error at C:\cgi\henkan\sreplace.cgi line 30, near "}"
C:\cgi\henkan\sreplace.cgi had compilation errors.
と出て、whileの実行式部分のカッコにエラーが出るし、それを削除してもsplitで値を代入する先の()が不要だ、と出ます。
次に貼るソースコードのどこに問題があるか教えていただければ幸いです。
わかりにくいと思いますので
要するに、
$fileというファイルの文を、$splitをデミリタにして$nameと$naiyouに分けて代入し、
$naiyouの値が空なら(ト書きのとき)$nameを$naiyouに代入、その内容を二つのファイルに分けて保存し、
最後にそれをまとめて二つの<TD>に$nameと$naiyouがきれいに分かれているhtmlファイルを作りたいのです。
下のコードのどこが問題なのか教えてください。

7 :nobodyさん:2009/09/10(木) 01:28:19 ID:tlO5UesG
#!/usr/local/bin/perl

use CGI;
$q = new CGI;

$file = $q->param('file');
$split = $q->param('split');

open(FILE, "<$file")
while($ln = <FILE>) {
$ln =~ s/\n/<br>/g;
$ln =~ s/$split/$split<b>/g;

($name, $naiyou) = split(/$split/, $ln);

if($naiyou == "")
{$name = $naiyou ;
}
unless($name == ""){
$naiyou = "$naiyou</b>";
}

続きは次に書きます。

8 :nobodyさん:2009/09/10(木) 01:29:56 ID:tlO5UesG
open(OUT,"> name.log");
print OUT "$name";
close(OUT);
open(PUT,"> naiyou.log");
print PUT "$naiyou";
close(PUT);
}

close(FILE);

open(IN,"< name.log");
@name = <IN>;
close(IN);

open(RE,"< naiyou.log");
@naiyou = <RE>;
close(RE);


print "Content-type: text/html; charset=Shift_JIS\n\n";
print "<html>\n<head><title>移動</title></head>";
print "<body><a href='kyakuhon.html'>脚本へ移動<\/a></body>\n</html>";

open(SYU,"> kyakuhon.html");
print SYU "<html>\n<head>\n";
print SYU "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-sjis\">\n";
print SYU "<title>Scenario</title>\n";
print SYU "</head>\n";
もう一度次です。長くなって申し訳ないです

9 :nobodyさん:2009/09/10(木) 01:32:15 ID:tlO5UesG
print SYU "<body>\n" ;
print SYU "<table border>";
print SYU "<tr>";
print SYU "<td width=25%><b>役・備考</b></td>";
print SYU "<td width=75%><b>セリフ・ト書き</b></td>";
print SYU "</tr>";
print SYU "<tr>";
print SYU "<td width=25%><b>@name</b></td>";
print SYU "<td width=75%>@naiyou</td>";
print SYU "</tr>";
print SYU "</table>";
print SYU "</html>";
close(SYU);
長文申し訳ありませんでした

10 :nobodyさん:2009/09/10(木) 02:41:05 ID:???
最初の open のセミコロン

今回はエラーとして出んかもしらんが、今後のためにも面倒でも use strict してくれ

それから文字列を比較するときは == じゃなくて eq な
特に空文字かどうかの比較は

$hoge eq '';
$hoge ne '';
みたいに書く癖をつけたほうがいい

11 :nobodyさん:2009/09/10(木) 03:07:22 ID:???
open(FILE, "<$file")に ; が無い

12 :nobodyさん:2009/09/10(木) 07:34:56 ID:xEU2hsmO
>>10-11さん
ありがとうございます。今はちょっとPCを開く時間がないので無理ですが、学校で修正したいと思います。
こんな初歩のミスだとは…
もっと頑張らなきゃいけませんね
本当にありがとうございました。

13 :12:2009/09/11(金) 00:27:02 ID:j5Qgkl9c
修正したんですが、まだ駄目でした。コードは変わってないです。
whileあたりに何か問題があるみたいなんですが、わからないです。

14 :nobodyさん:2009/09/11(金) 00:39:31 ID:???
駄目でしたじゃなくて、○○なので駄目でしたとした方がいい。
今後全てにおいて。

15 :12:2009/09/11(金) 00:48:46 ID:j5Qgkl9c
すいません。
お二方が教えてくださったとおり変えてみたところ500エラーは出なくなったんですが、
出力したHTMLに中身が残らず、name.logもnaiyou.logも空のままでした。
while($ln = <FILE>){
#$ln =~ s/\n/<br>/g;
#$ln =~ s/$split/$split<b>/g;
#$ln =~ s/(//g;

#($name, $naiyou) = split(/$split/, $ln);

#if($naiyou eq '')
#{$name = $naiyou ;
#}
#unless($name eq ''){
#$naiyou = "$naiyou</b>";
#}


open(OUT,"> name.log");
print OUT "$ln";
close(OUT);
open(PUT,"> naiyou.log");
print PUT "$ln";
close(PUT);

close(FILE);
}
にまでしても上手くいかなかったのでwhile部分の問題だと思ったのですが、何がおかしいのでしょうか?

16 :12:2009/09/11(金) 00:50:24 ID:j5Qgkl9c
↑上手くいかなかったではなくどちらの.logも空のままだった
です。

17 :nobodyさん:2009/09/11(金) 10:04:31 ID:???
while 内部で close(FILE); してるよ。

18 :nobodyさん:2009/09/11(金) 10:55:18 ID:???
>>15
whileループが必ず1回で終わりますね。close(FILE)しているから。
open(OUT,"> name.log");

open(PUT,"> naiyou.log");
はopenに失敗しても、そのまま無視されて処理が進むので、エラートラップするのが鉄則です。
すなわち、
open(OUT,"> name.log") or die $!;
open(PUT,"> naiyou.log") or die $!;
など。$!は最後のエラーメッセージが格納される特殊変数です。
よくあるのはパス違い、書き込みパーミッションが立っていないなど。

そもそも、
open(FILE, "<$file");
が失敗している可能性もあり。それだとwhileループは実行されていないことになる。

19 :12:2009/09/12(土) 02:32:58 ID:83ZTZfsA
openは成功してました。一行だけ読み込んだら問題なく表示されたので。
そういえば、splitってデミリタがその対象になる文字列内になかったらどうなるんですか?

20 :12:2009/09/12(土) 02:36:32 ID:83ZTZfsA
あ、わかりました。
すいません。
パスも、書き込みもあってて、openできてて、コードチェックも問題なく通るのに出来ないんです。
while($ln = <FILE>)
という記述が問題になる可能性はありますか?

21 :12:2009/09/12(土) 03:10:26 ID:83ZTZfsA
度々すいません。
やっと解決しました。
全部処理は上手くいっていたのですが、openの後ろが>だったために、書くたびに内容を上書きしてしまい、
最後の行の\nだけが書き込まれるという形になっていたみたいです。
助言してくださった皆さん、本当にありがとうございました。
いつか自分ももっと精進して皆様のように初心者に優しく教えられるようになりたいと思います。

22 :nobodyさん:2009/09/12(土) 03:26:39 ID:???
>>21
とりあえず100年ROMしてろ

23 :nobodyさん:2009/09/12(土) 09:20:58 ID:???
> とりあえず100年ROMしてろ

ROM 期間中に死を迎えることになりそうなので、軽減してもらえませんか

24 :nobodyさん:2009/09/14(月) 10:33:35 ID:???
>>23
誰も来なくて暇だから明日まででいいよ

25 :nobodyさん:2009/09/14(月) 11:59:40 ID:t5y5v7j/
くだ質の方にしようかと思いましたが、こちらで投稿致します。

perl -pe "s/foo/bar/g" *.txt

これをスクリプトで書くにはどうしたらよいのでしょうか?
以下のように書くと、0バイトファイルが出来上がります・・・

opendir DH,$dir or die;
my @files = readdir DH;
closedir DH;

foreach my $file(@files){
next if $file =~ /^\.{1,2}$/;
open(FH,"+>$file");
while(my $ln = <FH>){
$ln =~ s/foo/bar/;
}
close FH;
}

よろしくお願いします。

26 :nobodyさん:2009/09/14(月) 12:28:27 ID:???
>>25
http://perldoc.jp/docs/perl/5.10.0/perlrun.pod#item__b__p__b___p

while (<>) { s/foo/bar/g } continue { print or die "-p destination: $!\n" }

本当にやりたい事には -i オプションが抜けてる気がするけどね

27 :nobodyさん:2009/09/14(月) 13:03:07 ID:???
>>25
opendir my $dir_fh, "." or die $!;
my @files = grep { (not /^\./) and -f } readdir $dir_fh;
closedir $dir_fh;

for my $file (@files) {
open my $fh, "+<", $file or die $!;
my @contents = map { s/foo/bar/; $_ } <$fh>;
seek $fh, 0, 0;
print {$fh} @contents;
}
やってみたいことと違うかもしれないけど

28 :nobodyさん:2009/09/14(月) 13:58:11 ID:???
>>27 barの部分に入る文字列がfooの部分に入る文字列より短いと変なことになったので訂正
opendir my $dir_fh, "." or die $!;
my @files = grep { (not /^\./) and -f } readdir $dir_fh;
closedir $dir_fh;

for my $file (@files) {
open my $in, $file or die $!;
my @contents = <$in>;
close $in;
open my $out, ">", $file or die $!;
print {$out} map { s/foo/bar/; $_ } @contents;
close $out;
}


29 :nobodyさん:2009/09/14(月) 14:27:32 ID:t5y5v7j/
>>26-28
ありがとうございます。
バックアップいらないから、と思いきや、上書自体-iが必要だったのですね・・・・確認不足でした。
>>26を参考に、上書ができない状態で90分ほど彷徨っていますが、これから>>27-28を試してみます。
お礼ついでに経過報告まで・・・

30 :nobodyさん:2009/09/14(月) 14:45:14 ID:t5y5v7j/
>>28
出来ました!
しっかり噛み砕いて、自分の物に致します。
ありがとうございました。


31 :nobodyさん:2009/09/14(月) 18:22:59 ID:???
一応書いとく。
ワンライナーが本来どう解釈されるかを見るには、B::Deparseを使う。

% perl -MO=Deparse -i.bak -pe "s/foo/bar/g" *.txt
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
 s/foo/bar/g;
}
continue {
 print $_;
}
-e syntax OK

そのまま必要部分をコピペしたらスクリプトの出来上り。



32 :nobodyさん:2009/09/14(月) 20:02:28 ID:???
html template で分離されたテンプレートのほうに、
php埋め込んで稼働出来るようにならないでつか?

html templateで完成された奴をphpでコーティングしたいんだけど・・

33 :nobodyさん:2009/09/15(火) 01:00:11 ID:???
>>32
phpからsystem関数っぽい何かでHTML::Templateで生成された文字列を返すPerlスクリプト動かせばいけんじゃないの?
phpよく知らんけど

つーかそこまでやるなら最後までPerlで組めよって思う

34 :nobodyさん:2009/09/15(火) 12:51:30 ID:???
phpがモジュール型なら
application/x-httpd-php返せばphpがパースしてくれないかな?

text/x-server-parsed-html返すとSSI動くからいけそうな気がする。


35 :nobodyさん:2009/09/15(火) 18:36:40 ID:???
>>34
httpdの設定によるが、普通.phpファイルをパースするようになってるんじゃないか?

print $headers;
open(FH, '| /usr/bin/php');
print FH $php_code;

とかでいーじゃん。結果が欲しいならopen3で。

PHP::Interpreter

つー手もあるぞ。

36 :nobodyさん:2009/09/15(火) 18:55:27 ID:???
.phpが処理されるのは
AddType application/x-httpd-php .php
ってして拡張子.phpのコンテントタイプはapplication/x-httpd-phpだよ
って設定してるからで
実際モジュールはコンテントタイプみてパースするか無視するか決めてる


37 :nobodyさん:2009/09/15(火) 19:21:35 ID:???
>>36
だからそれはサーバーアプリケーション依存だろ?
断言すんな断言を。世の中全部Apacheとか思ってそうだな。
最近はスケールとかの問題で事情が変わりつつあるぞ。

38 :nobodyさん:2009/09/15(火) 22:21:14 ID:???
はいはいよかったね

39 :nobodyさん:2009/09/15(火) 22:46:47 ID:???
すみません、おそくなりました。
皆様助言ありがとうございます。

application/x-httpd-php を付加してやっても駄目でした。
ソースをみるとそのままコードが出てました。

PHP::Interpreter 試してみます。

40 :nobodyさん:2009/09/15(火) 23:34:35 ID:???
10日でおぼえる Perl/CGI という本でperl/cgiを勉強しているのですがアクセスカウンターのサンプルCGIが動かず困っています。

CGIのソースは
1 #! c:/perl/bin/perl
2
3 # カウントファイルの読み込み
4 open(IN, "<./count.dat");
5 $count = <IN>;
6 close(IN);
7
8 ++$count;
9
10 # カウントファイルの書き込み
11 open(OUT, ">./count.dat");
12 print OUT $count;
13 close(OUT);
14
15 # サーバー出力
16 print <<END;
17 Content-type: text/html
18
19 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
20 <html>
21 <head><title>あくせすかうんたー</title></head>
22 <body>
23 <p>あなたは……$count番目の訪問者です。</p>
24 </body>
25 </html>
26 END
です。count.datはちゃんとCGIと同じディレクトリにおいてあります。
ファイルの読み込みはできるようなのですが、書き込みができないようです。
「あなたは……1番目の訪問者です。」と表示されてしまいます。 どうすればいいでしょうか?

41 :nobodyさん:2009/09/16(水) 00:43:06 ID:???
手元で試す限りではカウントアップされる。
Ctrl+F5(俗に言うスーパーリロード)でも駄目なら
書き込み部分を
open(OUT, ">./_count.dat");
に変更して _count.dat がどこに作られるか確認したらどうかな。

42 :nobodyさん:2009/09/16(水) 00:59:33 ID:???
>ファイルの読み込みはできるようなのですが
読んでなくても「1番目の訪問者です」になるけどね。

43 :40:2009/09/16(水) 01:00:39 ID:???
>>41
レスありがとうございます

open(OUT, ">./_count.dat");

に変更してみて、実行した後、検索をかけてファイルを探したりしましたが見つけることができませんでした。
もしファイルが無かったら新しく生成されるべきなんですよね?

あと参考書がwindows版apacheを使っているのですが、そのせいでしょうか?
ちなみに読み取り専用のチェックははずしてあります。

44 :nobodyさん:2009/09/16(水) 04:24:42 ID:???
>>36
>>39
しかも嘘じゃねーか。まるで役に立たないってのはこのことだな。

45 :nobodyさん:2009/09/16(水) 04:28:29 ID:???
>>43
CGI置いてるってーことは所有者はあなただよね?
CGIスクリプトは別の所有者で実行されるから、パーミッションの
可能性が高いね。生成されるはずのディレクトリに移動して

chmod . 777

してみ。マニュアルみてこのコマンドが何するものか理解してな。
普通はセキュリティとか考えて別のディレクトリ掘る性質のものだから。

46 :nobodyさん:2009/09/16(水) 04:29:36 ID:???
あーcount.datが置いてあるなら、

chmod count.dat 666

だな。こっちの方が安全だし。

47 :40:2009/09/16(水) 04:37:30 ID:???
すみません
書き忘れました。自分もwindows版apacheを使っています。

48 :nobodyさん:2009/09/16(水) 04:58:27 ID:???
>>47
だったら単に"count.dat"か".\count.dat"じゃないの?知らんけど。Perlが面倒みてくれるのかな。
それにWindowsのパーミッションがどうなってるのか知らんけどその辺くさい。

49 :nobodyさん:2009/09/16(水) 05:16:30 ID:???
>>36
Apacheやlighttpdで試したが動くサーバーなんてなかったぞ。
知ったか君乙。つか迷惑だからレスすんな。

50 :nobodyさん:2009/09/16(水) 10:10:22 ID:???
>>47
普通に動く。
エラーログには何か出てないの?

51 :40:2009/09/16(水) 10:42:38 ID:???
>>50

コマンドプロンプトだと動きました。

各種ブラウザ(Opera, Firefox, Google Chrome, IE)で試したんですがだめでした。
何ででしょうか?

52 :nobodyさん:2009/09/16(水) 11:56:01 ID:???
ロックしてないし(この構造でロックしてもロックにならないけど)、
複数のプロセスが一度にアクセスして、ファイルが壊れてるとかなら考えられるけど。

まー、情報が少なすぎて、分からん。

53 :nobodyさん:2009/09/16(水) 12:03:46 ID:???
キャッシュ表示してるだけじゃないの?
ランダムに変わる長さの文字列を表示させるようにしてみるか
IE なら CTRL+リロード、Firefox なら Shift+リロードしてみて

54 :40:2009/09/16(水) 12:36:56 ID:???
>>53
ランダムのヤツはもうやってあって、ちゃんとランダムに毎回変わりました。

windowsでactiveperl+apacheなんですが
activeperlとapacheはCDから本と同じバージョンだし、
httpd.confもCDからまんまコピーだし

もう何がなんだか

55 :nobodyさん:2009/09/16(水) 12:54:14 ID:???
open(IN, "<./count.dat") or die "cannot open";
こうやって、ちゃんとファイルを開けてるかみるとか

56 :nobodyさん:2009/09/16(水) 13:02:45 ID:???
ブラウザでのキャッシュ無視リロードはやったの?
複数提案があったら出来る限り全部試せよ

57 :40:2009/09/16(水) 13:02:53 ID:???
>>55

読み込みとして開くのはできてるようなんですけど

書き込みのときうまくいっていないようです

なぜかというとcount.datの中身を
11
にしとくと

ファイルを開いて値を読み込む

インクリメント

「あなたは……11番目の訪問者です。」

と表示されるからです。
ホント、なんででしょう。

58 :40:2009/09/16(水) 13:06:24 ID:???
まちがえました

「あなたは……12番目の訪問者です。」
ですね

>>56
やりました

59 :nobodyさん:2009/09/16(水) 13:08:15 ID:???
エラーログ晒してみてよ
もうなんの情報もなしにこれでは辛い

60 :40:2009/09/16(水) 13:12:53 ID:???
>>59


apacheのerror.logのでいいんでしょうか?それともほかのperlとかのログでしょうか?
ごめんなさい 知識が少ないもので、わからないんです。

61 :nobodyさん:2009/09/16(水) 13:16:05 ID:???
apacheのerror.log で OK

62 :nobodyさん:2009/09/16(水) 13:19:59 ID:???

[Wed Sep 16 12:01:14 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: http://127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: http://127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: http://127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: http://127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: http://127.0.0.1/tendays/3-3.cgi

アイコンのエラーだけずっとです。count.datは引っかかりませんでした。
アンチウイルスソフトは止めてあるし、再起動は何度もしました。

63 :nobodyさん:2009/09/16(水) 13:24:08 ID:???
use CGI::Carp qw(fatalsToBrowser);
use warnings;
use strict;

を2行目に追記してみて

64 :40:2009/09/16(水) 13:26:06 ID:???
Software error:
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 9.
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 12.
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 16.
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 20.
Execution of C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi aborted due to compilation errors.

For help, please send mail to the webmaster (webmaster@localhost), giving this error message and the time and date of the error.

65 :nobodyさん:2009/09/16(水) 13:34:24 ID:???
my $countにしたらエラー無く実行されました。

66 :40:2009/09/16(水) 13:39:00 ID:???
ですが、ブラウザで実行してもカウンタが回りません

67 :nobodyさん:2009/09/16(水) 13:42:03 ID:???
_count.datが生成されなかった時点でもう根本的におかしいんだが。
CDからコピーしたということは、何らかのファイルがまだ読み取り属性になっている可能性があるな。
Apacheをインストールした*フォルダ*のプロパティを開いて、読み取り属性に灰色の「レ」がついて無いか確認。
スクリプトを置いているフォルダのプロパティを開いて、同様に確認。

あとは>>55を参考に、出力側も
open(OUT, ">./count.dat") or die "cannot open";
にして試してくれ。

エラーログに痕跡がなかったら↓をenv.cgiとかの名前で実行して、結果を貼ってもらうくらいしか無いかな。
#! c:/perl/bin/perl
print "Content-type: text/plain\n\n";
foreach (sort keys (%ENV)) {
print "$_: $ENV{$_}\n";
}

68 :40:2009/09/16(水) 14:07:10 ID:???
open(OUT, ">./count.dat") or die "cannot open";


Software error:
cannot open at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 16.

For help, please send mail to the webmaster (webmaster@localhost), giving this error message and the time and date of the error.

となりました。

env.cgiの出力結果は

COMSPEC: C:\WINDOWS\system32\cmd.exe
DOCUMENT_ROOT: C:/ApacheGroup/Apache2/htdocs
GATEWAY_INTERFACE: CGI/1.1
HTTP_ACCEPT: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
HTTP_ACCEPT_CHARSET: iso-8859-1, utf-8, utf-16, *;q=0.1
HTTP_ACCEPT_ENCODING: deflate, gzip, x-gzip, identity, *;q=0
HTTP_ACCEPT_LANGUAGE: ja-JP,ja;q=0.9,en;q=0.8
HTTP_CONNECTION: Keep-Alive, TE
HTTP_HOST: 127.0.0.1
HTTP_REFERER: http://127.0.0.1/tendays/
HTTP_TE: deflate, gzip, chunked, identity, trailers
HTTP_USER_AGENT: Opera/9.80 (Windows NT 5.1; U; ja) Presto/2.2.15 Version/10.00
PATH: C:\Perl\bin\;C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\;C:\Program Files\Borland\BDS\4.0\Bin;C:\WINDO
WS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;C:\tex\
bin;C:\gs\gs8.70\bin;C:\gs\gs8.70\lib;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Serv
er\100\DTS\Binn\;C:\Program Files\QuickTime\QTSystem\

次に続く

69 :nobodyさん:2009/09/16(水) 14:07:53 ID:???
PATHEXT: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
QUERY_STRING:
REMOTE_ADDR: 127.0.0.1
REMOTE_PORT: 3349
REQUEST_METHOD: GET
REQUEST_URI: /tendays/env.cgi
SCRIPT_FILENAME: C:/ApacheGroup/Apache2/htdocs/tendays/env.cgi
SCRIPT_NAME: /tendays/env.cgi
SERVER_ADDR: 127.0.0.1
SERVER_ADMIN: webmaster@localhost
SERVER_NAME: 127.0.0.1
SERVER_PORT: 80
SERVER_PROTOCOL: HTTP/1.1
SERVER_SIGNATURE: <address>Apache/2.0.54 (Win32) Server at 127.0.0.1 Port 80</address>

SERVER_SOFTWARE: Apache/2.0.54 (Win32)
SYSTEMROOT: C:\WINDOWS
WINDIR: C:\WINDOWS

でした。

70 :nobodyさん:2009/09/16(水) 15:10:05 ID:???
>cannot open at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 16.
やっぱり出力ファイルがopen出来てないな。
しかしそれが何故かというと、他のアプリにファイルハンドルを独占されているか、
書き込み禁止属性になっているとしか考えられないんだが。うーん・・・。

環境変数には問題は見当たらないね。

71 :nobodyさん:2009/09/16(水) 15:26:41 ID:???
>>51でコマンドプロンプトからだとカウントアップされるということだから
ファイルが書込み禁止になっているわけじゃないんだよな。
あとはApacheの設定くらいか。

72 :nobodyさん:2009/09/16(水) 15:29:08 ID:???
>>40
open(OUT, ">./count.dat") or die $!;
としてみて、失敗した原因を捕捉するのは鉄則。
openは失敗しても致命的エラーにならない(そのまま処理が進んでしまう)。
CD-ROMのファイルをコピーして使っているなら、read-only属性が付いているとしか考えられん。
読めもしないならパスの問題もあったかも知れんが。

73 :nobodyさん:2009/09/16(水) 21:51:49 ID:???
コマンドプロンプトで
attrib -s -h -r count.dat
ってやって、データファイルの属性変更してみて

74 :40:2009/09/16(水) 22:47:43 ID:???
みなさん

apache2.0系の最新版を入れたら直りました。

いろいろとご迷惑をおかけし、またたくさんの返答ありがとうございました。

75 :nobodyさん:2009/09/16(水) 22:57:57 ID:???
まぁApache側の何かがRead Onlyな所為なのだろうなとは思っていたよ
真相は闇の中だが

76 :nobodyさん:2009/09/18(金) 13:08:12 ID:???
LWP で GET するときって、取得中のファイルってオンメモリなんですか?
もし一時ファイルに保存されているなら、その場所の調べ方と変更の仕方って提供されてるんでしょうか?

10分ぐらいググってみたけど見つかりませんでした

77 :nobodyさん:2009/09/18(金) 13:08:46 ID:???
>>76
ソース読んだら?

78 :nobodyさん:2009/09/18(金) 18:38:19 ID:???
>>76
一気読みもできるし、少しずつコールバック呼びながら読むこともできる。

79 :nobodyさん:2009/09/18(金) 18:41:26 ID:???
>>77
> ソース読んだら?

その前にマニュアルを読め

80 :nobodyさん:2009/09/19(土) 13:40:04 ID:???
Rubyだと配列の任意の位置から最後までを、[n..-1]で取り出せますが、Perlではどうするのでしょうか?

arr = [0, 1, 2, 3, 4]
p arr[2..-1] #=> [2, 3, 4]

81 :nobodyさん:2009/09/19(土) 14:16:15 ID:weAFKNKD
perl CPAN モジュールのSutatistics::Suggestがインストールできなくて困っています。

ttp://search.cpan.org/~ihara/Statistics-Suggest-0.01/lib/Statistics/Suggest.pm
上記のサイトからlinux版ダウンロードして解凍し、以下の文を実行しようとしたのですが、

perl Makefile.PL [LIBS='-L/where/to/find/libsuggest.a -lsuggest']

解凍した中身に「Makefile.PL」がありません。また後ろに続く[LIBS='-L/where/to/find/libsuggest.a -lsuggest']もよく意味が分かりません。
よろしくお願いします。

<環境>
OS:Fedora9

82 :nobodyさん:2009/09/19(土) 14:40:29 ID:???
>>80
http://0xcc.net/blog/archives/000043.html

83 :nobodyさん:2009/09/19(土) 14:47:11 ID:???
>>81
> 解凍した中身に「Makefile.PL」がありません。

「Linux版」の意味が不明だが、いずれにせよ、Makefile.PLはある。

また後ろに続く[LIBS='-L/where/to/find/libsuggest.a -lsuggest']もよく意味が分かりません。

"/where/to/find/"をlibsuggest.aをインストールしたディレクトリに置き換える。

84 :nobodyさん:2009/09/19(土) 15:03:34 ID:???
>>82
ありがとうございます。
すごく参考になるサイトです。

でも自分の質問に対する答えは見つからないような。。。

85 :nobodyさん:2009/09/19(土) 16:52:19 ID:???
>>80
my @arr = (0, 1, 2, 3, 4);
print @arr[2..$#arr];

または

my $arr = [0, 1, 2, 3, 4];
print @{$arr}[2..$#{$arr}];

86 :nobodyさん:2009/09/19(土) 17:01:18 ID:???
>>80
print @a[5 .. $#a];

87 :nobodyさん:2009/09/19(土) 17:07:19 ID:???
>>85-86
d
できました。

88 :81:2009/09/19(土) 17:32:49 ID:02Qx22rD
>>83
レスありがとうございます。win版等があったので・・・

「Makefile.PL」はありませんが、「Makefile」なら解凍した中にあります・・・
ttp://search.cpan.org/~ihara/Statistics-Suggest-0.01/
ここに、「Makefile.PL」があったので、これを利用しようと思います

[LIBS='-L/where/to/find/libsuggest.a -lsuggest']はこのまま実行しないで
自分の環境に合わせて変更する必要があるんですね。ありがとうございます

最後に「libsuggest.a」は、通常何処にあるのでしょうか?よろしくお願いします。

89 :nobodyさん:2009/09/19(土) 20:01:27 ID:???
>>88
Linuxなんだろ?
find /usr -name libsuggest.a
で探せるだろ。最近は一瞬で全ファイルシステム探せるから便利だよな。
昔はこんなことしたら怒られる上に何十分もかかった。

っていうか
http://glaros.dtc.umn.edu/gkhome/suggest/download
から
suggest-1.0-linux.tar.gz
をダウンロードしたら、その中にlibsuggest.aがあるじゃん。これインスコすれば
いいんじゃねーの?README読んだらテスト方法書いてあるからテストしろよ。
テストは大事だからな。インスコ先は/usr/local/lib/辺りでいーだろ、で、

perl Makefile.PL [LIBS='-L/usr/local/lib/libsuggest.a -lsuggest']

こーだろ。

90 :nobodyさん:2009/09/20(日) 09:40:10 ID:WC9uameU
他WEBの質問版でも書き込みさせて頂いておりますが、こちらでも質問させて頂きます
現在、初心者ながら、PerlでCSVファイルを使って簡易的なDBを作っています
その際、下記の方法でCSVファイルの部分修正していますが、うまくいきません><
申し訳ありませんが、お知恵をお借りできますでしょうか?
困っております(泣)

◆下記プログラム内容
 CSVを読み込み、一致する部分があればそこを修正し、新たなCSVとして書き出す

◆マスターDB(カンマ区切りのCSVファイルにて作成)
 ・DBは横230×縦max2000程度(現行は横200×縦100程度)
 ・先頭、横20までは日本語で、最大でも全角50文字程度(改行、カンマは事前に除外(置き換え)しています)
 ・その後は「1 or 空白」。(フラグが立っているか、いないかだけ)

◆発生する不具合?
 (1)修正箇所の後ろの2〜3行が、修正行の後ろにそのまま追加される(欠落する場合もあり)
 (2)DBの一番最後の最後の行に不明なデータが追加される
  例1:,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1
  例2:,,,,
  例3:0行目がコピーされる
  例4:改行のみ
 (3)上記、(1),(2)は基本的に同時発生
 (4)上記、(1),(2)が毎回ではなく時々発生(と言うか、かなり頻繁に… 10回に8回程…)

〜長文のため、私のソースは↓に書きます〜

91 :nobodyさん:2009/09/20(日) 09:44:13 ID:???
>>90
まずやること。

その1、マルチをやめる
その2、もっと簡潔に記載する
その3、もっと勉強する

92 :90:2009/09/20(日) 09:45:53 ID:WC9uameU
#読み込み、及び修正
open (write_db,"+<db.csv");
flock write_db,2;
$i=0;
while(<write_db>){
@master = split(/,/, $_);
if( $master[0] == $data[0] ) {
$master[1] = $FORM{'textfield62'};
〜略〜
$master[15] = $FORM{'textfield5'};
#修正前の”1”のフラグ情報をクリア
for( $m = 21 ; $m <= $#master ; $m++ ){
$master[$m]=""; }
#修正情報の入っている@dataに基づいて@masterを変更(新しいフラグを立てる)
for( $k = 8 ; $k < $end_num ; $k++ ){
$master[$data[$k]] = 1; }
}
$write_data[$i] = join(',',@master);
$i++;
}
seek write_db,0,0;
close (write_db);

#書き出し操作
open (OUT,"+<db.csv");
flock OUT,2;
foreach my $ii ( @write_data ){
print OUT $write_data[$ii]; }
seek OUT,0,0;
close (OUT);

93 :nobodyさん:2009/09/20(日) 10:11:43 ID:???
>>92
それ、DBD::CSVでできるから。CSVファイルに対して

SELECT * FROM table WHERE id > 1 ORDER BY id

とかできちゃうから。なんでそんなもの作ってるのか謎すぎる。

94 :nobodyさん:2009/09/20(日) 10:36:14 ID:???
デバッグという概念も失われつつある

95 :90:2009/09/20(日) 10:49:27 ID:WC9uameU
>>93
理由があり、DBD::CSVは使えませんでした。
今後はそれも視野に入れ行っていきたいと思いますが、
まずはDBD::CSVを使わない場合での解決を目指しております。

>>94
実行時に修正前データ、修正後データ、書き込みデータの表示を行い
データ内容の確認を行っておりますが、その時点では問題はありません。
(CSVファイルとして書き出され、それをエディタ等で見た場合にデータがおかしくなっております)
上記に加え、確認する方法もご指摘頂けると幸いです。

96 :nobodyさん:2009/09/20(日) 11:16:04 ID:???
>>95
>まずはDBD::CSVを使わない場合での解決を目指しております。
間違った判断だな。
理由って大した理由じゃないだろ。言ってみろ。自分でやってみたいとかそんなんだろ。
絶対これ直すよりDBI::CSVの方が早い。

このままじゃ無理。全面書き直し。
コードに定数が入れるな。機能をモジュールに分けろ。Test::Moreでテストを書きまくれ。

97 :nobodyさん:2009/09/20(日) 12:09:18 ID:???
> 理由って大した理由じゃないだろ。言ってみろ。自分でやってみたいとかそんなんだろ。
> 絶対これ直すよりDBI::CSVの方が早い。
自分でやることの大切さは早いとか遅いとか関係ない、分かってないな。

98 :nobodyさん:2009/09/20(日) 13:11:31 ID:???
本日は、弊店ガラガラ
----------------------------------------------------------------------

99 :nobodyさん:2009/09/20(日) 13:15:31 ID:???
>>97
一度検討したくらいだから早さが大事なんだろ。
まあ確かに最近の風潮として、大したコードでもないのに
useが10〜20行くらい並んでるの見ると萎えるな。

100 :nobodyさん:2009/09/20(日) 13:19:29 ID:???
テキストファイルはテキスト中に文字を
挿入しようとしても挿入にはなりません
上書きされるのが正常動作です


意味不明な文字が現れるのは、日本語
2バイトのうち1バイト分が上書き
されてしまうので

101 :nobodyさん:2009/09/20(日) 17:35:24 ID:???
環境はWindows、使ってるのはActivePerl、文字コードはCP932とエスパーしてみる。
しかし、%FORMが謎。

とりあえず、Text::CSV_XSを使ってみて。

102 :nobodyさん:2009/09/20(日) 18:40:24 ID:???
DBIが入ってない連鯖で使いたいとかじゃないの理由って

103 :nobodyさん:2009/09/20(日) 23:49:07 ID:???
突っ込みどころ満載だが、デバッグの初歩、use strictを使ってコーディング!
ていうか、わざわざ"+<"でopenしているのに書き込む前にcloseしたら意味ないし!
seek FH,0,0;をcloseの直前に書いても無駄だし!
以前のデータを置き換えるなら、書き込むときのopenは">"で開く。さもなくば、closeせず、truncateする。
でないと、書き込んだ@write_dataの各要素のバイト長の合計が、書き込む前の
db.csvのファイルサイズより少ないとき、その差のバイト長だけ、以前のデータの末尾が残る!
不具合ってそのせいじゃないの?

104 :nobodyさん:2009/09/21(月) 00:29:33 ID:???
いつも大漁ですね。

105 :nobodyさん:2009/09/21(月) 00:43:00 ID:???
マスターファイルを読む「だけ」の所から根気良くやるしかないでしょ。
モジュールで済ませられるところはモジュールを使うと。
秘密が多すぎて、ダメかも分からんが。

で、釣りなの?

106 :nobodyさん:2009/09/21(月) 00:47:23 ID:???
釣りとか大漁とか言ってるのは2ch初心者か?
質問スレでそんなの気にするな。

107 :nobodyさん:2009/09/21(月) 16:03:31 ID:???
perlの中からRスクリプトを実行するスクリプトを作ってます。
以下の様に、Rスクリプトを一時的にファイルに落としてそれを実行すれば上手くRを呼び出せます。
ここで、一時ファイルを作らずに$r_script_strを直接使う方法はあるのでしょうか?

my $r_script_str = sprintf << 'EORS'
cat("Hello, world!")
EORS
;

open my $r_script_fh, '>', "./tmp_r_script.r";
print $r_script_fh $r_script_str;
close $r_script_fh;

system "R --vanilla --slave < ./tmp_r_script.r";


108 :nobodyさん:2009/09/21(月) 16:13:55 ID:???
>>107
openでRに食わせればいい。

109 :107:2009/09/21(月) 16:44:53 ID:???
>>108
早速のレスありがとうございます。
一時ファイルを作らずにできるようになりました。

110 :nobodyさん:2009/09/25(金) 09:36:36 ID:wSkBdlIW
どなたか詳しい方教えて頂けませんか
perl+MySQLで
$table_data[0]の真偽で分岐後、else{}は期待通りの結果ですが、if(){}が接続エラーとなってしまいます。
ど素人のため完全にはまってしまって

$dbh = DBI -> connect ($dns, $username, $password)
or
&err;
$sth = $dbh->prepare( qq{ SELECT code FROM client WHERE so = "$so" });
$sth -> execute()
or &err;
@table_data = $sth -> fetchrow_array();
$sth -> finish();
if(!$table_data[0]){
$sth = $dbh->prepare( qq{ UPDATE client SET condition=1 WHERE so = "$so" });
$sth -> execute()
or &err;
}
else{ $sth = $dbh->prepare( qq{ UPDATE client INNER JOIN afdb2 ON afdb2.code = client.code
SET afdb2.fix=afdb2.fix+client.price*100,
afdb2.occur=afdb2.occur-client.price*100,
client.condition=1 WHERE client.so = "$so" });
$sth -> execute()
or &err;
}
$sth -> finish();
$dbh -> disconnect();
exit;

よろしくお願いします。

111 :nobodyさん:2009/09/26(土) 11:16:39 ID:???
> if(){}が接続エラーとなってしまいます。

って何なの? &err となっている部分を

$dbh->errstr;

に変更して、エラーの中身をはれ。

> $sth = $dbh->prepare( qq{ SELECT code FROM client WHERE so = "$so" });

プレースホルダ使いな。
SQLインジェクションするよw

112 :nobodyさん:2009/09/28(月) 04:42:47 ID:???
MENTAっていうフレームワーク使いたいんだけど、本家サイトが落ちてるみたい
最新版のリファレンス的なものが置いてあるサイトとかブログないかな

113 :nobodyさん:2009/09/28(月) 11:00:48 ID:???
本家というかYappoさんとこのcodereposにあるんじゃないの?

114 :nobodyさん:2009/09/28(月) 19:26:50 ID:MFzb2dw4
どなたか詳しい方お教えください。
メールフォームを作ろうとしています。

form部品の、checkboxとradioとselectは、
textとかtextareaと違って、未選択の場合にキーを送信しないのですが、
これを未選択時にも、値が空のキー送信するようにすることはできますか?

cgi.pmのparam()メソッドでキーと値を受け取っているのですが、
上記が未選択時に受け取れないために、メールフォームの確認画面で、
つじつまが合わなくなってます(配列を使って自動的に生成しているため)。

どうかよろしくお願いします。

115 :nobodyさん:2009/09/28(月) 19:51:52 ID:???
送られてくるキーが分かってるんなら、そのキーを defined で確認すりゃいいだけじゃないの?

116 :nobodyさん:2009/09/28(月) 20:04:40 ID:???
>>115
早速のレスありがとうございます。
キーは分かってるんですが、それを毎回(メールフォームの項目が変わるたびに)Perlに記述していくのは面倒なので、
自動的にできないかと思って、メールフォームを作り直してます。

しかし、未選択のradioとかcheckboxのキーが送信されないという、
思わぬところでつまづいてしまいました。

117 :nobodyさん:2009/09/28(月) 20:16:08 ID:???
考え方が、根本的に違っている気がする。

118 :nobodyさん:2009/09/28(月) 20:42:32 ID:???
>>116
Perlとは直接関係ないけどさ、そうゆう場合はフォームのHTMLで、
全てのradioとかcheckboxにデフォルトの項目作って
checked="checked" とかしとくんじゃないのかな。

ただ、逆の使い方するほうが一般的な気がする。
例えば、必ず入れないといけないcheckやradioをあえて空にしといて、
そこをcheckしないと次のステップに進めないようにするとか、
"規約に同意「する」「しない」"で、「しない」にデフォルトでcheck入れとくとか。

これで、ある程度だけど自動スクリプトやロボットなんかの連投や、
一般ユーザーのボタン連打(いや、ほんとにいるんだって、極たまにだけど)
とかで、不意に高負荷になったりしないで済むし、なによりユーザーに
ちゃんとした入力を促すほうが大事かと思うが・・・。

119 :nobodyさん:2009/09/28(月) 20:47:50 ID:???
sendmailで送信した宛先不明のメールをfromに指定したアドレスに返信したいのですが、
どのように設定したらいいのでしょうか? サーバーはlolipopです。

120 :114:2009/09/28(月) 20:52:28 ID:???
レスありがとうございます。

>>117
そうかもしれませんね。

>>118
おっしゃられることは分かります。

しかし、デフォルトでcheckedは設定してますが、checkboxやmultipleなselectは、
チェックを外すことができるんです(radioを除く)。

チェックを外すと、キー自体が送信されないので、
(キーをPerlに直接明示しない場合は)Perlでエラーを吐き出すことすらでません(JavaScriptでは可能ですが)。

PerlからメールフォームのHTMLを読み込んで、
nameを上から順に抽出して配列に代入する方法しかないかもしれませんね。

121 :114:2009/09/28(月) 21:02:56 ID:???
最終的に何がやりたかったかと言うと、Perl内の記述を一切いじることなく、
HTMLを変えるだけでメールフォームが簡単に作れるものを作りたかったんです。

そのHTML内の項目を読み取って、自動的にエラー画面・確認画面・自動返信メールが生成される感じです。
必須項目とか再入力が必要な項目とかもHTMLのみの変更で完結できるものです。

122 :nobodyさん:2009/09/28(月) 21:47:25 ID:???
色々フレームワークをあたれば、そんなのもあるんじゃないか。
普通はデータベースのテーブルからフォームを起こすと思うけど。

123 :nobodyさん:2009/09/28(月) 22:09:35 ID:Abs+b0wT
BBSのcgiについて質問です
海外からの書き込みを拒否にしたいです
多分このファイルがアクセスチェックのファイルだと思うのですが…
↓のプログラムで国内のみを通すにはどういじったら良いのでしょうか?
まだまだ勉強中なので指導していただけないでしょうか
よろしくお願いいたします

次レスにプログラムです

124 :nobodyさん:2009/09/28(月) 22:11:47 ID:???
(^ω^)

125 :nobodyさん:2009/09/28(月) 22:13:49 ID:Abs+b0wT
すみません、長すぎると出たので斧にあげました

ttp://www1.axfc.net/uploader/File/so/31637

126 :nobodyさん:2009/09/29(火) 00:16:08 ID:???
>>116
スレちの希ガス。
毎回記述が面倒といっても、毎回記述するしかないのでは。
条件設定をするファイルを外部txtデータに書いておくとか。コード本体は変えないで済むように。
HTML::Parserなどを使って、htmlを丸ごと読み込んで、どんな入力項目があるかを解析するプログラムを外部で作ったらいかが。
htmlの中に条件指定をすると、いくらでも改ざんできてしまう。PCに保存してソースを書き替えて送信するとかできる。HTTP_REFERRERで確認しようにもクライアント側でどうとでも名乗れる。

>>119
envelopeアドレスを指定したらよろしい。
sendmailコマンドなら-fアドレス、Net::SMTPなら$smtp->mail(アドレス);
Mail::Sendmailならsendmail(Sender=>アドレス)のキーを渡すとセットされるみたい。

127 :nobodyさん:2009/09/29(火) 01:44:13 ID:l3KIzeZ6
>>120のスクリプトに関するポリシーが間違ってるに一票。

>>118
チェックボックス外されたらアウトだし、
checkboxでF5回避できるとか、脳内で書いてるだろ。

> ちゃんとした入力を促すほうが大事かと思うが・・・。

チェックボックスのチェックを外すのはちゃんとした入力です。
で、キーは帰ってきません。

>>126
つYAML/JSON

パーサなんか使わなくても
perl -pe 's/</\n</g' foo.html | grep -i '\<input' | perl -ne '/<(?:input|select|textarea) [^>]*?\s+name=([^ >]+)/i; $M=$1 ; $M =~ tr/"//d ; print "$M\n";'

とかで充分じゃね?

渡された値のキーに依存するのは気持ち悪いというのは同意。

128 :nobodyさん:2009/09/29(火) 01:47:48 ID:???
あ、grepいらねーな。print "$M\n" if $1でいけるかな?脳内ですまん。

129 :nobodyさん:2009/09/29(火) 01:50:43 ID:???
ついでにtr/'\''"//dだし。これ以上修正するのめんどいからあとは任せた(誰に?)

130 :nobodyさん:2009/09/29(火) 02:05:25 ID:???
結局ヒマだから書き直した。うざくてすまん。

perl -ln074e '/(?:input|select|textarea) [^>]*?\s+name=([^ >]+)/i; $_=$1 ;tr/'\''"//d;print if $1' foo.html

131 :nobodyさん:2009/09/29(火) 04:08:59 ID:???
その辺はHTML::Formで取れるよ。

132 :nobodyさん:2009/09/29(火) 12:39:33 ID:???
Module を作るのも手かもね

$form = HTMLFrom->new('POST', './test.cgi');
$form->setfield('hidden', 'action', '1');
$form->setfield('checkbox', 'sel', '1000');
$form->setfield('checkbox', 'sel', '1500');

ってやって、
$form->printform;
で表示するとか。

で、受け取りのときには
$form にはキーが保存されてるようにして、それを見れば一目瞭然みたいな感じ。



HTML::From がそうなのかもしれないけどw

133 :nobodyさん:2009/09/29(火) 19:44:30 ID:AG6/8zJV
質問です。
$hogeにいろいろ含まれる<input type="text" name="iroiro" />のiroiroを
$q->param($1)に置換したいんですが可能でしょうか?($1はいろいろ変わります)

※$q->param($1)には、そのnameのvalueが入ってます。

while ($hoge =~ s/<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/$q->param($1)/s) {
}

こうやっても、当たり前ですが$q->param($1)が入ってるのでエラーになります。
でも、$value = $q->param($1)のようにしてから、その後の正規表現をどうすればいいのか分からないんです。
どうかお願いします。

134 :nobodyさん:2009/09/29(火) 20:00:59 ID:AG6/8zJV
あ!すみません!できました!
while ($form =~ /<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/s) {
$value = $q->param($1);
$form =~ s/<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/$value/s;
}

135 :nobodyさん:2009/09/29(火) 20:09:10 ID:???
>>133
$hoge =~ s|(<input.*?type=\"text.*?name=\")(.*?)(\".*?/>)|$1.$q->param($2).$3|egs;

- e (Eval) 修飾子 (modifier) を付けると、その中が「式」として解釈されます。
- g (Global) 修飾子 を付けると、何度でもマッチを繰り返します。

136 :nobodyさん:2009/09/30(水) 04:32:12 ID:???
$qが気になるな。エスケープとかしとかなくていいのか。

137 :nobodyさん:2009/09/30(水) 12:15:20 ID:???
>>136
つeオプション

138 :nobodyさん:2009/09/30(水) 16:57:25 ID:???
ごめん、言葉が足りなかった。
$qがCGI.pmのオブジェクトだったら、XSS脆弱性に気をつけようってこと。
ただのお節介かも知れないけどさ。

139 :nobodyさん:2009/09/30(水) 19:03:47 ID:???
ちょっとお尋ねします。

-環境
winXP IE8
AN HTTPD + perl 5.8.8 (active perl)
-----------
my $str = 'テスト';
print "Content-type: text/plain\n\n";
print $str;

IEの「ダウンロード出来ません」とかいうエラー発生
-----------
my $str = 'テスト';
print "Content-type: text/html\n\n";
print $str;

問題なし
-----------
もしかしてIE8ってtext/plain表示出来ないんでしょうか?

140 :nobodyさん:2009/09/30(水) 19:11:04 ID:???
糞環境乙。
IE のせいにすれば解決すると思ってる?

141 :nobodyさん:2009/10/01(木) 04:28:26 ID:???
AN HTTPD は棄てろ

142 :nobodyさん:2009/10/01(木) 09:22:24 ID:???
いい加減Windows厨はAN HTTPDもActivePerlもゴミ箱に突っ込んで
CoLinux立てて環境作れ。サービス&自動起動にしてしまえば遠くにLinuxマシンが
あるのと全く区別がつかん。パフォーマンスもそっちのがずっと高い。
そろそろいい加減にしないと時代に取り残されるぞ。

ちなみに>>139のようなことで騒いでるやつが居たから見てやったら

Content-Type: text/plane

になってた。飛ぶ気か。

143 :nobodyさん:2009/10/01(木) 09:50:29 ID:???
Windows環境でしか使わないしなあ。

144 :nobodyさん:2009/10/01(木) 10:58:18 ID:???
>>139
ダウンロードしようとするのはIEの昔からの挙動だね。
確か512バイト未満はダウンロードするんじゃなかったかな。
リクエストするアドレスの最後にスラッシュをつければ回避できる。

IEは昔から問題を抱えてるブラウザだから、テストに使わない方がいい。
AN HTTPDも昔と変わってなければ問題を抱えてると思う。
設定が面倒だと思うだろうけど、Apache等で信頼性の高い環境を構築した方が
トータルで考えると楽だよ。

145 :nobodyさん:2009/10/01(木) 12:25:45 ID:???
>>144
アドレスの最後にスラッシュ付けたら表示されました。
IEだと512バイト未満の不具合があるんですね。
Content-Type無視の方かなと思ってたんですが。

[無視できない]IEのContent-Type無視 − @IT
http://www.atmarkit.co.jp/fcoding/articles/webapp/02/webapp02a.html
2008/7/2 - Internet Explorer 8 のセキュリティ : 総合的な保護
http://msdn.microsoft.com/ja-jp/ie/dd218483.aspx
2008/9/3 - Internet Explorer 8 のセキュリティ Part VI: Beta 2 の更新項目
http://msdn.microsoft.com/ja-jp/ie/dd218497.aspx

AN HTTPDが古いっていうのも気になってたので
これを機にApache入れようと思います。
ありがとうございました。

146 :nobodyさん:2009/10/01(木) 12:28:42 ID:???
IEって、昔、受け取ったデータの頭512バイトをちょんぎってしまう
バグがなかったっけか。あれの亜種かな?

147 :nobodyさん:2009/10/01(木) 12:44:02 ID:???
$|=1
で解決出来たりねw

148 :nobodyさん:2009/10/01(木) 13:14:47 ID:???
>>147
$|=1;
my $str = 'テスト';
print "Content-type: text/plain\n\n";
print $str;
$|=0;

これで使い方合ってますか?
これでもIEのエラーは変わりません。
Firefoxだと問題なく表示されます。

149 :nobodyさん:2009/10/01(木) 13:34:45 ID:???
charset まで丁寧に指定してみては?

150 :nobodyさん:2009/10/01(木) 16:54:23 ID:???
>>149
my $str = 'テスト';

#print "Content-type: text/html\n\n"; #OK
#print "Content-type: text/plain\n\n"; #NG
#print "Content-type: text/plain;charset=Shift_JIS\n\n"; #NG
print "Content-type: text/plain;charset=EUC-JP\n\n"; #NG

print $str;
#print "a" x 512; #NG
#print "a" x 1024; #NG
print "a" x 10240; #NG

charset指定しても変わらずです。
ついでに512バイト以上出力してもNGでした。
FirefoxはいずれもOK。
うちのIE周りがおかしいだけなんでしょうか?

151 :nobodyさん:2009/10/01(木) 18:10:20 ID:???
>>150
my $str = 'テスト';
print "Content-type: text/plain; charset=Shift_JIS\n";
print "X-Content-Type-Options: nosniff\n\n";
print $str;

http://msdn.microsoft.com/ja-jp/ie/dd218497.aspx

IE8で、Content-typeに従わない機能が高性能化してるみたいだね。
Microsoftの製品だから、今度からは製造元のMicrosoftに聞いて欲しい。
IEに関わると不幸になるから。

152 :nobodyさん:2009/10/01(木) 18:27:00 ID:???
これ試したらどうなる?うまく行ったApacheの出力そのままなんだけど。
3とか0とかは気にしないように。改行コードはCRLFで保存してね一応。

----------
#!/usr/bin/perl
print <<EOF;
Date: Thu, 01 Oct 2009 00:00:00 GMT
Server: Apache
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/plain

3
aaa
0

EOF

153 :nobodyさん:2009/10/01(木) 19:30:54 ID:???
>>151
これで普通に表示出来ました。
ちょっとスレ違いになってしまって申し訳ないです。

皆さん、ありがとうございました。

154 :nobodyさん:2009/10/02(金) 00:57:54 ID:???
質問が落ち着いたようなのでお伺いさせてください
>>123>>124はここではスレチなのでしょうか?
もしそうなら該当スレを教えていただけますでしょうか…

155 :nobodyさん:2009/10/02(金) 01:08:41 ID:???
ここは自分でソース書く人のスレだから、確か改造スレみたいのなかったっけか。

156 :123:2009/10/02(金) 09:02:45 ID:???
>>155
ありがとうございます
改造スレを見つけたのでそちらでお伺いをたてます

>>123取消しします
お邪魔しました

157 :nobodyさん:2009/10/07(水) 14:00:07 ID:???
知恵が足りないので教えてください。
フォルダ内のファイルの、連番が最大のものを別フォルダにコピーしようと思っています。

ファイル名は「@」で各要素が区切られているので、
foreach my $file(@files){
  my @fact = split /\@/,$file;
という風にして、連番=$fact[3]が最大のファイルを取得しようとしたのですが、
現在のコードはforeach{ max($fact[3]) }となっているので全く意味を為さず、
どこかで$fact[3]を配列に入れてやらないといけない事までは気付いたのですが、
その書き方がわかりません。

尚、$fact[0]と$fact[1]はキーボードからの入力で絞込み、$fact[2]に入る固有名詞は無視(というか、全て取得対象)でこの辺は上手く動いています。

よろしくお願いします。

158 :nobodyさん:2009/10/07(水) 14:33:21 ID:???
>>157
有名なシュワルツ変換を使ってみてはどうでしょうか?

my @sorted_files =
map $_->[0],
sort { $b->[1] <=> $a->[1] }
map [$_, (split /@/, $_)[3]], @files;

my $target_file = $sorted_files[0];

159 :nobodyさん:2009/10/07(水) 14:48:08 ID:???
>>157
別解
my $max=0;my $max_file;
foreach my $file(@files){
      $file=~/\@(\d+)$/;
      if($1>$max){$max_file=$file;$max=$1;}
}

160 :157:2009/10/07(水) 17:53:04 ID:???
>>158-159
ありがとうございます。
今日はちょっと手が出ないので、後日チャレンジしてみます。


161 :nobodyさん:2009/10/09(金) 20:37:40 ID:QHm3Fnkr
中身が全て(先頭から末尾まで)半角英字である正規表現はどー書けば良いのでしょうか?

162 :nobodyさん:2009/10/09(金) 21:51:14 ID:???
/^[a-zA-Z]+$/

163 :nobodyさん:2009/10/09(金) 22:59:18 ID:???
ブログURLリストから大量のRSSフィードURLを拾う用事が生じました。
Feed::Findモジュールをついさっきインストールして試しに
http://www.geekpage.jp/programming/perl-network/feed-find.php
のコードをコピペして実行してみたら
[error] [client 127.0.0.1] Premature end of script headers
が…

どなたか原因が思い当たる方いらっしゃいませんか?

164 :nobodyさん:2009/10/10(土) 00:05:42 ID:???
Apache(Web鯖上)で実行したなら、そのエラーの通りだろ。
コマンドラインからやってみ。

165 :nobodyさん:2009/10/10(土) 07:05:07 ID:???
http://hogehoge.jp/test/archive/test3.html

こういった URL で、最後のファイルは CGI であったり HTML だったりするなかで
最後のスラッシュ以降の文字列を取得したいのですが、正規表現でどう書けば
いいのでしょう?

どう書いても最初の / から行末にしかマッチするものしか書けず、
Split で対応してるとこです

166 :nobodyさん:2009/10/10(土) 07:40:33 ID:???
>>165
こんな感じかなー

m{[^/]+$}

167 :nobodyさん:2009/10/10(土) 11:35:43 ID:???
もっと素直に書いたほうがいい

/.*\/(.*)/

最長マッチ使って .*/ と書くといちばん最後の / までにマッチするからそれ以降全部を取得すればいい

168 :nobodyさん:2009/10/10(土) 11:50:35 ID:???
>>166の方が目的が明確で好きだな。

169 :nobodyさん:2009/10/10(土) 12:07:50 ID:???
ベンチマークとったよ。ずれてたらごめんね。

          Rate >>165 >>166 >>167
>>165 119048/s    --  -53%  -69%
>>166 253165/s  113%    --  -35%
>>167 389105/s  227%   54%    --

というわけで、167が偉いという結論になりました。

170 :169:2009/10/10(土) 12:09:42 ID:???
補足しておくと、
僕も166のように書いてしまいがちです。
へぼコーダーです。
修行が足りない。

171 :nobodyさん:2009/10/10(土) 12:12:10 ID:???
ちなみにコード
#!/usr/bin/local/perl
use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;

my $results = timethese(1000000,
    {'>>165'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; @_ = split("\/",$url); $_=$_[-1];',
     '>>166'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; $url=~m{[^/]+$} ; $_=$&;',
     '>>167'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; $url=~/.*\/(.*)/; $_=$1;',
    },'none');
cmpthese($results);
1行が長くてごめんなさい。

172 :161:2009/10/10(土) 13:58:31 ID:viNfW09K
>>162
ありがとうござます。

もう1つ聞きたいのですが、全部カタカナである文字列のマッチはどう書くのでしょうか?(文字コード:utf8)

173 :nobodyさん:2009/10/10(土) 14:26:26 ID:???
>>169-171
追試。

#!/usr/bin/perl -w
use strict;
use Benchmark qw(cmpthese timethese);
my $url = $ARGV[0];
my $results = timethese(-5, {
  split => sub { my $file = (split qr|/|, $url)[-1] },
  match => sub { $url =~ m|^(?:.*/)?(.*)\z|s; my $file = $1 },
  rmatch => sub { $url =~ m|([^/]*)\z|s; my $file = $1 },
  replace => sub { (my $file = $url) =~ s|^.*/||s },
  substr => sub { my $file = substr $url, rindex($url, '/') + 1 },
}); print "\n";
cmpthese($results);

__END__

> perl test.script "http://example.jp/path/to/file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 6 wallclock secs ( 5.30 usr + 0.00 sys = 5.30 CPU) @ 725417.52/s (n=3843262)
replace: 6 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 2177060.73/s (n=11292414)
rmatch: 6 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 95000.19/s (n=497326)
split: 4 wallclock secs ( 5.16 usr + 0.00 sys = 5.16 CPU) @ 175469.36/s (n=904720)
substr: 5 wallclock secs ( 5.08 usr + 0.00 sys = 5.08 CPU) @ 3129401.38/s (n=15897359)

Rate rmatch split match replace substr
rmatch 95000/s -- -46% -87% -96% -97%
split 175469/s 85% -- -76% -92% -94%
match 725418/s 664% 313% -- -67% -77%
replace 2177061/s 2192% 1141% 200% -- -30%
substr 3129401/s 3194% 1683% 331% 44% --

174 :nobodyさん:2009/10/10(土) 14:28:02 ID:???
> perl test.script "file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 6 wallclock secs ( 5.36 usr + 0.00 sys = 5.36 CPU) @ 720711.14/s (n=3862291)
replace: 6 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 5086089.07/s (n=26381544)
rmatch: 5 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 840637.43/s (n=4361227)
split: 6 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 285616.14/s (n=1503769)
substr: 4 wallclock secs ( 5.31 usr + 0.00 sys = 5.31 CPU) @ 3257009.79/s (n=17301236)

Rate split match rmatch substr replace
split 285616/s -- -60% -66% -91% -94%
match 720711/s 152% -- -14% -78% -86%
rmatch 840637/s 194% 17% -- -74% -83%
substr 3257010/s 1040% 352% 287% -- -36%
replace 5086089/s 1681% 606% 505% 56% --

> perl test.script "http://example.jp/l/o/n/g/l/o/n/g/l/o/n/g/p/a/t/h/t/o/file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 5 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 714051.59/s (n=3737346)
replace: 4 wallclock secs ( 5.25 usr + 0.00 sys = 5.25 CPU) @ 2172917.32/s (n=11405643)
rmatch: 5 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 63767.54/s (n=330826)
split: 4 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 85094.45/s (n=441470)
substr: 5 wallclock secs ( 5.03 usr + 0.00 sys = 5.03 CPU) @ 3018419.40/s (n=15185668)

Rate rmatch split match replace substr
rmatch 63768/s -- -25% -91% -97% -98%
split 85094/s 33% -- -88% -96% -97%
match 714052/s 1020% 739% -- -67% -76%
replace 2172917/s 3308% 2454% 204% -- -28%
substr 3018419/s 4633% 3447% 323% 39% --

175 :nobodyさん:2009/10/10(土) 14:48:50 ID:???
>>172
decodeしてるなら、

/^\p{InKatakana}+$/

でいけるかもしれん。

176 :nobodyさん:2009/10/10(土) 15:08:34 ID:???
>>165

正規表現で書くなら

m{[^/] (.+) \z}xms

jk


177 :nobodyさん:2009/10/10(土) 15:51:30 ID:???
>>172
/^[ア-ン]+$/;

ちったあ試せばいいと思うよ

178 :165:2009/10/10(土) 17:18:28 ID:ia/oAbqC
>>166
>>167
>>176→(訂正っす) m{\z\/(.*)} ですよね?

ありがとうございます。

# 最長でマッチさせたあとに取得
$url =~ /.*\/(.*)/;

# / 以外が続く行末まで
$url =~ m{([^/]+$)};

# 最後に見つかった / より後ろ
# \z 文字列の最後にマッチする。(Perl5.005以降)
$url =~ m{\z\/(.*)};


/.*\/(.*)/ を使わせていただきます。


今思えば、正規表現が今より苦手なころは
「めんどくせーから、行頭から欲しい部分の直前までマッチさせて、その残りをマッチさせて得てた」
と思い出しましたw

個人的には \z もなかなかいい感じなので、\z の存在を覚えていきたいとこ・・・

179 :nobodyさん:2009/10/10(土) 18:16:02 ID:???
>>177
おまえもちったぁ試したらどうだ。UTF-8のマッピングがどうなってるかとかさ。

180 :nobodyさん:2009/10/10(土) 18:23:47 ID:???
>>179
ここ↓を見て本人が好きな範囲を選べばいいよね

http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_3000-3FFF

181 :nobodyさん:2009/10/10(土) 20:45:28 ID:???
179が何にキレてるのか分からない

182 :nobodyさん:2009/10/10(土) 21:21:15 ID:???
子供の頃、お菓子類をよく食べてると切れやすいという研究結果が出てたよね

183 :nobodyさん:2009/10/11(日) 02:16:07 ID:???
>>181
ァヴヵヶの文字でコケるからだと思う。

184 :nobodyさん:2009/10/11(日) 03:03:33 ID:SfXKxhoo
>>178
まとめ乙。
勉強になりました。

いまちょっと試せないけど、これはどうかな?

m|/(.*?)$|

ハテナは最短一致の修飾子だから、
たぶん動くと思うんだけど。

185 :nobodyさん:2009/10/11(日) 14:51:42 ID:???
全体でマッチさせるように頭に".*"を付けるだけで速くなる。
しかし、単純な".*"が最速になるようにチューニングされてるのか、
>>167を超えられない。
文字クラスマンセーだったけど、考え直さないとだめかもダメだね。

186 :nobodyさん:2009/10/13(火) 19:54:24 ID:???
use utf8とかしていなければ、正規表現使わないで書いたほうが速い気がする

それはそうと、URL末尾に/が来ないことは考えなくていいの?
read.cgi/とかco.jp/とか、サニタイズされてないhoge.html/.././とか。
他にも、用途によるけど、拡張子jpgのGIFでしたとか偽装したのは弾かなくていいの?

187 :nobodyさん:2009/10/13(火) 20:02:30 ID:???
>>186
誤爆?
せめてレス番つけないと、何を誰に言ってるのか分からん。

188 :nobodyさん:2009/10/13(火) 20:22:13 ID:???
超初心者ですが質問させてください。

メールアドレスの@の前のピリオドが付いているアドレスは、
正しくありませんとエラーが出るのですが、
正規表現?のエラーだと思うのですが、対処法がわかりません。

ネットで色々調べたのですが、文字列を追加するとか…
$mail_regexの後の文字列のどこに追加すればいいのでしょうか?
初歩的な質問で申し訳ないです。。環境はwindowsXPです。

189 :nobodyさん:2009/10/13(火) 20:45:03 ID:???
エスパー1名様お呼びです

190 :nobodyさん:2009/10/13(火) 21:40:42 ID:???
>>188
当方、エスパー度かなり高いほうですが、一つだけ質問させてください。
$mail_regexにどのような文字列が代入されているのか教えてください。

191 :nobodyさん:2009/10/13(火) 21:44:18 ID:pHeszieI
>>188
$mail_regex = quotemeta($mail_regex);

192 :nobodyさん:2009/10/13(火) 22:26:16 ID:???
>>188
ってか、RFC絡みの(メールサーバー側の)エラーじゃねえの、
ドコモ携帯宛てのメアドとか。

193 :nobodyさん:2009/10/13(火) 22:31:50 ID:???
>>188
これでどうだ?

$mail_regex = 〜〜 . '|^[\w.-]+@(?:[\w-]+\.)+[\w-]+$';

194 :nobodyさん:2009/10/13(火) 23:40:03 ID:???
本来、@ の直前に . がつくメールアドレスはメールの規格として正しくない。
だからエラーとして弾く処理は正しい。
しかしDoCoMoとauがこの規格外のメールアドレスを正しいものとして扱ってしまっているので話がややこしい。
ぶっちゃけDoCoMoとauは氏ね。
という前提知識が必要な話ですね。

195 :nobodyさん:2009/10/14(水) 00:25:09 ID:???
DoCoMoもauもこれから新しく 〜.@〜 ってなるアドレスは取れなくなってるよ
まあ、今までに取ってるアドレスは有効なんだけどね

196 :nobodyさん:2009/10/14(水) 00:29:50 ID:???
>>188
正規の規格はともかく、はじかなくていいピリオドをはじいちゃっているわけで、
$mail_regexに文字列を追加するんじゃなくて、文字列を変更する必要があると思われます。
ので、ここにその$mail_regex後の文字列を書いた方がいい。

197 :nobodyさん:2009/10/14(水) 01:29:31 ID:???
188です。
皆様レスありがとうございます。

そうですよね。$mail_regexにどのような文字列が入っているかわからないと
答えようがないですよね…。
いま自宅なので書けないんです。なんせめちゃくちゃ長かったので…
申し訳ないです。

>>193さんが書いている文字列. '|^[\w.-]+@(?:[\w-]+\.)+[\w-]+$';を追加すると解決しますか?
管理システム側でのエラーなので、変更して解決しないと、恐ろしい事になる可能性があるんです 汗

198 :nobodyさん:2009/10/14(水) 02:14:04 ID:???
エスパーして、Perlメモの正規表現だとしたら、
"foo."@example.net
みたいにダブルクォートすれば解決すると思う。

199 :nobodyさん:2009/10/14(水) 09:51:32 ID:???
188です。
文字列を書いたのですが、本文が長すぎて書き込めなかったので、分けて書かせていただきます。



$mail_regex = '[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*
(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*
(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]
[^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*

200 :188:2009/10/14(水) 09:56:21 ID:???
すいません。。
長すぎてくじけました 汗
かなりのスレ汚しになってしまうので、やめておきます。
ありがとうございました。

201 :nobodyさん:2009/10/14(水) 10:44:33 ID:???
codepadとか使やいいのに

202 :nobodyさん:2009/10/14(水) 22:18:23 ID:???
いっそ尊敬するわ

203 :nobodyさん:2009/10/15(木) 18:04:11 ID:YQ/YK35J
>>183
マジレスするとヶとヵはカタカナじゃない。箇の略字(个・ケ)が回りまわってそうなった。
一箇所→一ヶ所
ヶなのに「カ」と読むので、不思議に思った人が「ヵ」を使い出してそれも普及した。
ヶやヵを使う日本語のカタカナ語って存在しないだろ。

んで、UTF-8はuse utf8しないとメチャクチャになるし、旧来の正規表現(ァ-ン)だと「ー」や「ヴ」なんかを取りこぼすな。
\p{InKatakana}だろjk。

>>188
@の前に「.」が付いてるメールアドレスは正当じゃありません。アドレスの方が悪い。
プログラムのせいにすんな。

>>193
メアドの正規表現なめんな。>>199で短く書いた方だ。
http://www.din.or.jp/~ohzaki/mail_regex.htm#RFC

>>197
その正規表現自体、2chが文字変換する関係?か何かでコケるんだが、6行目の
(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]

(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*\.?@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]
に変更してみ。ものすごいクイックハックだが@の前に\.?を挿入してある。

204 :nobodyさん:2009/10/15(木) 18:09:09 ID:???
>>197
あ、最後の行に対応する括弧がないな。まだ続きあるだろそれ。まあ多分>>203で間に合うからいいけど。

さらにInKatakanaの中にはしっかりヶとヵが入ってるんだな。まあ昔からマの間ではカタカナ扱いされてたけど。

205 :183:2009/10/15(木) 18:59:55 ID:???
>>204
マジレスすると、unicodeではカタカナ分類なんだ。
30F5 KATAKANA LETTER SMALL KA
30F6 KATAKANA LETTER SMALL KE

http://www.unicode.org/charts/PDF/U30A0.pdf

206 :nobodyさん:2009/10/16(金) 18:38:09 ID:???
use Email::Valid::Loose;

207 :nobodyさん:2009/10/20(火) 12:41:02 ID:???
each関数でリファレンスで受け取ったハッシュを引数にしてwhileに入れて使ったのですが一回もループせずにそのまま脱出してしまいました。
何故ですか?keys関数を使うとちゃんと値が返ってくるので中身がないことはないはずです。

208 :nobodyさん:2009/10/20(火) 12:57:20 ID:kwSavA/j
earch(%{$chanko})

209 :207:2009/10/20(火) 13:06:53 ID:???
>>208
成る程、そうやって書くんですね!
解決しました、どうもです

210 :nobodyさん:2009/10/20(火) 20:18:27 ID:???
こうしてエスパーたちは鍛えられていく

211 :nobodyさん:2009/10/20(火) 21:38:06 ID:kwSavA/j
いや自分も初心者だから想像はついたw

212 :nobodyさん:2009/10/20(火) 22:24:14 ID:???
初心者perlerは引かれあう・・・

213 :nobodyさん:2009/10/22(木) 06:34:07 ID:???
えっとものすごい初歩的というかperlというものを知ったのが昨日なので
できるかどうかが知りたいだけなのですが、質問です
とあるCGIゲームでマクロというものを使うと楽という話を聞き、やってみようと思ったわけです
ですがどうも既存のツール等では上手くいかず、それならプログラムを自作してみようと思い立ったのですが
範囲内の色に反応して数をカウントしていくようにしたいのですが、こういうことは可能なのでしょうか?

214 :nobodyさん:2009/10/22(木) 07:51:32 ID:???
とあるCGIゲーム、だけじゃ答えようがないような。
CGIゲームを提供する方なのか、それとも解く方なのか。
後者だとして、「CGIゲーム」といいつつ実はJavaアプレットだったりFlashだったりしそうな予感。
単純にHTMLを対象にどうこうするだけならJavaScriptが最適っぽい気がするが…たぶん関係ないな。

215 :nobodyさん:2009/10/22(木) 08:44:03 ID:???
CGIゲームをプレイする側ですね
具体的に何をしたいのかは
画面内から特定の色を検出して、その出現回数をカウントしたあとに結果を表示するものなのですが・・・
特定の色の検出が調べてもわからなかったので質問してみたのですが・・・

216 :nobodyさん:2009/10/22(木) 09:06:31 ID:???
死ぬ気で半年くらい頑張れば簡単にできるんじゃない?

217 :nobodyさん:2009/10/22(木) 11:24:40 ID:???
なんでプレイする側の人間がPerlスレで聞いたんだ?

218 :nobodyさん:2009/10/22(木) 16:12:06 ID:???
>>215
その「画面内の特定の色」がどうやって表示されているのかがわからなければ
そもそも解決できるかどうかすら答えようがないんでないかい。
どんなゲームなのか、CGIゲームってんだから具体的にURLを示した方が手っ取り早そうだが。

それ以前に「マクロ」から「Perl」へのつながりがすげえ謎。何故Perl。

219 :nobodyさん:2009/10/22(木) 16:52:20 ID:???
要はオンラインゲーのチートツールを作りたいってことでしょ。
まあ、板違いだわな。

220 :nobodyさん:2009/10/22(木) 23:09:23 ID:???
Win32::CaptureIEを使ってだな

後は画像解析だからPerlに限った話ではないな

221 :nobodyさん:2009/10/23(金) 11:34:54 ID:Y/3I6hzw

クッキーを受け取って送信したいのですが、cookie_jar に保存されていません。
正確には、「#LWP-Cookies-1.0」のみが書き込まれる。
↓のコードで合ってますか?よくある原因などありましたら教えてください。

$ua = LWP::UserAgent->new;
my $cookie_jar = HTTP::Cookies->new(file => "./cookies", autosave => 1);
$ua->cookie_jar($cookie_jar);
$response = $ua->request($request);

なお、$response->contentは正常に取れてます。


222 :nobodyさん:2009/10/23(金) 12:35:26 ID:fdJYCoLf
iframe とか JavaScript で cookie 発行されてたら、それも記録されないです

223 :221:2009/10/23(金) 19:33:11 ID:Y/3I6hzw
ソースを見る限りは、javascript や iframe でなんかやってるわけじゃ
なさそうです。googleアドセンスのjavascriptはあるけど・・・

224 :221:2009/10/23(金) 20:02:16 ID:Y/3I6hzw
すみません。
なぜか出来ました・・・一人でお騒がせしました。

225 :nobodyさん:2009/11/08(日) 11:49:33 ID:???
SSIページ(index.shtml)に
<!--include virtual="〜">のタグを埋め込んでおき、
index.shtmlに携帯からアクセスしてきた際に
携帯用トップページにジャンプさせるCGIを作成しています。

index.shtmlファイルから(text/html)でヘッダ出力した後に
CGIから、Location:http://〜ヘッダを送信すると
うまくジャンプしません。

知りたいのは、
先にサーバーから出力された*.shtmlのヘッダを中止し、
新たに出力しなおす方法があれば知りたいのですが、
なにか良い方法はありませんでしょうか?

<meta>タグのURL転送での解決方法は一部の携帯キャリアが対応してないため使えません。

何か良い方法があればご教授願います。

226 :nobodyさん:2009/11/08(日) 12:31:27 ID:???
CGI はどこから出てきたの?

227 :nobodyさん:2009/11/08(日) 12:41:39 ID:???
トップページをcgiにする

228 :225:2009/11/08(日) 14:26:09 ID:???
>>226
配布されているものでなくて自作で作ってます。

>>227
index.shtmlをやめてindex.cgiを自作にすると
socket関数が使わないといけないことになるため、
面倒なことになるので避けたい感じです

あと、.htaccessでリダイレクトさせる方法も検討しましたが
.htaccessは、MIME設定とBASIC認証のみにしか利用できない
設定になっています

最後に、12万ファイルあるコンテンツなので
鯖の移転もちょっと。。ってな感じです(><)

229 :225:2009/11/08(日) 14:52:59 ID:???
今つくってるのは
こんな感じです

#!/usr/bin/perl
#キャリア振分
$ua = $ENV{"HTTP_USER_AGENT"};
if ($ua =~ /DoCoMo\/1\.0/i) { $CR='Docomo'; }
elsif ($ua =~ /(DoCoMo\/2\.0|FOMA)/i) { $CR='Docomo'; }
elsif ($ua =~ /^(SoftBank|Vodafone|J\-PHONE|MOT\-[CV])/i) { $CR='SoftBank'; }
elsif ($ua =~ /^UP\.Browser/i) { $CR='EzWeb'; }
elsif ($ua =~ /^(KDDI\-|OPWV|MMP)/i) { $CR='EzWeb'; }
else { $CR='PC'; }
#URL転送処理
if ($CR eq "Docomo") {
##ここでshtmlの出力ヘッダを取りやめたい##
print "Location: http://ドコモのURL";
} elsif ($CR eq "EzWeb") {
##ここでshtmlの出力ヘッダを取りやめたい##
print "Location: http://EzWebのURL";
} elsif ($CR eq "SoftBank") {
##ここでshtmlの出力ヘッダを取りやめたい##
print "Location: http://SoftBankのURL";
} else {
print "Content-type: text/html\n\n";
}
exit;


230 :nobodyさん:2009/11/08(日) 15:52:38 ID:???
> 最後に、12万ファイルあるコンテンツなので
> 鯖の移転もちょっと。。ってな感じです(><)

そんな大切なコンテンツの運命を、こんな低俗な掲示板に求めていいのか?

231 :225:2009/11/08(日) 21:01:31 ID:???
>>230
そのうち11万8000ファイルはBBSから8年間かけて書き出された
ログファイルなので
そこまで、たいしたコンテンツでもありません。

2ch以外のフォーラム(4ヶ所ほど)でも聞いたのですが、
なかなか解決策が出てこなくて、こちらにも書込みしました。

232 :nobodyさん:2009/11/09(月) 09:27:28 ID:???
CGIだとsocketを使わなければならなくて面倒というのが意味不明だな。
そんなことはないのでCGIでやれ。

233 :225:2009/11/09(月) 13:23:21 ID:???
index.cgiを作成した場合
「socket使う」=「面倒」 と書いた理由を述べます

index.shtmlに
@<!--include virtual="ナントカ.inc"> の記述が4ヶ所
A<!--include virtual="ナントカ.cgi"> の記述が9ヶ所

@は参照先がテキストなどので、open関数でクリアできる
Aを@の方法でやるとperlソースが流れ込んでくるので、socket関数で対応するか
または、参照先のCGIをテキストファイル書き出しにする。

ってな感じです。(><)

234 :nobodyさん:2009/11/09(月) 13:35:26 ID:???
>>233
つLWP

いまどきそんなことのために生でsocketからコード書く奴はいねーよ。

235 :nobodyさん:2009/11/09(月) 13:39:54 ID:???
>>233
次におまえは「私が使っているサーバにはLWPが入っていません」と言う

つーか死ぬまで苦労してろ...

236 :nobodyさん:2009/11/09(月) 14:11:03 ID:a1ezikgd
質問です。CGIでsystem文を使って外部プログラムを実行します。 そのプログラムが終了まで数十分ほどかかる場合、実行の仕方や タイムアウトなどの処理はどのように組めばいいのでしょうか? 教えて下さい。

237 :nobodyさん:2009/11/09(月) 15:37:29 ID:???
まさかと思うが共用レンタルサーバでやろうとしてないだろうね?
なら死ね。

ブラウザ側には実行(待機)中であることを示して、STDOUTを開放する。
その際SIDかPIDか何かから一意なIDを作っておく。
外部プログラムはforkかcronでバックグラウンド動作させる。
外部プログラムの実行状態はAjaxでもしくは普通にcgiで得られるようにする。シグナルを送れば何%処理中か返すように外部プログラムを作っておくと吉。

妄想だけど多分こんなもんだろ。

238 :nobodyさん:2009/11/10(火) 06:22:57 ID:???
レン鯖のCGIの設定なら30秒ぐらいでプロセスがkillされちゃうから、どのみち無理。
ジョブキューを使うか、デーモン化した方がいいと思うけどな。

239 :nobodyさん:2009/11/12(木) 21:37:51 ID:???
まー、何言ってもできない理由を探してくるだけだろ。

240 :nobodyさん:2009/11/16(月) 11:02:56 ID:D4PXiJWR
ほっしゅ

241 :nobodyさん:2009/11/16(月) 20:59:19 ID:???
cure っていうコスプレサイトでエラー画面出てた
http://spicky.net/vipper/uploads/spicky/9/5/8/1859_zeL8gI2.png
http://spicky.net/vipper/image/1859/

242 :nobodyさん:2009/11/17(火) 15:14:45 ID:???
if(isset($_GET["url"])) readfile($_GET["url"]);
をPerlで書きたいのですが、どう記述したらいいものでしょうか?


243 :nobodyさん:2009/11/17(火) 16:15:15 ID:???
PHPのreadlineとか激しく複雑なので完璧ではないが、
だいたいこんな感じかね?

use CGI;
use LWP::Simple;

my $q = CGI->new;
my $url = $q->param('url');
if (defined $url) {
get($url);
}

244 :nobodyさん:2009/11/18(水) 00:14:38 ID:???
phpってそんな風に書くのか。cgi-lib.plの時代のperlみたいだな

245 :nobodyさん:2009/11/18(水) 14:54:08 ID:???
>>244

246 :nobodyさん:2009/11/18(水) 23:48:59 ID:???
tomcatのcgi-bin内でPerlを動かしているんですが、
ソケット通信ができません。
同じプログラムでapatheで動かすとソケット通信できます。

tomcatで何か設定が必要なのでしょうか

247 :nobodyさん:2009/11/19(木) 05:28:08 ID:ZQXO+cvV
>>246
アクセスできるディレクトリやパーミッションに制約があるのでは?
匿名ソケットを使ってるなら知らんけど。

248 :nobodyさん:2009/11/19(木) 05:31:23 ID:ZQXO+cvV
>>208
> earch(%{$chanko})

訂正しときますね。

each %$chanko


249 :nobodyさん:2009/11/19(木) 05:52:42 ID:ZQXO+cvV
>>236
どう見たいかによる。
数十分かかってもライブで表示したいなら、サーバ(アパッチー?)のタイムアウト設定を十分長くする。
途中経過も見たいなら、ダブルフォークかなにかでバックグランドへ落としたあと
NPHかリダイレクトを使って、チェックした状態を表示。
ユーザが自由にアクセスできるようにするなら、確認用IDを発行するか、クッキーを食わせとく。

一番簡単な解決は、実行終了後に結果をメールで送りつけること。
もしくは結果表示用スクリプトのアドレスを送る。

250 :nobodyさん:2009/11/19(木) 15:05:03 ID:pgc2wImK
useでモジュールをロードできなかった場合に対処するコードを書いています。
eval "use Hoge::Hoge"; if ($@) { use Hoge::Hoge2; }

ある程度うまくいくのですが、失敗する場合もあり、原因がわからずにいます。
まったく同じ内容でpackage名だけが違うモジュールでテストしてみると・・・
(内容は$nameの定義とエクスポートだけ)
Hoge/Hoge.pm -> package Hoge::Hoge;
Fuga/Hoge.pm -> package Fuga::Hoge;

[1] eval "use Hoge::Hoge"; #=>存在するので読み込まれる
[2] eval "use Fuga::Hoge"; #=>存在するのに$@がセットされる($@は空の様子)
※[1]と[2]は別々にテストしています。

[2]のエラーメッセージは
Global symbol "$name" requires explicit package name at ...
use strictをはずして警告を見てみると、
$nameを参照しようとしたときに次のメッセージが出ます。
Name "main::name" used only once: possible typo at ...

[2]の場合も通常にuseすると問題ありませんし、次も成功します。
BEGIN {
 eval { require Fuga::Hoge; Fuga::Hoge->import(); }; if ($@) { (略) }
}

[2]だけ失敗してるいまいち理由がわからないんですが、
どういう状況か見当つきますか?

251 :nobodyさん:2009/11/19(木) 15:09:31 ID:???
もうすこしちゃんとソースをさらしてもらわないと説明だけでは
何をしてるのかわからん。

252 :250:2009/11/19(木) 15:17:07 ID:pgc2wImK
す、すみません。[2]のモジュールのソースは以下です。
package Fuga::Hoge;
our @EXPORT = qw($name);
use base qw(Exporter);
$name = 'myname';
1;

[1]はpackage名だけが違って、それぞれのパスに配置しています。
package Hoge::Fuga;

[1]は
eval "use Hoge::Fuga";
が評価されて$nameをimportできるのに、[2]だけ>>250の警告が出る状況です。
違いがわからないのと、メッセージの意味がじゅうぶん理解できなくて・・・

253 :250:2009/11/19(木) 16:26:33 ID:???
しばらく試しているのですが、どうも通常のuseと、evalした場合とでは
細かい違いがいろいろあるみたいです。
例えばモジュールでget_nameというサブルーチンをエクスポートしているとき、
通常のuseですと
my $name = get_name;
でOKですが、evalではエラーになったりするみたいです。
my $name = get_name(); #カッコがないとエラー

質問させてもらった件も、今ひとつつかみどころがない感じなので、
当面は安定を確認しているBEGINブロック内に記述する方法をとることにして、
尚、ドキュメントをあたってみたいと思います。

>>251さん、ありがとうございました。

254 :nobodyさん:2009/11/19(木) 16:40:34 ID:???
見た感じ読み込まれるモジュールの方は問題なさげなので
[1]とか[2]とか言ってる読み込み側のプログラムもきっちり
さらしてもらわないとわからんな。

BEGINブロックをつかわないでuseをeval "use 〜" に置き換えると
読み込まれるにタイミングが変わるのでuse strictのコンパイル時
チェックに間に合わないというのはよくある話なんだが、全く同じで
片方だけおかしいとかいうことはないはずだしなんか違いがあるん
だろう。

255 :nobodyさん:2009/11/20(金) 16:12:32 ID:???
if ($ENV{'REQUEST_METHOD'} eq "POST") {
 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
 @pairs = split(/&/,$buffer);
 for $pair (@pairs) {
 ($name, $value) = split(/=/, $pair);
 $value =~ tr/+/ /;
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 Encode::from_to($value, 'utf8', 'utf8');
 $in{$name} = $value;
}

のようなありきたりのフォーム取得構文を
enctype="multipart/form-data"
に対応させるために

use CGI;
my $query = CGI->new;
my $user = $query->param('user');
のような構文を使って

$in{'name'}=$value形式で受けとりたいのですが
どのように記述したらよいでしょうか?


256 :nobodyさん:2009/11/20(金) 16:45:27 ID:???
>>255
use CGI;
my $query = CGI->new;
*in = $query->Vars();

257 :nobodyさん:2009/11/20(金) 17:56:52 ID:???
>>256
ありがとう動いた

258 :nobodyさん:2009/11/20(金) 18:50:54 ID:???
もうちょっとだけお付き合いください

フォーム側で
<input type="file" name="tempfile">としたものを

>>256 の方法で受け取り
open(SAVE,"> up.jpg");
binmode(SAVE);
binmode(STDOUT);
print SAVE $tempfile;
close(SAVE);
で保存すると、up.jpgというファイルの中身に
添付ファイルのバイナリでなく、
アップロードしたファイル名のみがテキストで記述されてました。

この場合は、$in{'tempfile'}の中身にはファイル名しか格納されていないことになります

enctype="multipart/form-data"の場合は別の変数になるのでしょうか?

259 :nobodyさん:2009/11/20(金) 19:46:05 ID:???
>>258
こうすると、うまくいきます?

print SAVE $tempfile;

   ↓   ↓

print SAVE <$tempfile>;

260 :nobodyさん:2009/11/20(金) 21:19:20 ID:???
てすと

261 :258:2009/11/20(金) 21:42:40 ID:???
>>259
ダメでしたorz
結果は同じでした

262 :258:2009/11/20(金) 21:51:20 ID:???
っしゃ!解決できました
調べてみたら、Varsとparamを両方つかわないといけないっぽいです

use CGI;
#データの取得 $in{'name'}で取得
if ($ENV{'REQUEST_METHOD'} eq "POST") {
 my $query = CGI->new;
 *in = $query->Vars();
}
#ファイルの取得
my $query = CGI->new;
$upfile= $query->param('tempfile');
#ファイルの書込
open(SAVE,"> up.jpg");
binmode(SAVE);
binmode(STDOUT);
while (read($upfile, $buffer, 1024)) {
 print SAVE $buffer;
}
close(SAVE);

263 :nobodyさん:2009/11/23(月) 03:37:20 ID:???
 $a=x,$a=y,$a=z・・・それぞれの条件で動作分岐
させるとき、ifとelsifで書いていくのはなんか非効率的
のような。なんか方法あるのでしょうか?

264 :nobodyさん:2009/11/23(月) 05:58:26 ID:???
何を持って非効率というのかわからん

あと、サンプルでも$a,$bは使わぬが吉

265 :nobodyさん:2009/11/23(月) 06:40:31 ID:???
>>263
switchが欲しいってことだろ
Perlのバージョンが5.10以上なら

use feature qw/:5.10/;
given($a){
 when(x){…}
 when(y){…}
 …
}

と書ける

266 :nobodyさん:2009/11/23(月) 07:58:49 ID:???
三項演算子使え。
$a =(条件1) ? 'x'
  :(条件2) ? 'y'
  :      'z'
  ;


267 :nobodyさん:2009/11/23(月) 09:00:29 ID:???
三項演算子って二者択一の時はよく使うけど、
長い式になると優先順位がわかりづらくて使いづらい。。。

268 :nobodyさん:2009/11/23(月) 09:19:12 ID:???
>>263
5.10未満ならSwitchモジュールを

switch文
http://www2u.biglobe.ne.jp/~MAS/perl/waza/switch.html

269 :nobodyさん:2009/11/23(月) 09:35:35 ID:XYWla5BP
連想配列に呼ぶべき関数へのリファレンスぶち込んじゃってる
ただこれをやると関数への引数は連想配列へのリファレンスにならざるを得ないから、あまりやらないけど・・・

270 :nobodyさん:2009/11/23(月) 10:26:54 ID:???
>>269
こんな感じ?

my %func = ( foo => \&foo, bar => \&bar );

$func{foo}(1, 2); #=> 1 2 in foo

sub foo {
print "@_ in foo";
}

sub bar {
print "@_ in bar";
}

>関数への引数は連想配列へのリファレンスにならざるを得ない
これはどういう意味ですか?

271 :nobodyさん:2009/11/27(金) 23:39:39 ID:???
情報オリンピックの
http://www.ioi-jp.org/joi/2008/2009-yo-prob_and_sol/2009-yo-t2/review/2009-yo-t2-review.html
の問題なのですが、
open(A,">a.txt");
$a=36;$b=20;$c=38;$d=54;$e=42;$f=25;@a={$a,$b,$c,$d,$e,$f}
foreach(@a)
{$one=0;
$two=0;
$thr=0;
if( $_ >= $one){
$one=@a;
$two=$one;
$thr=$two;
}elsif( $_ >= $two )
{$two=@a;
$thr=$two;
}elsif( $_ >= $thr )
{$thr=@a;}}
$total=$one+$two+$thr;
print A"$total";
何がいけないのでしょうか?
perlを勉強初めて数日の私にもわかるように教えていただけないでしょうか

あと、情報オリンピック予選にperlで出てみたいのですが、入力ファイルのtxtファイルを読み込んで、出力ファイルを作るということですよね?
出力するのは、
open(A,">a.txt");
print A "〜";
みたいなので良いんですよね?どうやったらtxtファイルを読み込めるんですか?たとえばtxtファイルの三行目の数をhと定義したりすることはどうすればいいんですか?

272 :nobodyさん:2009/11/28(土) 00:15:26 ID:???
その問題は、20個の数字がいるんじゃないの?

273 :nobodyさん:2009/11/28(土) 00:25:39 ID:???
どこもかしこも間違いだらけで、訂正する気にならん。

=== hoge.pl ===
sub calc { eval join '+', ( sort {$b <=> $a } @_ )[0 .. 2] ; }
my @data = <> ;
printf "%d %d\n", ( calc @data[0..9] ), ( calc @data[10..19] ) ;
======
perl hoge.pl INPUT.txt > OUTPUT.txt




274 :nobodyさん:2009/11/28(土) 00:41:49 ID:BdimRB/2
>>271の問題が見たいんだけどどこかにないの?
解説だけでどういう問題化わからん。リンクもないし

275 :nobodyさん:2009/11/28(土) 00:46:47 ID:???
ttp://www.ioi-jp.org/joi/2008/2009-yo-prob_and_sol/2009-yo-t2/2009-yo-t2.html


276 :nobodyさん:2009/11/28(土) 01:55:55 ID:BdimRB/2
>>271
その問題を解くように変えようとするとなると>>273の言う通り一から書き直した方がいいので、
とりあえずそのプログラムで書きたいと思われることを最大限書き直してみた。
use strict; // 初心者ならなおさらstrictとwarningsは入れた方がいい
use warnings;

my($a, $b, $c, $d, $e, $f)
  = (36, 20, 38, 54, 42, 25);
my @data = ($a, $b, $c, $d, $e, $f); // 配列は{}じゃなく()。

my($one, $two, $thr) = (0, 0, 0); // foreachの外で使うならforeachの外で初期化しないと毎回0で上書きされる
foreach my $num (@data) { // わかりやすいように$_じゃなくて名前付けておいた方がいい
// ホントは=ない方が処理少ないので=ない方がいいと思う
  if ($num >= $one) {
    $two = $one;
    $thr = $two;
    $one = $num; // 初めに$oneに代入したらその後$twoにも$thrにもコピーされるから最後で。
  } elsif ($num >= $two) {
    $thr = $two;
    $two = $num; // 上と同じ理由
  } elsif ($num >= $thr) {
    $thr = $num;
  }
}

my $total = $one + $two + $thr;

open my $wfh, ">", "a.txt" or die "$!"; // 3引数のopen使った方がいいのと、なるべく開いたらすぐ閉じた方がいいのでまとめるべき。
print $wfh $total;
close $wfh; // open したら closeしないとダメ
こんな感じかな。問題解くならPerlの前にアルゴリズムも勉強しないといけない気がするな

277 :nobodyさん:2009/11/28(土) 02:14:34 ID:???
Perlでも//コメントって使えたっけ

278 :nobodyさん:2009/11/28(土) 04:02:22 ID:BdimRB/2
あ。ごめん、レスする時にコメント付けたから間違えた

279 :nobodyさん:2009/11/28(土) 13:14:18 ID:???
$thrと略すのはやめようぜ。
文脈から分かるとはいえ、一見だと$thresholdや$throttleかも?と思うだろ。

280 :nobodyさん:2009/11/28(土) 14:37:12 ID:???
みなさん分かりやすい解説ありがとうございます。
>>275さんの問題の通りこのような入力例が与えられて、出力しないといけないのですが、
my($a, $b, $c, $d, $e, $f)
  = (36, 20, 38, 54, 42, 25);
のように自分で打たずに、txtファイルから読み込む方法を教えていただけないでしょうか。

281 :nobodyさん:2009/11/28(土) 14:41:24 ID:???
foreach my $num(<ファイルハンドル>){
#一行ずつ$numに代入する。
}

こんな感じかな?

282 :nobodyさん:2009/11/28(土) 14:55:14 ID:???
open(A,">a.txt");
my($one, $two, $thr) = (0, 0, 0);
foreach my $num (b.txt)
{
if( $num >= $one)
{
$two=$one;
$thr=$two;
$one=$num;
}elsif( $num >= $two )
{
$thr=$two;
$two=$num;
}elsif( $num >= $thr )
{
$thr=$num;
}
}
$total=$one+$two+$thr;
print A"$total";
こういうことではないのですか?
これでは0になってしまったのですが


283 :nobodyさん:2009/11/28(土) 15:30:00 ID:???
おまえら初心者にやさしいなw

284 :nobodyさん:2009/11/28(土) 15:32:33 ID:???
おまえら初心者にやさしいなw(by プログラム組めない>>283)

285 :nobodyさん:2009/11/28(土) 15:35:37 ID:???
>>283
流石に組めますよ。
二種はCOBOLで取った世代ですw

286 :nobodyさん:2009/11/28(土) 15:37:19 ID:???
>>283じゃなく>>284だった(; ´Д`)

287 :nobodyさん:2009/11/28(土) 15:41:19 ID:BdimRB/2
>>281を見た段階で>>282の結果が予測できたなw

>>271
初心者スレとはいえ、最低限の文法をググるか本読んだ方がいい
サンプルコードたくさん落ちてるじゃん
ファイルへの書き込みがopen my $wfh, ">", "a.txt"ってのと同じように
読み込みはopen my $rfh, "<", "b.txt"だよ

288 :nobodyさん:2009/11/28(土) 15:45:27 ID:???
>>282
open FH, "<hoge.txt";
foreach(my $line = <FH>){ … }
close FH;


入門書読んだ?

289 :nobodyさん:2009/11/28(土) 15:47:29 ID:???
間違えた
foreach → while

@hoge = <FH>;
でも入力は取れる

290 :nobodyさん:2009/11/28(土) 16:18:26 ID:???
すいません。学校で習っただけで…
あとレファレンスとか見てもどこに載っているのかわからないので…

291 :281:2009/11/28(土) 18:03:02 ID:???
あ・・・ごめん
ファイルハンドルはファイルの名前の事だよ
普通はファイルの入出力のところに載ってると思うけど

292 :291:2009/11/28(土) 18:04:34 ID:???
ごめん、修正
ファイルハンドルはファイルを識別するための任意の文字列の事だよ
でした

293 :nobodyさん:2009/11/28(土) 18:06:13 ID:???
こういうのって普通は>>273みたいに標準入力から取るんじゃないの?

294 :nobodyさん:2009/11/28(土) 18:15:00 ID:???
問題の趣旨から考えたら、標準入力から取ると思う


295 :293:2009/11/28(土) 18:16:33 ID:???
ああ標準入力じゃないや、ダイヤモンド演算子使ってファイル入力でってことね

296 :nobodyさん:2009/11/28(土) 21:24:20 ID:???
みなさんの言っていることが高度すぎて意味不明です…
こういうことではないんですか?
open(A,">a.txt");
my($one, $two, $thr) = (0, 0, 0);
open FH, "<b.txt";
foreach(my $line = <FH>)
{
if( $num >= $one)
{
$two=$one;
$thr=$two;
$one=$num;
}elsif( $num >= $two )
{
$thr=$two;
$two=$num;
}elsif( $num >= $thr )
{
$thr=$num;
}
}
$total=$one+$two+$thr;
print A"$total";


297 :296:2009/11/28(土) 21:38:36 ID:???
line4 $line -> $num
追加 -> close FH;


298 :296:2009/11/28(土) 22:12:32 ID:???
use strict;
use warnings;
open(A,">a.txt");
my($one, $two, $thr) = (0, 0, 0);
open FH, "<b.txt";
foreach my $num (<FH>)
{
if( $num >= $one)
{
$two=$one;
$thr=$two;
$one=$num;
}elsif( $num >= $two )
{
$thr=$two;
$two=$num;
}elsif( $num >= $thr )
{
$thr=$num;
}
}
my $total = $one + $two + $thr;
close FH;
print A"$total";

これで何とかできているようです。が、
argument "\n" isn't numeric in numeric gt at 〜.pl line8, <FH> line8.
と出るのは何なのでしょう
あと、一行ごと読みこむ場合は分かったのですが、
http://www.ioi-jp.org/joi/2008/2009-yo-prob_and_sol/2009-yo-t1/2009-yo-t1.html
のような場合はどうやって読み込むのでしょう

299 :nobodyさん:2009/11/28(土) 22:25:29 ID:???
過去問全てここの人間に教わろうってのか?w


300 :296:2009/11/28(土) 22:32:47 ID:???
>>299
いえ、別にそういうわけではありません。
とりあえず、読み込み方は自分には見つからなかったので、教わりたいなと思ったので…
すいません


301 :nobodyさん:2009/11/28(土) 22:34:31 ID:???
>>271の質問に対しては>>273は答えになってますよ。わざとeval使ったりしてますけど、
perlだとこんなに短く書けるよということで面白い。本人が理解できなきゃ意味ないか。

>>298
foreach my $num (<FH>) はやめれ。これだとファイルの中身をすべてメモリに読み込むので、
今回はいいけど、このファイルが数百万行あったらどうする。普段から
while (my $num = <FH>) {
chomp $num; # 各行のデータには改行コードがくっついたままなので取り除く
# 処理
}
としておくのが吉。
argument "\n" isn't numeric in numeric gt at 〜.pl line8, <FH> line8.
は、改行コードがくっついている値を数値比較したから。
こういうのもuse warningsを付けているから出るわけです。

> http://www.ioi-jp.org/joi/2008/2009-yo-prob_and_sol/2009-yo-t1/2009-yo-t1.html
> のような場合はどうやって読み込むのでしょう
結局何もかも分からないわけですね。
いくら初心者スレとはいっても、少しはわかるようになるまで学習してから取り組んだらいかが。

302 :301:2009/11/28(土) 22:42:45 ID:???
書き忘れたが、
>>298
のコードだと、2つの大学全体の上位3つの合計になってしまうよ。問題の要件を満たしていない。
あと、普通こういうので入力/出力といったら標準入力/標準出力ではないかと思います。
その点でも>>273は満たしてくれている。

303 :nobodyさん:2009/11/29(日) 00:50:13 ID:???
こんなひどいのは久々に見た
新鮮だなぁ

304 :nobodyさん:2009/11/29(日) 01:42:21 ID:1LHj/rCz
とはいえ、がんばろうとしてる姿勢が見えるのはいいなぁ
学校で習ってすぐの覚えたてで何か問題解こうとここに聞きにくるのとかポジティブだよねw

最近の書き方だと下のが結構まとまってると思う。
ttp://d.hatena.ne.jp/perlcodesample/20091120/1246679588
あと、標準入力とかダイヤモンド演算子の話はもっと簡単なサンプルコードを書くところから始めた方が理解できると思う

305 :nobodyさん:2009/11/29(日) 10:19:40 ID:???
初心者というのは「本を一冊読みました。今始めてプログラムを書いています。
こういう処理したいんだけど、読んだ本だといまいちわかりません」
というレベルじゃないのか?
文法すら知らないのは初心者ではなく教えてちゃんだ。

306 :nobodyさん:2009/11/29(日) 10:40:54 ID:???
>>304
「最近の書き方」じゃねーよ、単なる個人の趣味じゃねえか
悪くは無いが。

で、ここの最近のレスも合せてどうしても突っ込みたくなったから書くが、
× while( my $line = <FH> ){}
◯ while( defined ( my $line = <FH>) ){}
perldoc perlsyn にも書かれてる。


307 :nobodyさん:2009/11/29(日) 11:07:16 ID:???
>単なる個人の趣味じゃねえか
「リンク先の内容が、リンク先の書いた奴の」って意味ね。


308 :296:2009/11/29(日) 11:57:19 ID:???
いろいろ調べて>>273の意味が分かりました。ありがとうございました。
で、朝
http://books.yahoo.co.jp/book_detail/AAY78372/
この本を買って今読んでいるのですが、read関数の使い方がよく分かりません
どなたか教えていただけないでしょうか


309 :nobodyさん:2009/11/29(日) 12:28:14 ID:???
整数である第二引数のバイト分を第一引数のファイルハンドルから読み込んで返す関数だっけ?

310 :nobodyさん:2009/11/29(日) 12:30:07 ID:???
整数である第三引数のバイト分を第一引数のファイルハンドルから読み込んで第二引数に入れる関数だった

311 : ◆CB400SBcg9B9 :2009/11/29(日) 13:10:34 ID:???
>>304
「聞きに来る」時点で全然ポジティブでも何でもないです。
所謂「クレクレ」でしかないです。

例え「車輪の再発明」と云われても自分で調べ、自分で考えてその結果をここに書き連ねてこそポジティブっていうもんです。

世知辛いこの世の中、ただただ「速さ」だけを求められて、こういった「クレクレ君」が憚っているのが現状だと思うと悲しいんだけれどもね。。。

312 :nobodyさん:2009/11/29(日) 13:53:22 ID:???
>>311
スレ違い

313 :296:2009/11/29(日) 16:04:52 ID:???
>>309,310
空白は1バイトですか?
あと、何文字目から何文字目までということはできますか?

314 :nobodyさん:2009/11/29(日) 16:11:18 ID:???
>>312
バイトがなんなのか理解してないの?
ここで聞く前にもっと勉強した方がいいと思うよ
検索すれば出る内容なんだから

315 :nobodyさん:2009/11/29(日) 16:12:07 ID:???
>>313だった
>>312スマソ

316 :nobodyさん:2009/11/29(日) 21:02:25 ID:???
#最近perlを勉強し始めたのですが、サブルーチンが呼び出せなくて困っております・・・
#GCDの計算です。

print "input number 1\n";
$a = <STDIN>;
chomp($a);

print "input number 2\n";
$b = <STDIN>;
chomp($b);

$n = &gcd($a,$b);


sub gcd{
if($c != 0){
$c = $_[0] % $_[1];

$n = &gcd($gcd[1],$c);

}else{
print "G.C.D is $_[0]";
}

}
#よろしくおねがいします。

317 :nobodyさん:2009/11/29(日) 21:16:37 ID:???
ifの中の$cはどこから来てんだよ

318 :nobodyさん:2009/11/29(日) 21:38:42 ID:???
アルゴリズムおかしいけどサブルーチンは呼び出せてるよ?
input number 1
18
input number 2
32
G.C.D is 18%

319 :nobodyさん:2009/11/29(日) 21:48:48 ID:aDLivjg2
STDIN からの入力って改行入ってなかったっけ?

320 :nobodyさん:2009/11/29(日) 21:49:22 ID:???
>>319
chomp見逃すなよ……

321 :nobodyさん:2009/11/29(日) 21:55:47 ID:???
永久機関みたいなサブルーチンだ。

322 :nobodyさん:2009/11/29(日) 21:57:26 ID:???
アルゴリズムが崩壊してるな
これはひどい

323 :316:2009/11/29(日) 22:02:31 ID:???
>>317
これも引数にしないとだめだったんですか?
$cをメインルーチンに追加して試してみましたがだめでした・・・

>>318
サブルーチンは呼び出せているのですが、ifの中身がうまく処理できずにelseの処理にうつってしまいます

GCDのアルゴリズムは
_[0]と_[1]を割って余りを$cに代入
$cが0でなければ_[1]を_[0]に、$cを_[1]に代入
$cが0になるまでこれを繰り返す
$cが0なら[0]を出力

間違ってましたかね



324 :nobodyさん:2009/11/29(日) 22:04:07 ID:???
>>318
だから$cがどこから来てんのかって話だよ
後半の問題も$cが何処から来てんのかって問題

325 :nobodyさん:2009/11/29(日) 22:11:31 ID:???
やりたいのはこういうことじゃないの?
sub gcd {
  my($a, $b) = @_;
  if ($a < $b) { # $bの方が大きければ逆にする
    ($a, $b) = ($b, $a);
  }

  if ($b != 0) {
    gcd($b, ($a % $b));
  }
  else {
    print "G.C.D is $a";
  }
}
$_[0]とか$_[1]を使い回さない方がいい。
色んな場所で使うなら最初に違う文字に置き換えた方が無難
$nも使わないならわざわざいらないでしょ
>>323の順番に処理して行ったらif文が割り算の前に出てくるのもおかしいよね

326 :nobodyさん:2009/11/29(日) 22:15:22 ID:???
>>325
それ、ユークリッドの互除法になって無いぞ。
$_[0], $_[1] を使い回す方が、 $a, $b を my するよか千倍マシだ。


327 :nobodyさん:2009/11/29(日) 22:21:39 ID:???
>>326
あれ?ちがうんだっけ。昔の記憶のまんま書いてみて答えあってたからいいかと思った

つか、普通$_[0]とか使い回すもん?
実際、何の値入ってるかわかんなくなって>>316みたいなコード書く元になるから使い回すなら置き換えた方がいいと思うんだけど。

328 :nobodyさん:2009/11/29(日) 22:33:53 ID:???
書き換えた方が良いのは同意だが、$a, $b はソートブロック内で使用
される特殊変数だ。
それを他の場所で使うくらいなら、 @_ を使う方がましだと言っている。
my $. = 'hoge' ;
↑これをするのと同じくらい変態行為。

>>325
>if ($b != 0) {
これ常に真だが?


329 :nobodyさん:2009/11/29(日) 22:40:51 ID:???
>>328
あぁ、なるほど。$a,$bは特殊変数で使われるんだっけ。
普段$aとか$bは使わないけど>>316のコードをなるべく生かそうと思って失敗したわ。

>>if ($b != 0) {
>これ常に真だが?
最終的に余りゼロになるでしょ?

330 :nobodyさん:2009/11/29(日) 22:47:49 ID:???
だから $b がどうして、$a % $b の値になんのよ?
ここまで説明しなきゃ解らんのか?


331 :326:2009/11/29(日) 22:55:42 ID:???
ゴメン、お前が正しかった。吊ってくる。


332 :316:2009/11/29(日) 23:06:02 ID:???
>>325のアルゴリズムですっきりできました
この程度もわからなかっただなんてしにたい

print "input number 1\n";
$a = <STDIN>;
chomp($a);

print "input number 2\n";
$b = <STDIN>;
chomp($b);

&gcd($a,$b);

sub gcd{
if($_[1]>$_[0]){
($_[1],$_[0])=($_[0],$_[1]);
}
if($_[1] != 0){
&gcd($_[1],($_[0] % $_[1]));
}
else{
print "G.C.D is $_[0]";
}
}

333 :nobodyさん:2009/11/29(日) 23:23:23 ID:???
>>332
えっと、そう書くことになるから「$_[0]と$_[1]に何が入るかわからなくなるので、使う初めに置き換えた方がいいよ」って話ね

例えば、今回とは別の例としてそのsubが30行くらいあったとして、君が1週間後にメンテナンスするとするでしょ?
ぱっと一番下のprintを見た時に「あぁ、$_[0]だから引数の一番目の値を出力してるな」とか思っちゃうわけだけど、
その前に入れ替えやってるからそうとは限らない。

そうするとメンテする時に変数の代入をしている所を確認する作業が増えて面倒。
少なくとも「$_[番号]は引数の順番通りに入ってる」って思ってる人は多いから入れ替えとかしない方がいいよ

334 :nobodyさん:2009/11/29(日) 23:28:53 ID:???
>>332
use strict;
をスクリプトの2行目に書くのをオススメする
変数のスコープを理解すべし
死ぬのはそれからだ

335 :nobodyさん:2009/11/30(月) 00:16:25 ID:???
$a $bを使うんじゃねえ

336 :332:2009/11/30(月) 00:49:26 ID:???
>>333
サブルーチンの外で入れ替える、ということですね。気をつけます。。

>>334
わかりました。
perlは今までやってきたCやJavaと比べて書きやすいのですが、
やっぱりある程度の制約を強要したほうがエラーが起こりにくいということがよくわかりました。

337 :nobodyさん:2009/11/30(月) 01:26:09 ID:???
>>336
> サブルーチンの外で入れ替える
まあそれでも動くっちゃあ動くが違うだろ

普通に考えれば関数の先頭で
my($num1, $num2) = @_;
($num1, $num2) = ($num2, $num1) if $num2 > $num1;
などとして、以後$_[X]の代わりに$numXを使うという意味だ


338 :nobodyさん:2009/11/30(月) 02:19:08 ID:HMASs2oD
DBIのデータベースハンドルを属性に擁するクラスを作っています。
このクラスのオブジェクトを使用してDBIのメソッドを呼ぶとき、
$obj->dbh->prepare(@args); #データベースハンドルのゲッタを介した呼び出しではなく
$obj->prepare(@args)    #こう呼びたいと思っています。
そこでAUTOLOADを定義して委譲するように書いたのですが、ここで不明な点があるのです。

sub AUTOLOAD {
 my $self = shift; my @args = @_;
 our $AUTOLOAD;                #呼ばれたメソッドの完全修飾名
 my $method_name = (split '::',$AUTOLOAD)[-1]; #メソッド名部分を切り出し
 if ($self->dbh->can($method_name)) {     #メソッドがDBIにあれば
  return $self->dbh->$method_name(@args);   #DBIのメソッド呼び出し(ここが疑問)
 }
}

例のようにprepareを呼べばステートメントハンドルが返り、つまり正しく動いてるのですけど、
$method_nameは(多分)文字列なのに、どうしてメソッド呼び出しがおこなわれるのかわかりません。

経緯としては、試しに書いてみたら動いてしまい、
後追いで理屈の裏づけをとりたいと思ったら答えが見つからない、という状況です・・。
(use strict環境なのでシンボリック参照ではないですよね。)
説明つく方いましたらお願いしますm(_ _)m

339 :nobodyさん:2009/11/30(月) 03:57:11 ID:???
仕様

340 :nobodyさん:2009/11/30(月) 04:00:49 ID:???
ム板のPerlスレで聞いた方がいいな

341 :nobodyさん:2009/11/30(月) 04:53:13 ID:???
>>338
気持ち悪いならこういう風に書き換えることができたはず

if (my $ref = $self->dbh->can($method_name)) {
  return $ref->(@args);
}

342 :nobodyさん:2009/11/30(月) 05:29:57 ID:???
>>341
dbhの返り値を第1引数に入れなくてもいいの?

343 :338:2009/11/30(月) 07:20:28 ID:HMASs2oD
>>341
なるほど!ありがたいヒントをいただきました。
canはメソッドの参照を返しているんですね。こちらは納得です!
自分のケースでは次のコードで結果を得ることができました。

if (my $method_ref = $self->dbh->can($method_name)) {
 my $sth = $self->dbh->$method_ref(@args);
 return $sth;
}

この際>>338の疑問はなかったことにしようと思いますw

344 :nobodyさん:2009/11/30(月) 09:31:48 ID:???
>>343
AUTOLOAD呼び出しのコストを1回だけにするのは、あんまり意味ないかな?

404 Blog Not Found:Perl Monger の質問 - AUTOLOADって他でどうやるの?
http://blog.livedoor.jp/dankogai/archives/50491359.html


if (my $method_ref = $self->dbh->can($method_name)) {
 no strict 'refs';
 *{$method_name} = sub { shift->dbh->$method_ref(@_) };
 unshift @_, $self;
 goto &$method_name;
}

345 :nobodyさん:2009/11/30(月) 11:18:10 ID:???
>>344
この goto は普通に関数呼び出しじゃダメなのかな…

346 :nobodyさん:2009/11/30(月) 18:34:17 ID:???
->の先って文字列でもコード参照でもよかったんだな
自由すぎる

347 :338:2009/11/30(月) 18:49:13 ID:???
>>344
ありがとうございます。
自分が事前に得ていたのも>>344のようなコードでした。
$AUTOLOADに渡ってきた名前のメソッドを、型グロブを使って現在のパッケージに動的に追加し
そのメソッドに処理を転送、という意味だと思うのですが、
自分もちょっと大げさだなと思って・・・
(ちなみに今、手元にオライリー本を数冊置いてるのですが、いずれも類した手法を紹介してるんです)

しかし「AUTOLOAD呼び出しを減らす」メリットには気がつきませんでした。
以降は新しいメソッドが呼ばれるから逐次AUTOLOADが呼ばれるコストが削減できるということなんですね。
(AUTOLOADはクラス階層を全部探した最後に呼ばれるから高コスト)

自分の場合はCGIなので、アクセスごとにメソッド生成がおこなわれてしまうこともあるのですが、
複数のクエリを発行する状況ではメリットあるかもしれないです。
クラスの使用状況を見ながら適宜判断してみようと思います。

CGIなら普通に、使う分だけラップしたメソッド書いとけって話もあると思いますが^^;
たいへん参考になりました!

348 :nobodyさん:2009/12/02(水) 03:41:18 ID:0CcBOFc0
コンソールでデータの処理とかに Perl を使ってるのですが、実行中に Uninitialized value とかの
Warning が出た時点でスクリプトの実行を一時停止させるには、怪しいところを eval でトラップさせるしかないのでしょうか?

それともデバッグに役立つようなモジュールとかあるのでしょうか?

349 :nobodyさん:2009/12/02(水) 06:42:16 ID:???
>>348
% perl -d hoge.pl

ここに色々書いてあるから見てみるといい
http://www.ibm.com/developerworks/jp/linux/library/l-pl-deb/

350 :nobodyさん:2009/12/02(水) 09:26:53 ID:???
>>348
$SIG{__WARN__} = sub { die @_ };
などとやってしまうとか。

351 :nobodyさん:2009/12/02(水) 12:21:29 ID:???
Perl勉強中の者です。
XPでActivePerl5.8.9を使っています。

http://perl-users.jp/articles/advent-calendar/2008/08.html
上のURLを見て、クリップボードのURL→fenrir(ランチャ)で出来たらと思い、やってみました。
#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use File::Basename;
use Win32::Clipboard;

my $dir = "$ENV{'USERPROFILE'}/jpgDL";
chdir $dir;

my $clip = Win32::Clipboard();
my $url = $clip->Get();
my @contents = get($url) =~ m{<a.*?href="(http://[^"]+\.jpg)"}gi;

foreach my $jpg(@contents) {
mirror($url, basename($jpg));
}
上記URLのワンライナー通りだとうまくいくのですが、このコードではjpgは落ちてくるけど、
ファイルが壊れているようです(ファイルサイズが全て同じになっている)。
FTPみたいにバイナリ指定する方法もないようで、どうしてよいか分かりません。
このコードの何処が間違っているのでしょうか?
ご指摘お願いします。

352 :nobodyさん:2009/12/02(水) 12:32:46 ID:???
> クリップボードのURL
> my @contents = get($url) =~ m{<a.*?href="(http://[^"]+\.jpg)"}gi;
これは……

353 :nobodyさん:2009/12/02(水) 13:53:24 ID:???
>>352
Windowsのブラウザ上でコピーしたURL(my $url = $clip->Get(); )に対して
LWPのgeでコンテンツを取得しています。

・・・と書き込みながらあれこれやって1時間、自己解決致しました。

誤) mirror($url, basename($jpg));
正) mirror($jpg, basename($jpg));

jpgじゃなくてURLのhtmlを落としてました・・・orz

354 :nobodyさん:2009/12/03(木) 01:29:27 ID:???
perlを使い、DBに接続してselectする処理を作ろうとしております。
htmlを使い、cgiを読み込むような↓の簡単な処理をまず作りました。
※db.cgiは単体で動作確認済みで、こちらに不備があることはありません。

<html>
<body>
<form action="db.cgi" method="post">
<input type="submit" name="exec" value="データベースの表示">
</form>
</body>
</html>

ところがこれで呼び出すとcgi(上のソース上で言うdb.cgi)がうまく動作しません。
具体的に言うと、ファイルのダウンロード画面が開かれ、開くとcgiのソースが開かれてしまいます。
エラーメッセージは表示されません。

ネットでダウンロードすると出るダウンロード画面はお馴染みの物です。
このファイルを開くか、または保存しますか?
名前:db.cgi
種類:不明なファイル
発信元:

これはアパッチの環境設定面でヘマをしてしまったのでしょうか?情報少なくてすみません。

355 :nobodyさん:2009/12/03(木) 02:11:50 ID:???
OS、CPU、メモリ、年齢、スリーサイズ、Apacheのインストール場所、Perlのインストール場所、httpd.confの内容
全て書け

356 :nobodyさん:2009/12/03(木) 09:01:03 ID:???
>>354
Content-Type の不備と見た

357 :nobodyさん:2009/12/03(木) 09:13:01 ID:???
cgiのソースが出てくると言うんだからapacheの設定だな。
cgiだと思われてないよ。

358 :nobodyさん:2009/12/03(木) 11:50:21 ID:???
AddHandler cgi-script .cgi の設定が欠けてるとか。

359 :354:2009/12/03(木) 23:52:45 ID:aPQfU5cA
>>355>>356>>357>>358
ありがとうございました。
やはりApacheの設定だったようです。

詳細の原因はわかりませんでしたが、
confファイルの色々直したら表示できるようになりました。
ありがとうございました。

360 :nobodyさん:2009/12/05(土) 16:36:46 ID:???
----------input.txt-
1 2 3
4 5 6
7 8 9
-------------------
---------------output.txt-
6
15
24
---------------
input.txt->output.txt(行ごとに三つずつある数字の和を一行ずつ表示させるプログラム)の書き方を教えてください

361 :nobodyさん:2009/12/05(土) 16:51:05 ID:???
>>360
こんな感じかな。違ったら誰か突っ込んでくれると思う。わからないところどこ?
use strict;
use warnings;

my $input_file = shift || 'input.txt'; # 引数もしくはinput.txt
my $output_file = shift || 'output.txt'; # 引数もしくはoutput.txt

# 読み込み処理
open my $rfh, '<', $input_file  or die "$!"; # ファイルの読み込み
my @results;
while (defined(my $line = <$rfh>)) { # 1行ずつ処理
  chomp $line;           # 改行は削除
  my @nums = split /\s+/, $line;  # 空白で分割

  my $sum;
  for my $num (@nums) {
    $sum += $num;
  }
  push @results, $sum;
}
close $rfh;

# 書き込み処理
open my $wfh, '>', $output_file  or die "$!";
for my $result (@results) {
  print {$wfh} "$result\n";
}
close $wfh;

362 :nobodyさん:2009/12/05(土) 17:16:59 ID:???
perl -lpe'y/ /+/;$_=eval' input.txt>output.txt

perl -alpe'$_=$F[0]+$F[1]+$F[2]' input.txt>output.txt

perl -MList::Util=sum -alpe'$_=sum@F' input.txt>output.txt

363 :nobodyさん:2009/12/06(日) 04:07:59 ID:gPKy+f2T
>>362
4つ目が合ったら・・・

>>360
use strict;
use warnings;

open(INFH, '<', 'in.txt');
open(OUTFH, '>', 'out.txt');
while(my $line = <INFH>){
  chomp $line; # 改行削除
  my $sum = 0; # ゼロで初期化
  map { $sum += $_ } split(/\s+/, $line); # 空白で分割し、要素を足し算
  print OUTFH "$sum\n"; # 出力
}
close(OUTFH);
close(INFH);



364 :nobodyさん:2009/12/06(日) 07:36:02 ID:???
>>361
いつも思うのですがこのwhile文の中のdefinedって必要なんですかね?
空文字が来るこってあるのでしょうか?

365 :nobodyさん:2009/12/06(日) 08:26:49 ID:???
>>364
特殊変数によっちゃあえりるとかじゃなかったっけか。

366 :nobodyさん:2009/12/06(日) 11:00:15 ID:???
>>364
0が来たらどうすんだって話じゃないか?
この場面に限らず0の評価を回避するためにdefined書かなきゃいけないことが多すぎる

367 :nobodyさん:2009/12/06(日) 12:45:01 ID:???
>>364
Perlクックブックに、以下3つの文で、下の2つには、Perlコンパイラが、definedを挿入する
ので、一番上のように丁寧に書かなくてもOKと書いてあります。

while (defined ($line = <DATAFILE>) { ・・・ }
while ($line = <DATAFILE) { ・・・ }
while (<DATAFILE>) { ・・・ }

このdefinedの挿入は、whileループでreadline、readdir、readlink呼び出しの結果を
スカラー変数に代入する場合のみに行われる。

とも書いてあります。

368 :nobodyさん:2009/12/06(日) 13:30:40 ID:???
>>365-367
d
確かに0の場合も偽でしたね。

勝手にdefinedを挿入してくれるのかー
ただベストプラクティス的には省略に頼らず、きちんと書いたほうがいいのかな。


369 :nobodyさん:2009/12/06(日) 17:16:48 ID:???
配列のハッシュ、の参照に困っています。

use Data::Dumper;
print Dumper $a;

$VAR1 = [
{
'aaaaaa' => [
'1',
'2',
],
'bbbbbb' => [
'1',
'2',
]
}
];


Dumper してこのように表示されるのですが、参照がうまくできません。


370 :369:2009/12/06(日) 17:19:20 ID:???
# Dumper を使わずに出力
foreach my $key (keys %{$a}) {
print $key."¥n";
foreach my $name (@{$$a{$key}}) {
print $name."¥n";
}
}

print $key."¥n"; までは出来ていますが、そこから先が動きません。
この参照の仕方は間違っていますか?


371 :nobodyさん:2009/12/06(日) 17:36:42 ID:???
$a->[0]{aaaaaa}


だいたい、>>370で何でkeysが出て来るのよ?

372 :nobodyさん:2009/12/06(日) 17:37:42 ID:???
use strict;
use warnings;
my $var = [
  {
    'aaaaaa' => ['1', '2'],
    'bbbbbb' => ['1', '2'],
  }
];
for my $key (keys %{$var->[0]}) {
  print "$key\n";
  for my $name (@{$var->[0]{$key}}) {
    print "$name\n";
  }
}

やりたいことがわからないが、>>369の $VAR1 の内容を表示するコード

373 :369:2009/12/06(日) 17:46:07 ID:???
>>371
$a->[0]

->[0] だったのか('A`)
リファレンスがまだよく分からない。

>>372
データの集計をしようとしてたのですが、いきなり詰まってました。
有難うございました。

374 :361:2009/12/06(日) 22:20:48 ID:???
>>365-367
おぉ、なるほど。そうなのか。
>>306で言われてたからとりあえず付けてみただけでした。参考になるな

375 :nobodyさん:2009/12/07(月) 05:08:40 ID:B0UFMTWM
$a->[0]->{'aaaaaa'}->[0]

@{$a->[0]->{'aaaaaa'}} で配列取得でける

376 :nobodyさん:2009/12/12(土) 16:38:26 ID:???
>>361,363
ありがとうございます
  my @nums = split /\s+/, $line;  # 空白で分割
この部分が分かりませんでした


377 :nobodyさん:2009/12/12(土) 18:06:22 ID:aQyC+qGS
\s → 1つ以上の連続した空白をあらわす (1つの空白でも、2つの空白でも一致)

\s で分割した結果を @nums に入れてるだけ。
基本中の基本なので、これぐらいは見て分からないと・・・

378 :nobodyさん:2009/12/12(土) 21:38:30 ID:???
すいません初学者なもので…
続いて質問で申し訳ないのですが、
----------input.txt-
1 2 3
4 5 6
7 8 9
-------------------
---------------output.txt-
左上の数字は1です
中上の数字は2です
   ・
   ・
   ・
---------------
input.txt->output.txtのようなprogramの書き方を教えてください
できれば、input.txtを空白で区切った値をそれぞれ$a_1,$a_2といった変数にしてしまいたいのですが

379 :nobodyさん:2009/12/12(土) 22:10:49 ID:???
windowsならこうかな

perl -aln0e "print qq{$_の数字は$F[$i++]です}for qw(左上 中上 右上 中段左 真ん中 中段右 左下 中下 右下)" input.txt>output.txt

380 :nobodyさん:2009/12/13(日) 02:10:50 ID:???
>>360

どこの大学の宿題だろう

381 :nobodyさん:2009/12/13(日) 06:32:28 ID:tGb7lH/N
データ主導で変数名を決めるのは、出来るには出来るが上手いやり方ではない

382 :nobodyさん:2009/12/13(日) 06:52:19 ID:???
>>378
大きなお世話なのはわかっているが言わせてくれ。
君はどうしてその学部に進もうと思ったんだい?
そういうことを勉強したくて行ったんじゃないのかい?
その宿題の解を提出して「よし、じゃあなぜそのアプローチを取ったのか説明してくれ」
と教授に求められたら「2chで出来る人達が勧めてくれました」と答えるのかい?
答えを貰うならば次に、同じような問題を目の前で10分以内に解け、
と言われてもまったく出来ないままだぞ。
君自身はいいのか、それで?
夏休みの読書感想文をコピペサイトからコピーして提出する小学生と同じだぞ。

そして変数名をデータに依存するのは間違ったアプローチだ。
他の入力データを持ってこられたらもう動かなくなる可能性がある。


383 :nobodyさん:2009/12/13(日) 07:26:08 ID:???
>>378
eval("\$a_$_ = $_") foreach split /\s+/, $line;
if ($a_1 == 1) {...
elsif ($a_2 == 2) {...

正気の沙汰とは思えない
use strict できないし


やるんだったら
$hash{$_} = 1 foreach split /\s+/, $line;
if (defined $hash{1}) {...
elsif (defined $hash{2}) {...

384 :nobodyさん:2009/12/13(日) 09:02:08 ID:???
>>382
読書感想文って意味のない宿題だからコピペで正解

385 :nobodyさん:2009/12/13(日) 13:18:23 ID:???
>>382
あまり意味が分からないのですが、自分は大学生ではなく、高校生です

386 :nobodyさん:2009/12/13(日) 16:26:55 ID:???
ガキにこんな事言うのなんだけど。
初心者を免罪符にして甘えるより、いっぱい見本がWEBが転がっているんだから、
そのソース見て学んだ方がいいよ。自分の為に。

387 :nobodyさん:2009/12/13(日) 17:13:31 ID:???
> いっぱい見本がWEBが転がっているんだから、

KENT 時代の見本とか要らないです><

388 :nobodyさん:2009/12/13(日) 17:33:29 ID:???
この程度の質問でkentもモダンもないだろ(笑)

389 :nobodyさん:2009/12/13(日) 17:40:38 ID:???
>>378
3×3の行列みたいな感じだからこんなのがいいんじゃないかなー

my @matrix;
open my $in, "input.txt" or die $!;

while (<$in>) {
push @matrix, [split];
}

close $in;

my @pos = (
[qw(左上 中上 右上)],
[qw(中段左 真ん中 中段右)],
[qw(左下 中下 右下)],
);

open my $out, ">output.txt" or die $!;

for my $i (0..$#matrix) {
for my $j (0..$#{$matrix[0]}) {
print {$out} "$pos[$i][$j]の数字は$matrix[$i][$j]です\n";
}
}

close $out;

390 :nobodyさん:2009/12/13(日) 20:13:53 ID:tGb7lH/N
そもそも4行目または4桁目が来た時点で破綻するのだがw

391 :nobodyさん:2009/12/14(月) 06:14:02 ID:???
>>390
4桁目がきたときには日本語でどうやって表現すんの?
「もっと右」?
4行目がきたときには日本語でどうやって表現すんの?
「もっと下」?
問題文も読めないの?バカなの?



392 :nobodyさん:2009/12/14(月) 08:15:42 ID:???
そもそも、3x3固定じゃないと破綻するようなものを格納すんのに多次元配列使う意味ないわな。

393 :nobodyさん:2009/12/14(月) 16:20:18 ID:???
my @pos = (
[qw(左上 中上 右上)],
[qw(左中 真中 右中)],
[qw(左下 中下 右下)],
);

open my $in, "input.txt" or die $!;
open my $out, ">output.txt" or die $!;

foreach my $p (@pos){
my @s = split(/\s+/, <$in>);
foreach(0..$#{$p}){
print $out "$p->[$_]の数字は$s[$_]です\n";
}
}

close $out;
close $in;

素直に書く。

394 :nobodyさん:2009/12/23(水) 12:34:01 ID:???
質問です

あるファイルの容量を表示するのに、現在はこのように書いてます

my $size = -s('data.dat');
$size = sprintf('%.1fKB', $size / 1024);

これをもう少しスマートに書きたいと思っているんですが、どのような
書き方がありますか?
一応以下のようにしてみたんですが、use warningsさんに怒られて
しまいました

my $size = sprintf('%.1fKB', -s('data.dat') / 1024);

395 :361:2009/12/23(水) 13:25:55 ID:???
>>394
-sの外側に括弧付けても怒られる?何てメッセージ出るの?

use strict;
use warnings;

warn sprintf('%.1fKB', (-s 'data.dat') / 1024);
これでメッセージでなかったけど。

396 :394:2009/12/23(水) 13:42:09 ID:???
>>395
ありゃー
括弧は-sの外ですか
それで問題なく動きました

ありがとうございます

397 :nobodyさん:2009/12/23(水) 22:18:38 ID:???
>>395じゃないけれど……

-sっていうのは演算子だから、組み込み関数とは違う、
という補足をしておこう

398 :nobodyさん:2009/12/24(木) 10:25:12 ID:???
ActivePerlでStatistics::Basicモジュールは何処に、なんという名前で保存されているのでしょうか?
標準偏差を出す計算が、自分で書いた方がモジュール使う倍くらい速かったので、
モジュールは呼び出す分遅いのか、自分は計算にforeach使ってモジュール内部ではwhileだからなのだろうか、
とか思って、コードを見てみようとC\:Perl\libを漁ってみたのですが、見つからず・・・

このままだとコーディングの話ではないので取ってつけますが、
平均を出す処理 → その値を使って標準偏差の計算と、2回ループを回していたのですが、
(そんな泥臭い方法でモジュールを使う倍速なので驚いていたのです)
もう少し洗練された書き方があれば教えてください。
my $sum1;
my $sum2;
my $number = @data;

foreach my $i(@data) {
  $sum1 += $i;
}
my $avg = $sum / $number;

foreach my $i(@data) { #ここがいかにも胡散臭い・・・
  $sum2 += ($i - $avg)**2;
}
my $stddev = sqrt( $v / $number );


399 :nobodyさん:2009/12/24(木) 10:43:42 ID:???
>>398
つperldoc -l Statistics::Basic

400 :398:2009/12/24(木) 10:56:35 ID:???
>>399
ありがとう、一つ賢くなりました。
初心者ほどmanコマンドを使わないという、Perl版の気分です。

401 :nobodyさん:2009/12/24(木) 15:08:02 ID:Kh9UPbn8
>>398
こんな式じゃなかったっけ?

foreach my $i(@data) {
  $sum1 += $i;
  $sum2 += ($i)**2;
}
my $stddev = sqrt( ($sum2-$number*$sum**2)/ $number );



402 :nobodyさん:2009/12/24(木) 18:32:09 ID:???
Statistics::Basic のソースちょっと追ってみたが、eval 使いまくり。
そりゃ遅いわ…。って呟くだけなのもなんなので。

見栄えが良いってんなら、
use List::Util qw( sum ) ;
my @ddata = ... ;
my $avg = ( sum @data ) / @data ;
my $stddev = sqrt ( ( sum map{ ( $_ - $avg )**2 } @data ) / @data ) ;



403 :nobodyさん:2009/12/24(木) 19:27:27 ID:???
eval EXPRはコンパイルあるから遅いけどeval BLOCKはそんなに
遅くないんじゃないかなぁ。

404 :nobodyさん:2009/12/24(木) 19:41:39 ID:???
ttp://d.hatena.ne.jp/tokuhirom/20080115/1200410601

*{"$pkg\::oh"}
なんですけど、
1. グロブを使う理由(右辺が関数リファレンスだから$でいいんじゃ。。。)
2. ここの中括弧の意味(ハッシュでもブロックでもないような。。。)
3. なんで:の前にバックスラッシュが必要?
この三点を教えてもらえないでしょうか?

405 :nobodyさん:2009/12/24(木) 20:47:12 ID:pZAKTGQQ
1より大きい平方数で割りきれない自然数全体の集合をSとする。
等差数列{a_n}は公差が正であり、その全ての項がSの要素である。
{a_n}の初項でないある項が2010のとき、{a_n}の個数の最大値が存在するならばそれを求めよ

この問題を解くために次のようなprogramを考えました
何がいけないのでしょうか

http://www1.axfc.net/uploader/Sc/so/66961

拡張子は適当に変更をお願いします

406 :nobodyさん:2009/12/24(木) 21:56:51 ID:???
宿題は人に頼んな

407 :nobodyさん:2009/12/24(木) 22:11:33 ID:???
540 :Name_Not_Found:2009/12/24(木) 20:38:14 ID:???
お前に指導するまえに言っておきたいことがある
かなり厳しい話もするが、俺の本音を聞いておけ
俺より先に投げてはいけない
俺より後に曲げてもいけない
バグはうまくとっぱらえ、いつもきれいに書け
できる範囲で構わないから
忘れてくれるな、デバッグもできない男に
このスレを守ることなどできないことを
お前にはお前にしかできないこともあるから
それ以外は口出しせず、黙って俺についてこい

お前の技術と俺の技術、どちらも同じだ大切にしろ
小技、大技、賢くこなせ
たやすいはずだ愛すればいい
人の陰口は言うな聞くな
それからつまらぬ嫉妬はするな
その方法はある
たぶんあると思う
あるんじゃないかな
ま、ちょっと覚悟はしておけ

スクリプトはみんなで育てるもので
誰かが苦労して
つくろうものではないはず
お前はこのスレへ、恥を忍んでくるのだから
帰る場所などないと思え
これからこのスレがお前の家


408 :nobodyさん:2009/12/24(木) 22:16:57 ID:???
>404
1. 実行時に名前空間$pkgに関数ohを作るためにグロブを使う。この関数ohはlocalしてるのでrunを抜けた時点で破棄される。
2. runはプロトタイプrun(&)で宣言されてるので、これは関数のリファレンスを渡したものとして扱われる。
すなわちrun(sub { oh() })
3. $pkg::ohだとpkg名前空間の$ohという変数になってしまう。*{$pkg . '::oh'}と等価。

409 :nobodyさん:2009/12/24(木) 22:53:34 ID:???
>>408
御回答ありがとうございます。
1.については自分がグロブをよく分かっていないことが分かりましたので勉強します。
2.については自分の質問の仕方がまずかったのかよく分かりません。
もう少し自分で考えてみます。
3.についてはすっきりしました。こんなテクがあるんですね。。。

410 :nobodyさん:2009/12/24(木) 23:23:20 ID:???
あ、俺が変な受け取り方してたか。
*{"$pkg\::oh"}の中括弧はこの括弧でくくった範囲が識別子ですよ、ってこと。

411 :nobodyさん:2009/12/25(金) 12:15:55 ID:???
>>410
中括弧にはそういう使い方もあるのですね。
perlは文法項目がたくさんあって覚えるのが大変ですが、
がんばって勉強したいと思います。
御回答ありがとうございました。

412 :nobodyさん:2009/12/25(金) 12:53:54 ID:???
>>411
パッケージ変数(グローバル変数)には色々な型がありますが(スカラー$、配列@、ハッシュ%等)、
それらはグロブを経由して格納されています。

例えば、以下のように様々な型の同名変数が宣言されたとします。

$foo = "hoge";
@foo = ("hoge", "fuga");
%foo = (hoge => 1, fuga => 2);
sub foo { print "hoge" }

このとき、グロブ*fooには、下図に示すように、SCALAR、ARRAY、HASH、CODE・・・(他にもあります)
という場所に、各型に対する実体へのリファレンス(ポインタ)が格納されており、これをスロットと
呼びます。

┏━━━━━━━━━┓
┃    ┌────┐.┃$foo
┃    │SCALAR ┿╋━━→ "hoge"
┃    ├────┤.┃@foo
┃グロブ│ ARRAY ..┿╋━━→ ("hoge", "fuga")
┃*foo .├────┤.┃%foo
┃    │. HASH  ┿╋━━→ (hoge => 1, fuga => 2)
┃    ├────┤.┃&foo
┃    │. CODE  ┿╋━━→ sub { print "hoge" }
┃    └────┘.┃
┗━━━━━━━━━┛

413 :412:2009/12/25(金) 12:54:42 ID:???
各スロットへは、

*foo{SCALAR}
*foo{ARRAY}
*foo{HASH}
*foo{CODE}

と型を中括弧で囲んでアクセスできます。

スロットには各変数のリファレンスが格納されているので、実体にアクセスするにはデリファレンス
(リファレンス先の実体を見ること)する必要があります。

例えば、$fooの実体にアクセスするには、

print ${ *foo{SCALAR} }; #=> hoge

とします。
デリファレンスは、リファレンスを中括弧で囲み、適切な型識別子(この場合$)を前に付けます。

このように、実際のアドレス値が格納されているリファレンス(ポインタ)をハードリファレンスと
もいいます。

これに対して、文字列を変数名として認識するシンボリックリファレンス(ソフトリファレンス)
というのもあります。

print ${ "foo" }; #=> hoge

同じく中括弧で囲みデリファレンスします。

414 :412:2009/12/25(金) 12:55:31 ID:???
さてここまでが前置きで、質問に答えたいと思います。

>1. グロブを使う理由(右辺が関数リファレンスだから$でいいんじゃ。。。)
先述しましたように、関数を登録する場合、グロブのCODEスロットに関数リファレンスを代入する
必要があります

前置きで話した、*fooで説明しますと、*foo{CODE}に関数リファレンスを登録すればいいのです。

*foo = sub { print "fuga" };

この式の右辺が、関数リファレンスなので、Perlはこれを察して、CODEスロットにこの関数リフ
ァレンスを代入してくれます(*foo{CODE}に代入される)。

>2. ここの中括弧の意味(ハッシュでもブロックでもないような。。。)
前置きで話したシンボリックリファレンスのデリファレンスです。
デリファレンスは中括弧で囲みます。

え〜と、ここまで回答しておいてなんですが、私もまだPerl初心者です^^;
色々ググって調べました。
間違いがあれば詳しい人が訂正してくれるでしょう。

415 :nobodyさん:2009/12/25(金) 15:55:02 ID:???
>>412
詳しい説明ありがとうございました。
グロブと中括弧によるデリファレンスの考え方が肝であり、
その肝が全く分かっていなかったようです。
まだ完全に理解出来たわけではありませんが、
じっくり考えれば首尾一貫した説明が自分の中で出来そうです。

ところで、
"&foo"は関数の実体である一方、
他方"sub { print "hoge" }"というエクスプレッションは関数へのリファレンスなので、
"sub { print "hoge" }"を"sub { print "hoge" }の実体"とするとより厳密になる気がします。


416 :nobodyさん:2009/12/25(金) 17:31:14 ID:???
>>415
確かにコードだけは実体ではないですね。
この辺りの詳しい内容は実用Perlプログラミングに載っているそうです。

417 :nobodyさん:2009/12/25(金) 17:55:48 ID:???
まーそういうのを無名関数というんだけどね
後、デリファレンスにはかぎかっこを使わない方法もある(つか、普通はそっちを使うな)

418 :nobodyさん:2009/12/26(土) 12:21:31 ID:???
>>405
とりあえず作ってみた。
答えがあってるかどうかはわからないけど。

my $num_needed = 2010;
my $max = 10**6; # $max個以上の個数は計算しない(無限ループ対策)
my %answer = ( n => 0 );

for my $a1 ( 0 .. $num_needed-1 ) { # 初項
for my $d ( 1 .. $num_needed ) { # 公差
next if ( $num_needed - $a1 ) % $d != 0;
my $n = calc_n( $a1, $d, $num_needed );
@answer{ qw(n a1 d) } = ($n, $a1, $d) if $n > $answer{n};
}
}

print "最大個数は$answer{n}個、その時の初項は$answer{a1}で、公差は$answer{d}";


419 :nobodyさん:2009/12/26(土) 12:22:18 ID:???
>>418の続き

sub calc_n {
my ($a1, $d, $num_needed) = @_;
my ($an, $n);

for ( $n = 1; $n < $max; $n++ ) {
$an = $a1 + ($n - 1)*$d;
last if is_divisible_by_square($an);
}

return $an < $num_needed ? 0 : $n;
}


sub is_divisible_by_square {
my $num = shift;

return if $num < 4;

for my $i ( 2 .. int sqrt($num) ) {
return 1 if $num % $i**2 == 0;
}

return;
}


420 :nobodyさん:2009/12/26(土) 15:04:14 ID:???
宿題の上にマルチポスト(2ch以外ん所)する奴に
遅レスなんかすんなよ。


421 :nobodyさん:2009/12/26(土) 17:55:21 ID:???
use XML::DOM;
としたのですがこの行でエラーが起きています。
XML::DOMを使う場合には別途インストールしないといけないのでしょうか?

422 :nobodyさん:2009/12/26(土) 17:57:34 ID:???
エラー内容見ればインストールすべきか分かるだろアホ

423 :nobodyさん:2009/12/27(日) 16:45:54 ID:???
perlのcgiで変数から指定したxmlファイルがない場合はファイルを作成し、保存したいです。
また、xmlがある場合はそれに追加していく形で処理したいのですが
参考になるコードなどはあるでしょうか?

424 :nobodyさん:2009/12/27(日) 18:40:27 ID:???
>>423
-f xmlファイル ? 追加 : xmlファイルを作成し保存 ;

425 :nobodyさん:2009/12/28(月) 13:39:29 ID:gHIXK3gx
正規表現で、ひらがな/カタカナ問わずにマッチさせたいのですが、うまくいっていません。
現状のテストコードは以下です
(@wordsの末尾要素はタイプミスでカタカナの"ヘ"になってしまっているもの)

use utf8;
use charnames qw(katakana hiragana);
my @words = qw(ヘシ折る へし折る ヘし折る);
for my $word (@words) {
 my $re = qr/\N{he}\N{si}折る/; #なんらかの方法でこのような正規表現を作成する
 if ($word =~ $re) { print "matched!!\n"; }
 else { print "unmatched...\n"; }
}

出力は以下です
matched!!
unmatched...
unmatched...

use charnameのカタカナの方しか効いていません。
useの引数内の順番を変えるとマッチングも変わるので、一方しかマッチしない様子です。
両方マッチさせることは可能でしょうか。

また、Unicodeブロックを使ってもう少し効率的にできそうな気もするのですが、
いろいろ試した範囲では、カタカナやひらがなの有無は判断できても
それ以上には使えない気がしました。(随分調べたのですが・・・

$word =~ /(\N{katakana}|\N{hiragana})+/
これでは@wordsすべてにマッチしますが、"ググる"にもマッチしてしまう

なにかとっかかりがあれば、お願いします

426 :nobodyさん:2009/12/28(月) 13:55:13 ID:???
アドバイスとして、かなカナ両方にマッチさせたいときはその両方パターンにマッチさせるよりも
どちらかに変換してマッチさせたほうがスマートな気がする

427 :425:2009/12/28(月) 13:56:20 ID:???
訂正です
×$word =~ /(\N{katakana}|\N{hiragana})+/
○$word =~ /(\p{InKatakana}|\p{InHiragana})+/

428 :nobodyさん:2009/12/28(月) 14:25:43 ID:???
charnameが片方しか効かないとかいうのは理解が
おかしくて、

use charnames qw(katakana hiragana);

と2つ書いても検索の順番を決めてるだけ。
同じ名前があれば先に見つけた方になる。
うまいこと文字クラスにしてくれるような便利な
ものではない。

[へヘ][しシ]でいいんじゃねーの?

429 :nobodyさん:2009/12/28(月) 14:37:42 ID:???
$word =~ tr/ここに平仮名を並べる(もしくは文字コード指定)/ここにカタカナを並べる((ry)/;

430 :425:2009/12/28(月) 14:42:33 ID:???
>>426 >>428 >>429 ありがとうございます。それぞれシンプルですね。

正規表現の方ですが、次の記述で対応できそうでした。
(>>425の変更部分の抜粋)
use charnames qw(:full);
my $re = qr/[\N{KATAKANA LETTER HE}\N{HIRAGANA LETTER HE}]
      [\N{KATAKANA LETTER SI}\N{HIRAGANA LETTER SI}]折る/x;

けどこれだと>>428をややこしくしただけ・・・
両方にマッチする記法があるはずというところからスタートしてしまったので、
ちょっとハマってしまっていたようですm(_ _)m

431 :nobodyさん:2009/12/29(火) 07:27:32 ID:???
>>426
case sensitiveでない検索エンジンを作ったときはその対策でいったな。
インデックス作る時に全部一旦大文字に変換して流し込んだ。

ちなみにヶ、ヵは本来漢字やその誤用だからひらがなにすべきではないし、
ヴは本来外来語の表現専用だからひらがなにすべきではないと俺は思う。
だからやるんだったら平仮名->片仮名変換。

432 :○~* ◆q7u/null4U :2010/01/01(金) 04:02:13 ID:PXOfMB4R
あけおめ.
ことよろ.

433 :今日からperl:2010/01/02(土) 20:11:44 ID:jeXHm8zZ
1:XML::RSSのダウンロードがわかりません。
2:5_10.dbがないと言われたので勝手に空のファイル作ったら
3:ダウンロードできたみたいな雰囲気になったけど、ダウンロードされてない。

宜しくお願いします。

434 :nobodyさん:2010/01/03(日) 08:10:22 ID:???
>>433
sudo cpan -i XML::RSS

これで質問に適当に答えればインストールされるはずだが。
2: は何でのエラー?cpanコマンド?

435 :今日からperl:2010/01/03(日) 13:03:19 ID:6EQQX2jn
>>434
sudoは内部コマンドまた外部コマンド、操作可能なプログラムまたはバッチファイル
として認識されていません。と出ます。

cpanと打つと動いて
cpan>
の画面になります。そこでinstall XML::RSSと打つと
長々と動きますが、途中でさっきの「内部コマンドまたは外部〜」
のエラーが出たり、makefile NOと最後のあたりに出たりします。


436 :nobodyさん:2010/01/03(日) 13:25:56 ID:???
まともな答えがほしいなら自分の環境くらい最初に書け
windowsのactiveperlならcpanじゃなくてppm使え

437 :今日からperl:2010/01/03(日) 14:47:50 ID:6EQQX2jn
OSはXP Home Edition2で
activeperlをインストールしました。

必要な情報がわかりませんのですいません。

438 :今日からperl:2010/01/03(日) 14:51:40 ID:6EQQX2jn
ppmと打つと
〜5_10.dbが
unable to open database file
と帰ってきます。

439 :nobodyさん:2010/01/03(日) 17:38:27 ID:???
それパソコンが物故割れてるから新しいの買った方がいいよ

440 :nobodyさん:2010/01/03(日) 17:41:26 ID:???
http://oshiete1.watch.impress.co.jp/qa5106481.html

441 :nobodyさん:2010/01/04(月) 01:50:08 ID:???
>>438
エラーの原因を人に聞くときは、
> 〜5_10.dbが
などと勝手に省略しないで、丸ごとコピペするのが鉄則。余りに長い場合を除くが。

>>440
DOS時代からPC使っていると本能的に避けてる問題だから、ユーザー名に漢字を使っていてエラーになったPCをチェックしたとき、それが原因だと気づくまではまったことがある。

442 :nobodyさん:2010/01/04(月) 11:09:43 ID:???
家庭用PCだし、ユーザ名なんぞイニシャル一字でいいや



と思って入力したら、実は全角が入ってて泣いた。

443 :nobodyさん:2010/01/04(月) 14:11:57 ID:N9GeTuHk
はじめまして!初心者です。
いい感じのフリースクリプトのページを見つけたのですが、
改造したいのにどこを変えればいいのか、全然意味がわかりません!

http://homepage1.nifty.com/kkuri/computer/ExAuction.html

ここに載ってるスクリプトをどなたか解説していただけませんか??(涙)




444 :nobodyさん:2010/01/04(月) 17:13:05 ID:???
>>443
授業料払ってくれるならな・・・。
ついでに言えば一体何年前のスクリプトなんだといいたくなる位
ひどい代物だから学ぶことなんか何もないぞ。

445 :nobodyさん:2010/01/04(月) 19:24:02 ID:???
こういうの見るとネットの普及も良し悪しだなと思う

446 :nobodyさん:2010/01/04(月) 19:34:23 ID:N9GeTuHk
>>444
古いものなんですか、初心者過ぎてわかりませんでした。
フリーマーケットの出来るプログラムを書きたかったんですけど、独学じゃ無理っぽくて。
エクセルも使えないし(涙)


447 :nobodyさん:2010/01/04(月) 19:43:17 ID:N9GeTuHk
無理だと早く気づいていればよかった;;

愚痴すいません。

448 :nobodyさん:2010/01/05(火) 07:28:10 ID:???
>>446
そういう時のためにサポート付きのプロダクトがあるわけだが。
まあ普通それなりの値段はするから覚悟しとけよ、と。

結局必死で勉強するか金払うかの二択。

449 :nobodyさん:2010/01/05(火) 09:53:32 ID:???
お金やら信用やら絡むから人に改造頼んでも自分でメンテできないと恐ろしいかも。

450 :nobodyさん:2010/01/05(火) 11:59:11 ID:???
>>444
現代風の学ぶべきサンプルがあったら紹介お願いします。

451 :nobodyさん:2010/01/05(火) 12:14:07 ID:???
>>450
PlaggerとかMojoじゃないかな?

452 :nobodyさん:2010/01/05(火) 16:51:16 ID:???
>>450
とりあえず一定規模以上の開発にCGIスクリプトはありえん。WAF使えと。
WAF: Catalyst
DB: DBIC / CDBI
Tmpl: TT / CS

Moose Catalyst使うならMooseも覚えとけ。

サンプルはそれぞれのマニュアル参照。
フリマのサンプル?知るか。有償で作ってやってもいいが。

453 :nobodyさん:2010/01/05(火) 16:52:22 ID:???
>>451
さすがに物販サイトにそれPlaは言いすぎだろ。

454 :nobodyさん:2010/01/05(火) 17:15:38 ID:???
じゃあPlack/PSGIで

455 :nobodyさん:2010/01/05(火) 17:18:20 ID:???
>>454
Plackはレイヤーが違う。
Plack::Apache2とCatalyst::Engine::Plack入れときゃいい話で
WAF使うならPSGIは意識しなくていい。

モジュール名はうろ覚えだから間違ってたらスマソ。

456 :nobodyさん:2010/01/05(火) 17:27:13 ID:???
ClearSilverはコンパイル必須なのが敷居高いな
それとPerlバインディングは妙な使いづらさがある
速いのはいいんだけど

457 :nobodyさん:2010/01/05(火) 17:32:59 ID:???
>>456
俺はふつーCSだろとか思ってるんだが、そういうツッコミがあると
思ってTTも併記しといた。TTはXSじゃないよな多分。

458 :nobodyさん:2010/01/05(火) 20:58:54 ID:???
現代風ってことならMENTAがいいんじゃない
入り口としては簡単な部類に入ると思う

459 :nobodyさん:2010/01/05(火) 21:26:39 ID:???
いくらTTが遅いとはいえそこまでパフォーマンス求められる状況もそう無いだろう
どんだけアクセス捌く予定だよ

460 :450:2010/01/05(火) 23:34:33 ID:???
>>451-459
色々とthxです。
ちなみに>>450 = >>398で、>>443とは別人です・・・。
モジュールの中身を初めて読んでちょっと死にそうだったので、
もう少し身の丈にあったものがあるかなと・・・

461 :nobodyさん:2010/01/06(水) 00:47:37 ID:???
じゃあまずはClass::Data::Inheritable

462 :nobodyさん:2010/01/06(水) 08:59:56 ID:UNfDPcgP
UNIX板のApacheスレで聞いたのですが、板違いといわれてこちらに来ました。

Windows XP Professional SP2で、apache2.2を動かしていて、
perl v5.10.0でプログラムを書いていますがうまく動きません。

具体的には、
http://www.stackasterisk.jp/tech/program/perl04_02.jsp
に書いてある★Dにsleep 10;を書くと、すぐにブラウザが開放されず、
10秒ほど読み込み中の状態になります。すぐにブラウザが開放されて、
バッファされてる出力も書き出されるのが希望なのですが、
Windowsを使っているのが悪いのでしょうか?


463 :nobodyさん:2010/01/06(水) 09:12:27 ID:???
>>462
よく知らんがWindowsはperforkでのエミュレーションだからだろうな。
sleepはシステムコールだからプロセス潰すし。

464 :nobodyさん:2010/01/06(水) 09:55:50 ID:???
>>463
お返事ありがとうございます。forkにこだわるつもりは無いのですが、
Windowsをサーバーにして、出力を全て出しつつ裏で時間のかかる処理を
続けるということは、可能なのでしょうか? $|=1とかも試したのですが、
ダメでした。

465 :nobodyさん:2010/01/06(水) 11:20:05 ID:???
ほんとにforkの問題なのかな。
forkせずに、単にclose(STDOUT);してsleepするだけだとどうなる?

466 :nobodyさん:2010/01/06(水) 12:12:42 ID:???
http://cepheid.blog17.fc2.com/blog-entry-92.html
STDERRも閉じてみたらどうだろ。

467 :nobodyさん:2010/01/06(水) 12:50:51 ID:???
>>465
今やってみたのですが、10秒程度読み込み中が続きました。

>>466
こちらはうまく行きました!ありがとうございます。
今本当に動かしたいプログラムを書き換えています。
また何か聞くかもしれませんがそのときはよろしくお願いします。

468 :467:2010/01/06(水) 15:56:39 ID:g9KuWVT/
もう一つ教えてください。perlの処理時間とApacheの設定の問題です。
perlの処理は20分もあれば終わると見積もっているのですが、
Apacheの設定ではデフォルトは300秒でタイムアウトですよね。
これを回避するには c:/xampp/apache/conf/httpd.conf を書き換える
しかないのでしょうか。 http://httpd.apache.org/docs/2.2/mod/core.html#timeout
その解説があるので、httpd.confの http://httpd.apache.org/docs/2.2/mod/core.html#options
書いてある<Directory "C:/xampp/htdocs">のところに適当に Timeout 1200 と書きましたが
いちおうこれで動いているようなのですが、大丈夫でしょうか?
ちょっとスレ違いになってしまいますが、よろしくお願いします。

469 :nobodyさん:2010/01/06(水) 16:17:40 ID:???
それは今度こそUNIX板のApacheスレだよね
462で出力を閉じた時点でApacheの処理は完了していて、タイムアウトとか関係なくなるように思うが


470 :nobodyさん:2010/01/06(水) 17:16:19 ID:???
winでどんな処理をやっているんだよ

471 :nobodyさん:2010/01/06(水) 17:21:16 ID:???
根本から仕組みを見直した方がよさそう。

472 :nobodyさん:2010/01/06(水) 17:28:11 ID:U4hPtr/3
CGI で動いてる Perl から別プロセスで起動させた方が早いんじゃない?
で、処理完了時に適当なファイルを作るようにすれば、そのファイルの有無で
処理の完了がわかる。

473 :467:2010/01/07(木) 11:53:58 ID:???
すれ違いすみません、で一応その後ご報告。
Apacheのhttpd.confの書き方はまずかったようで、元に戻しました。
で、STDERRを閉じただけでは、なぜか時間のかかる処理部分は実行されない
という結果になりました(ブラウザは開放されます)。

で結局forkを使って子プロセスに処理させるようにして
とりあえずの目標は達成されたようです。いろいろとありがとうございました。

474 :467:2010/01/07(木) 22:52:52 ID:???
>>470
秘密にする意味も無いので、お教えしますと、こんなページを作っています。

freesoft板@Virtua ch
http://virtua-ch.ddo.jp/cgi-bin/read.cgi?freesoft

興味があればご覧下さい。

475 :nobodyさん:2010/01/07(木) 22:58:16 ID:???
phpの吐いたソースを書き出してるんですが、
書き出したファイルの内容と新しく吐いたソースの比較はどうすればできますか?
宜しくおねがいします。

476 :nobodyさん:2010/01/08(金) 00:33:17 ID:???
>>474
そのURLだけじゃまったく分からないがエスパーすると
普通、ログの収集にはcronなりその類のスケジューラを使うと思う

>>475
>phpの吐いたソースを書き出して
ここが意味不明
phpの吐いたソースとは何のソース?
そしてそのソースを書き出すのはいったい誰?phpのように思うんだが

477 :nobodyさん:2010/01/08(金) 06:01:19 ID:???
>>475
diffってコマンドは知ってるよね?Macには標準で入ってるし、
Winもdiffで検索すれば比較ソフトは出てくる。
俺がお勧めなのはvimdiffだがな。

478 :475:2010/01/08(金) 19:43:24 ID:???
PHPとperlを間違えました。(´・ω・`)PHPスレ逝ってきます。
ごめんなさい。

479 :nobodyさん:2010/01/10(日) 01:28:27 ID:???
http://tvipper.sytes.net/
Perlで組んでいるらしいのだが
負荷に耐えられないと嘆いてる。誰か助けてやってくれ

480 :nobodyさん:2010/01/10(日) 02:34:52 ID:???
vipのことはvip内で処理しろよ
それはさておき、どんなに頑張ってもコードだけじゃ解決できない問題のような気がするぞ
サーバを増やすなどしてスケールアウトするのが一番なんじゃね

481 :nobodyさん:2010/01/10(日) 19:02:07 ID:???
スレ違いだよVIPで死ね

482 :nobodyさん:2010/01/11(月) 09:59:05 ID:???
>>479
Twitterタイプのサービスか?
Twitterがどれだけ設計とスケールに苦労して今の状態を維持してるのか
1000回くらいググってから出直せ。

483 :nobodyさん:2010/01/12(火) 23:50:01 ID:???
そういやtwitterどーなってんだろ。ユーザidが変えられるのが斬新過ぎる

484 :nobodyさん:2010/01/13(水) 07:23:08 ID:???
>>483
最新のtweet、ちょっと古いtweet、もっと古いtweetとサーバーを分けて
それぞれ必要なだけスケールする手法を取ってた気がする。
また変えたかも知れんが。

485 :nobodyさん:2010/01/17(日) 17:46:44 ID:???
Arkansasという文字にはaが3つ含まれて居ますが、
これ(a)を数える方法を教えてください。

486 :nobodyさん:2010/01/17(日) 17:49:09 ID:???
$hoge = tr/Aa//;
もしくは
$hoge = s/(a)/$1/ig;

487 :nobodyさん:2010/01/17(日) 17:50:17 ID:???
$_="Arkansas"; の場合な

488 :485:2010/01/17(日) 17:55:30 ID:???
nobodyさんありがとうございます!

489 :nobodyさん:2010/01/17(日) 18:17:50 ID:Ido2Vdjf
何もレスしてないのにありがとうなんて照れるなぁ

490 :nobodyさん:2010/01/17(日) 19:52:03 ID:???
>>484
脳味噌のレベルが低いって事
つまりお 前 の 事 だ

491 :nobodyさん:2010/01/18(月) 15:49:13 ID:???
助けてくださいお願いします。
以下のようなハッシュがあります。

$SERIAL = {
'1263794915' => {
'link' => 'http://localhost.com/',
'delete_flg' => '1',
'day_end' => '2010/01/15 24:10:19',
'title' => 'そろそろ',
'day_start' => '2009/12/15 24:10:19'
},
'1263794833' => {
'link' => 'http://localhost.com/',
'delete_flg' => '1',
'day_end' => '2010/02/15 24:10:19',
'title' => '本当におねがいします',
'day_start' => '2009/12/15 24:10:19'
},
'1263794894' => {
'link' => 'http://localhost.com/',
'delete_flg' => '1',
'day_end' => '2010/02/15 24:10:19',
'title' => 'とりあえずこれでおいておくか',
'day_start' => '2009/11/15 24:10:19'
},
};

$hash{'ID'}{'day_start'} の 開始日付でソートしたいのですがどうすればよろしいでしょうか?

492 :nobodyさん:2010/01/18(月) 16:12:12 ID:r5bEwLM5
sort keys($SERIAL);

だけでいいような気がする

493 :nobodyさん:2010/01/18(月) 16:15:20 ID:???
それじゃ無理だろ

494 :nobodyさん:2010/01/18(月) 16:32:26 ID:r5bEwLM5
ごめキーしか見てないねw

495 :nobodyさん:2010/01/18(月) 16:34:05 ID:???
@keys = sort {$a <=> $b} (map {$SERIAL->{$_}->{day_start}} keys %$SERIAL);
@keys = map{s/\///g} @keys;
@sort_keys = sort {$a <=> $b} @keys;

何がやりたいのか分からんけどこれでいいか?

496 :nobodyさん:2010/01/18(月) 16:36:10 ID:???
my @ids = sort {
  $SERIAL->{$a}->{day_start} cmp $SERIAL->{$b}->{day_start}
  # 文字列比較だから時刻に24時とか0時が混在してると変なことになるので、
  # それが嫌ならstrptimeとかtimelocalでエポックに戻して数値比較するなりなんなり。
} keys %$SERIAL;

for my $id (@ids) {
  # やりたい処理
  print $SERIAL->{$id}->{ほげほげ}, $/;
}

ソート後のを元の$SERIALと同じ形式で格納するのはハッシュリファレンスじゃ無理。

497 :nobodyさん:2010/01/18(月) 16:36:21 ID:r5bEwLM5
sort { $a->{'day_start'} cmp $b->{'day_start'} } keys($SERIAL);


かな?
携帯からソース書くのって面倒臭いね

498 :nobodyさん:2010/01/18(月) 16:37:11 ID:???
あ、
@keys = map {$SERIAL->{$_}->{day_start}} keys %$SERIAL;
@keys = map {s/\///g} @keys;
@sort_keys = sort {$a <=> $b} @keys;

こうだったわ

499 :nobodyさん:2010/01/18(月) 16:46:12 ID:???
うわ、後もう一つミスがあった

@keys = map {$SERIAL->{$_}->{day_start}} keys %$SERIAL;
@keys = map {s/[/:\s]//g} @keys;
@sort_keys = sort {$a <=> $b} @keys;

500 :nobodyさん:2010/01/18(月) 17:03:19 ID:???
>>491
DateTimeでオブジェクトにしようとしたら24時ってあってうまくいかなかった。
つか、みんな頭いいな。

必死にindex作ってたよ
# day_startのDateTimeをkeyにしたhash
my %SERIAL_id_of;
my $fmt = DateTime::Format::Strptime->new(pattern => '%Y/%m/%d %T');
for my $id (keys %{$SERIAL}) {
  my $datetime_of_day_start = $fmt->parse_datetime($SERIAL->{$id}->{day_start});

  alias my $ids_ref = $SERIAL_id_of{$datetime_of_day_start};
  if ($ids_ref) {
    push @{$ids_ref}, $id;
  }
  else {
    $ids_ref = [$id];
  }
}

warn Dumper %SERIAL_id_of;

my @sort_ids;
for my $datetime_of_day_start (sort keys %SERIAL_id_of) {
  push @sort_ids, @{$SERIAL_id_of{$datetime_of_day_start}};
}

warn Dumper @sort_ids;

501 :IT土方~バグ蔵 ◆qOWUwFXrL2 :2010/01/19(火) 09:03:22 ID:???
>>492-500
ありがとう!!!!

502 :nobodyさん:2010/01/19(火) 15:02:27 ID:???
質問させてください。
最後の行あたりでよくわからないエラーをはいてしまい、実行すらできません。。

#円周率の近似値を求めるプログラム

$count=0;
for($n=1; $n<=1000; $n++){

$x=(rand);
$y=(rand);

$point = ($x * $x) + ($y * $y);

if($point<1){
$count++;
}

$pi= $count / $n;
$pi= sprintf "%.8f";
$pi= pi * 4;
printf "the loop repeated %d time",$n;
printf "pi is %.8f",$pi;

503 :nobodyさん:2010/01/19(火) 15:06:31 ID:???
そのよくわからないエラーとやらもさらせよ。

504 :nobodyさん:2010/01/19(火) 15:09:10 ID:???
forの{が閉じてない

505 :nobodyさん:2010/01/19(火) 15:09:51 ID:???
Unquoted string "pi" may clash with future reserved word at ...
Missing right curly or square bracket at ...

506 :nobodyさん:2010/01/19(火) 15:28:07 ID:???
なぜprintf関数を使うのか理解できない

507 :nobodyさん:2010/01/19(火) 18:54:30 ID:???
助けてください。
以下の処理で文字コードの関係により困ってます。
クライアント側のjavascriptでjsonファイルを扱います。
jsonファイルはPerlの「print $jsonobj」によって吐き出します。
PerlscriptはUTF-8、jsファイル・htmlファイルはshiftjisです。
PerlでEncodeによりutf8→shiftjisにしているのですが、それ以外になにかやる事があるのでしょうか?

☆☆☆javascript☆☆☆
document.write('<script type="text/javascript" src="Perlで書いたjsonファイルをはくプログラム"></script>');

☆☆☆ Perl ☆☆☆☆
$jsonobj = q| array_jeson = |.$jsonobj;
Encode::from_to($jsonobj,'utf8','shiftjis');
print $jsonobj;

508 :nobodyさん:2010/01/19(火) 19:26:16 ID:???
>>507
>>1

509 :507:2010/01/19(火) 19:27:54 ID:???
事故解決しました
Content-Type: text/html; charset=☆☆☆\n\n
☆☆☆の部分がミスってただけでした orz
UTF-8で出力したりいろいろパターンがあってミスってました

510 :nobodyさん:2010/01/21(木) 00:41:21 ID:???
worker MPMを使用したApache上でPerl-CGIを動作させる上で注意することはありますか?
mod_perlのように、グローバル変数を使うと同じプロセス内の別スレッドから見えてしまうということはあるのでしょうか。
また、1リクエスト1プロセスを前提にした time . $$ の値は、同時に複数のリクエストで同じ値を持ちうるのでしょうか。
同一プロセスでもスレッドを識別するための情報を識別する環境変数はありますか?
thread-safeなPerlプログラミングの記事やドキュメントなどをご存知でしたらどなたか教えてください。

511 :nobodyさん:2010/01/21(木) 17:39:33 ID:???
500エラーについて教えて下さい。

・print "Content-Type: text/html\n\n";以降の行にコメントを書く → 500エラー

・HTML::Templateのサンプルそのままコピって、my $tmpl_out = $template->output; → 500エラー
 my $out = $template->output;
 print "$out";ならセーフ。

ちょっと厳格すぎる気がするのですが、こんなモンでしょうか?

512 :nobodyさん:2010/01/21(木) 18:24:54 ID:rPXIzyqa
500 Internal Server Error に厳格も寛容もなくて
premature end of script headers を食らうようなコードを書いてるだけだと思うんだけど。

perl -Tc script.cgi

これでずらずらとお知らせが出て来ない?

513 :nobodyさん:2010/01/21(木) 18:39:16 ID:???
>>511
全角空白を入れてたり改行コードが実行環境に合ってなかったりってのがありがち

>>512
-W や -w でなく -T なのか

514 :nobodyさん:2010/01/21(木) 19:00:48 ID:???
>>513
なんで -T なんだよといま自分に突っ込んでる。ごめん。

515 :nobodyさん:2010/01/22(金) 11:47:37 ID:???
ハッシュで、
%hash = qw(
  1 foo
  2 hoge
  3 bar
);
という書き方がとてもラクで気に入っているのですが、
これで二次ハッシュを書くにはどうしたら良いのでしょうか?
以下のようにするとダメでした。
my %hash = qw(
  Friend {
    hoge Perl
    foo Perl
  }
  Enemy {
    fuga Ruby
  }
);
qw使っては無理でしょうか?

516 :nobodyさん:2010/01/22(金) 12:16:25 ID:???
まずqwの意味とかハッシュとかリファレンスをちゃんと理解したほうがいい

こういう風になら書けるが見づらいだけなのでおすすめはしない
my %hash = ( Friend => { qw/hoge Perl foo Perl/ }, Enemy => { qw/fuga Ruby/ } );

517 :nobodyさん:2010/01/22(金) 13:01:13 ID:???
>>515
そのままじゃ無理だね。

( 'Friend', '{', 'hoge', 'Perl', 'foo', 'Perl', '}', 'Enemy', '{', 'fuga', 'Ruby', '}' )

というリストをパラメータでもらい、'{', '}'を解釈して

( 'Friend', { 'hoge', 'Perl', 'foo', 'Perl' }, 'Enemy', { 'fuga', 'Ruby' } )

というふうに組み替えてくれるサブルーチンqwhashを作って

my @hash = qwhash qw(...);

とすればいいんじゃね?

518 :nobodyさん:2010/01/22(金) 13:01:56 ID:???
sub qwhash {
my(@l) = @_;
my @stack = ();
my $r = [];

while (@l) {
my $x = shift @l;

if ($x eq '{') {
push @stack, $r;
$r = [];
} elsif ($x eq '}') {
@stack or die "too many '}'";

push @{$stack[0]}, {@$r};
$r = pop @stack;
} else {
push @$r, $x;
}
}

@stack == 0 or die "too few '}'";

return @$r;
}

519 :nobodyさん:2010/01/22(金) 14:18:53 ID:BvoGYaqc
既出かもしれませんが、CGIを書いていてある場合だけは、出力を
index.htmlにした方がいいと気づきました。この場合
open(STDOUT, ">c:/xampp/htdocs/ほげほげ/index.html") || die "cannot open index.html";
とやってしまっていいものでしょうか?

実際にやってみた結果は、openは失敗せず、index.htmlも作られないという感じでした。
いまからprint 文を全部書き換えるのは面倒だなと思っているのですが、いい方法無いでしょうか?

520 :nobodyさん:2010/01/22(金) 14:40:44 ID:???
>>519
既存のファイルハンドルを指定していきなりopenした場合は、自動的にcloseしてから
openしてくれるので、それでもいいはずだけどな。何か思い違いをしてないかよく
調べた方が良い。

別の方法としては、select FILEHANDLEでデフォルトのファイルハンドルを切り替える、
ってのもあるよ。

521 :nobodyさん:2010/01/22(金) 15:37:55 ID:???
>>516-518
ありがとうございます。
自分でハッシュテーブル書くのにも空白使えないし、
変数引っ張ってくるのも危ないから、やっぱりqwは使わないようにします。



522 :nobodyさん:2010/01/22(金) 15:39:36 ID:???
>>520
STDOUTをただ閉じるとApacheとのつながりが切れるのではないかと思いこうしました。
良くは調べてないのですが、教わった方法をやってみました。こちらはうまく
index.htmlが生成されました。ただ画面自体はエラーなんですね…
これをどうしようか悩んでいます。

523 :nobodyさん:2010/01/22(金) 17:25:23 ID:???
>>519-522
こういう事をしたいの?

#!/usr/bin/perl -w
use strict;
use Fcntl qw(:flock);
my $file = './test.txt';

print "Content-Type: text/plain\n\n";

my $fh;
if ($ARGV[0]) { # ファイルへ
  open $fh, '>', $file or die $!;
  flock $fh, LOCK_EX;
  print "$file へ出力しました。";
}
else { # クライアントへ
  $fh = \*STDOUT;
}
print $fh 'foo!';
__END__

524 :nobodyさん:2010/01/23(土) 08:32:36 ID:???
>>523
それだとあちこちを書き直さなければいけないので、それ以外の方法を模索していました。
結局STDOUTを切り替える前に
Content-type:text/html; charset=shift_JIS

<DOCTYPE>
<html lang="ja">
<html>
<head>
<meta http-equiv="refresh" content="0;url=../hoge">
</head>

<body bgcolor=#ffffff>
</body>
</html>
と出力するようにしました。

525 :nobodyさん:2010/01/24(日) 12:30:42 ID:h+yaOkgW
プログラム板とどちらに質問しようかと思ったのですが、こちらにします。

if($picture) {
# print <<END_OF_MESSAGE;
# <center>
# <img src="$picture" alt="">
# </center>
# END_OF_MESSAGE
}

という部分がCGIにあるのですが、コメントをはずすとファイル終端でエラーがでます。
ヒアドキュメントは見よう見まねで他でも使っているのに、なぜここだけエラーになるのか
ヒアドキュメントについて詳しく書いた本を持っていないのでよく分かりません。
理由分かる方いましたら教えてください。

526 :nobodyさん:2010/01/24(日) 12:42:27 ID:???
$s= <<END_OF_MESSAGE;
if($picture) {
# print <<END_OF_MESSAGE;
# <center>
# <img src="$picture" alt="">
# </center>
# END_OF_MESSAGE
}
END_OF_MESSAGE

きっとこうなってるのさ

527 :nobodyさん:2010/01/24(日) 12:47:04 ID:???
いま試しに

my $picture

if($picture){
print <<END_OF_MESSAGE
<img src="$picture" alt="">
END_OF_MESSAGE
}

だけのファイルを作ってperl -cw してみたんですが

> syntax error at aaa.cgi line 3, near "){"
> Can't find string terminator "END_OF_MESSAGE" anywhere before EOF at aaa.cgi line 4.

とでます。やっぱり意味が分かりません。
なぜEND_OF_MESSAGEが見つからないということになるんでしょうか。


528 :nobodyさん:2010/01/24(日) 12:55:26 ID:???
>>525
本がなければperldocを読めばいいじゃない。
http://perldoc.jp/docs/perl/5.10.0/perlop.pod#item__lt__lt_EOF_here_doc_heredoc_here_document__lt__lt_

>>527
my $picture の後ろに ; が無いから。
print <<END_OF_MESSAGE の後ろにもないけど、
これは if ブロック内の最後の文なので省略可能。

529 :nobodyさん:2010/01/24(日) 13:06:22 ID:h+yaOkgW
>>528
perldocの最初の方だけ見て

my $picture="c:/xampp/htdocs/hoge.gif";

if($picture){
print <<END_OF_MESSAGE;
<img src="$picture" alt="">
END_OF_MESSAGE
}

と書き直してみましたが、
Can't find string terminator "END_OF_MESSAGE" anywhere before EOF at aaa.cgi line 4.
と出るのはかわりません。なぜでしょうか?

530 :nobodyさん:2010/01/24(日) 13:13:42 ID:???
END_OF_MESSAGEの末尾にゴミ糞が付いてないか?

531 :nobodyさん:2010/01/24(日) 13:15:23 ID:???
END_OF_MESSAGEスペース
だからじゃね

532 :nobodyさん:2010/01/24(日) 13:17:58 ID:U2dkcd6K
自鯖で試したけど問題なかった
恐らくは改行コード・・・

533 :nobodyさん:2010/01/24(日) 13:19:28 ID:???
そのとおりでした<スペース
お騒がせしました。Meadowの blank-mode は
常にオンにしておこうかな…

534 :nobodyさん:2010/01/24(日) 14:33:19 ID:???
DB使えばいいのに
難しいこと全部やってくれるからオススメ。
初心者スレだから書いてみた。

535 :nobodyさん:2010/01/24(日) 16:59:34 ID:U2dkcd6K
こうやってクソサイトが増えるのであった・・・

536 :nobodyさん:2010/01/28(木) 23:57:36 ID:MprgKrS4
FreeBSDのサーバーからWindows系サーバー(2008R2)へ
Net::FTPを使ってファイルのアップロードを行おうと考えております。

今まではFreeBSDサーバーへのアップロードであったため
$ftp->cwd
$ftp->put
$ftp->ls
などのコマンドが使用出来ましたが、Windows系サーバー(2008R2)
の場合はこれらのコマンドは使用出来るのでしょうか?

どなたかご存知の方いらっしゃいましたらお願い致します。

537 :nobodyさん:2010/01/29(金) 00:21:05 ID:???
2008R2だったらIIS用のFTP7.5があるべ
それくらいは大丈夫だよ

538 :nobodyさん:2010/01/29(金) 00:26:29 ID:kJRAFybz
FTP を名乗ってるなら、基本的な動作は変わらないでし。

539 :nobodyさん:2010/01/29(金) 00:49:32 ID:XeE9xFHb
>>537
>>538
接続先OSがwindowsの場合、lsコマンドなどは無いので、FTPのコマンドも
独自のものかと思い質問致しました。
素早いご返答ありがとうございました。

540 :nobodyさん:2010/01/29(金) 09:51:16 ID:???
正規表現で、「キッチンの」にマッチさせたくて
「キッチンの方の」にマッチさせたくない場合は
どう書けば良いですか?
後ろに「方」が付くかどうかの違いです。

541 :nobodyさん:2010/01/29(金) 09:58:46 ID:kJRAFybz
?

542 :nobodyさん:2010/01/29(金) 10:00:47 ID:???
キッチンの(?!方の)
否定後読み
正規表現単体の質問ならプログラム板の正規表現スレでやれよ

543 :540:2010/01/29(金) 10:09:27 ID:???
分かりました、ありがとうございます!

544 :nobodyさん:2010/01/30(土) 00:13:34 ID:???
それ否定の先読みっていうんじゃ・・・

545 :nobodyさん:2010/01/30(土) 00:28:03 ID:+AHy4UTd
3,5 3,7 1,7 1,10

のような感じで、1行に1つの多角形の座標を記述したファイルがあるとして、

任意の XY 座標が、上記ファイルの各行に記述された多角形内に
収まってるかを検索する方法として、なにか検索の定石みたいのはありますか?


GPS 座標からどこに居るのかを地名付きで表示したいと思っています

自治体の面積データは国が配ってるデータを使用します

546 :nobodyさん:2010/01/30(土) 00:46:09 ID:9jHLZuCt
地名から座標はゲオコードで出来るけど逆も出来るか調べてみたら?

547 :nobodyさん:2010/01/30(土) 00:51:18 ID:9jHLZuCt
リバースジオコード

548 :nobodyさん:2010/01/30(土) 00:55:19 ID:???
>>545
定石かどうかは知らないけど、CPANにこんなのがあった。
http://cpansearch.perl.org/src/MARKOV/Math-Polygon-1.01/lib/Math/Polygon/Calc.pm
polygon_contains_point

まぁ「GPS」とか「Geo」とかでモジュール探した方が良さそうではある。
http://search.cpan.org/

549 :nobodyさん:2010/01/30(土) 02:32:59 ID:+AHy4UTd
教えてもらったキーワードと CPAN モジュールをヒントにやってみます!

ありがとうございます m(_ _)m

550 :nobodyさん:2010/01/30(土) 02:44:24 ID:0KWCr7Sg
久しぶりにperlでcgiを書こうと思いましたが、俺には意味がわからないエラーが2つほど発生しました。
開発環境: winxp, anhttpd, もしくはBlackJumboDog, ActivePerl5.8.7
状況: ずーっと以前に中途半端に作ったプログラムファイルを見てみたら、いきなり意味がわからなかった。

--------------------------------------------
1: perl -c でコンパイルできない記述が、anhttpdからcgiとして起動させるとなぜか普通に動く。(BlackJumboDogからでも動く)
 コマンドから -wc で動かすと以下のメッセージを吐く。
 Can't find string terminator "]" anywhere before EOF at - line 211.
 (このエラーメッセージ通りの記述ミスはない)

 どうゆうケースが考えられますか?ちょっと検討がつきません。

---------------------------------------------
2: htmlだけを出力するcgiを試しに作ってみた。
  コマンドから -w で動かすと以下の出力をする。

Content-Type: text/html;charset=Shift_JIS
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><TITLE>test</TITLE></HEAD><BODY>
test出力できてます
</body></html>

  なぜかanhttpdから動かない。他のcgiはanhttpdで動く。
  BlackJumboDogからだと動く。
  どうゆうケースが考えられますか?

---------------------------------------------
正直、この手のエラーは頭痛がします。
純粋にperlの質問じゃなくてすみません。

551 :550:2010/01/30(土) 04:52:59 ID:???
2のほう解決しました。
よく考えるとヘッダのあとの改行は二つでした。
こんなことを3時間以上も考えるなんて恐ろしい。

1のほうはまだ未解決頭痛続行中です。お願いします。

552 :nobodyさん:2010/01/30(土) 05:04:21 ID:???
>>551
> Can't find string terminator "]" anywhere before EOF at - line 211.
> (このエラーメッセージ通りの記述ミスはない) ←これが気のせい

line 211に何かがあるわけじゃなくてもっと手前で閉じるべきもんを閉じてないと
パーサさんが EOF まで探したところで挫折する。

553 :550:2010/01/30(土) 05:13:12 ID:???
えーと、一応記述は自作のプログラムを使って分解した段階までは問題ありませんでした。

そうではなくて今不思議なのは、なぜhttpdから記述を引き渡すとコンパイルされない物がコンパイルされ、
その上エラーメッセージすら吐かずに稼動するのか?と言う所にあります。

554 :nobodyさん:2010/01/30(土) 05:18:02 ID:???
>>553
記述に間違いがないと言うのならコードを晒しなさい
こっちでもテストしてみるし

555 :550:2010/01/30(土) 06:23:33 ID:???
ほぼ原因わかりました。
秀丸から直接コマンド打ってたのですが、UTF8のファイルを開いててもsjisとして扱ってくれてるくさい?です。
秀丸で打ったコマンド → perl -wc <con >con 
  #↑今開いてる秀丸タブの内容を引数とし、出力結果を新規タブに出力しろと言うコマンド

UTF8として認識させた ー (伸ばす棒)を、
q[ー]; で、UTF8ファイルでもエラーになります。
もちろん 'ー' だとコンパイルされます。

ー はsjisで815b、 ] は5b なので、たぶん断定です。
ただの偶然で違うかもしれませんが、もうめんどいのでこれ以上調べません。
UTF8ファイルからまさかsjisの文字コード問題でハマるとはね。
秀丸死ね。

556 :nobodyさん:2010/01/30(土) 06:27:31 ID:???
> 秀丸から直接コマンド打ってたのですが

んな後出しをするから「内部処理がCP932なんじゃね?」と書いてもらえない

557 :nobodyさん:2010/01/30(土) 07:11:34 ID:???
>>555
秀丸じゃなくてお前がし(ry

558 :nobodyさん:2010/01/30(土) 09:25:08 ID:???
>>545
ここのAPI使う
http://www.geocoding.jp/


559 :nobodyさん:2010/02/01(月) 13:06:09 ID:???
俺もWindowsで(Samba経由で)Linux上のファイルを修正して散々500エラー食らいましたが、
何故WindowsからはNGなのでしょうか?
Winが触ったファイルを回復させる方法は、nkfしか知らないのですが・・・


560 :nobodyさん:2010/02/01(月) 13:23:02 ID:???
そういう人は向いてないから今からでもIIS+VBかなんかに乗り換えた方が
いいんじゃないかなぁ

561 :nobodyさん:2010/02/01(月) 13:41:59 ID:???
要するに「そういうモノだ」ということですかね。
よく考えたらレンタルサーバにFTPとかでUPする場合、
Win側のテキストエディタで文字コードと改行コード指定するしかないから、
サーバ側の設定の問題かと思ったのですが。

> IIS+VBかなんかに乗り換えた方が
Perl → PHPに乗り換える方が現実的なような。
まぁPerlが何となく好きなんで、もうちょいPuTTY+vimで頑張りますよ。。。


562 :nobodyさん:2010/02/01(月) 14:44:14 ID:???
perlはFastCGIにしろmod_perlにしろ、実運用でめんどくさいんだよね<PHPに比べると。


563 :nobodyさん:2010/02/01(月) 19:10:33 ID:???
nkf で復旧できるのに鯖側の設定を疑うのか。

564 :nobodyさん:2010/02/01(月) 23:00:00 ID:???
Winのエディタで壊れてnfkで復旧 → Winのエディタってどーなってんの?
Winのエディタで作成してFTPでうp → Winのエディタで動くってサーバどーなってんの?

鯖のシステムの文字コードをcp932にしたらおk^^
って話ならお断りしますが。

565 :nobodyさん:2010/02/02(火) 10:41:56 ID:???
>>564
LINUXの共有フォルダをドライブでLドラとかにマウントして
タスクスケジュール使って定期的にCドラからLドラにファイルをcpしたら?

あと、windowsにCygwinとかのVM使ってLINUXとして動かす方法もある。

566 :nobodyさん:2010/02/02(火) 10:46:28 ID:???
>>565
あと、改行コードがwinだと<CR><LF>
Linuxだと<LF>つーのは当然知ってるよね?

改行コードが違っててLINUX側では壊れたように認識されるってのも
よくある話なので、WIN側で保存する際は間違っても「メモ帳」とか使わない

567 :nobodyさん:2010/02/03(水) 01:38:18 ID:???
そもそもwinを(ry

568 :nobodyさん:2010/02/05(金) 23:38:04 ID:???
とても初歩的なことですみません。
調べてもなかなかケースが見つからないので質問をさせていただきました。
ページA内のボタンを押すと、ページBに飛ぶようにしたいです。
その際、ページBを表示するサブルーチンに、ページAの引数の値を
渡すにはどのようにすればいいのでしょうか?

569 :nobodyさん:2010/02/05(金) 23:39:53 ID:???
質問の意味が(ry

570 :nobodyさん:2010/02/06(土) 00:10:45 ID:???
言ってる事は無視してやりたい事の概要だけつかむと、
フォーム+CGIの話だとは思うが・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

571 :nobodyさん:2010/02/06(土) 00:15:59 ID:???
ページA内のボタンと同じフォームに一緒に渡したい内容を
hiddenで仕込んでおけば。

572 :nobodyさん:2010/02/06(土) 04:45:05 ID:???
ページAのボタンを押すとページBが爆発するようにしたいのですが
twitterで叫んでも爆発しませんでした?

573 :568:2010/02/06(土) 17:28:41 ID:???
>>569 >>570
cgiのお話です。書き忘れてしまいました。
・・ごめんなさい。
>>571
教えていただいてありがとうございました。
つまり
<input type="hidden" name="***" value="ページBに渡したい引数">
を併記すればいいということですよね?
今試せないのですが、月曜日に学校に行ったらさっそく
試してみようと思います。
ありがとうございました。

574 :nobodyさん:2010/02/06(土) 22:25:09 ID:???
パラメータ送るのはいいけど、ページBで受け取る方法は知ってるんだろうな・・・?

575 :568:2010/02/07(日) 20:06:34 ID:???
>>574
えっと・・・shiftでは駄目ですか?

576 :nobodyさん:2010/02/07(日) 21:02:36 ID:???
> ページBを表示するサブルーチン

飛んで来たものが @_ に入ってる状態まで持って行かないと shift では取れないよ。
それよりページAもページBも同一スクリプトの出力だったりするのかな。

577 :568:2010/02/07(日) 23:15:29 ID:???
>>576
はい。ページはすべて同一スクリプトです。
各ページはそれぞれサブルーチンに記載しています。
Sub PageA内の<input type="submit" name="to_pageb" value="ページBへ">
でボタンを作り、別記のif($CGI->param("to_pageb")){PageB($CGI);}
というif文でSub PageBに移動させています。
で、Sub PageB内で、my $cgi=shift; $a=shift;で
$aに値をとりだす・・・と考えているのですが、間違ってますか?
全然自信がなくて恥ずかしいのですが
変なことをしてしまっているかもしれません・・・。

578 :nobodyさん:2010/02/07(日) 23:19:11 ID:???
いや、だから二つ目の引数が降って湧いてるようにみえるのだけれども

579 :nobodyさん:2010/02/07(日) 23:31:29 ID:???
>>577
use strict;
use CGI;
main();
exit;
sub main(){
my $q = CGI->new();
if($q->param('to_pagea')){
pagea($q);
}
elsif($q->param('to_pageb')){
pageb($q);
}
}
sub pagea{
print "Content-Type: text/html;\n\n";
print <<'EOP';
<form action="this.cgi">
<input type="hidden" name="to_pageb" value="1">
<input type="hidden" name="***" value="argument">
<input type="submit">
</form>
EOP
}
sub pageb{
my $q = shift;
print "Content-Type: text/html;\n\n";
print $q->param('***');
}

こういうことがしたいんだろ?

580 :Name_Not_Found:2010/02/08(月) 15:43:35 ID:5HRzICqc
time関数は理論上、この先何年くらいまで対応してるんですか?
バージョンは5.8.8です。

581 :nobodyさん:2010/02/08(月) 15:47:57 ID:???
2038年

582 :nobodyさん:2010/02/08(月) 21:01:31 ID:???
ソース上はtime_tか何かで抽象化してあるだろうから、time_tが64bitな
環境でmakeすれば問題なかったりはしないんだろうか?

583 :nobodyさん:2010/02/08(月) 21:34:28 ID:???
Jiftyを勉強したいのですが、
1から10までかいてあるようなサイトありませんか?

584 :568:2010/02/08(月) 23:11:36 ID:???
>>571 >>574 >>576 >>579
今日試してみました。
hiddenを使って渡して、paramで受け取ることができました。
shiftは駄目でした。
教えていただいてどうもありがとうございました。
とても助かりました。
値の受け渡しについてだいぶわかってきました。
でもたぶんまだ完全に理解していないと思うので、
これから教わったことをじっくり考えたいと思います。

585 :nobodyさん:2010/02/10(水) 11:19:20 ID:Vw6vWoQu
他の言語のようにタブでソースを見やすくしようとするとエラーになってしまいます
}がどこを閉じているのかも分かりづらいのですが、
perlで書いている人はどんな風に見やすくしているのですか?

586 :nobodyさん:2010/02/10(水) 11:25:13 ID:???
すみません、一つずつ調べなおしたら正確には
OUT_HTMLを終わる時に先頭にタブがあるとエラーで出るだけで通常は大丈夫なようでした

この部分だけなら我慢しることにします

587 :nobodyさん:2010/02/10(水) 11:57:20 ID:???
ヒアドキュメントの話か
スニペットを置くには便利だけど、言うとおりソースが見づらくなるので
__DATA__なりを使うようになるんじゃないかね


588 :nobodyさん:2010/02/10(水) 12:21:59 ID:BOSF90jM
プログラム板のほうでも聞いたのですが、こちらに移動します。

perlのオブジェクトが、ハッシュに戻ってしまいメソッドが呼べなくなる
というバグに悩まされています。どうも見ているとwebにアクセスする
メソッドを読んだ後に他のメソッドを呼ぶと、ハッシュに戻っている気がします。

このようなバグに悩まされた方いらっしゃらないでしょうか?
全く解決法が分かりません。

589 :nobodyさん:2010/02/10(水) 13:26:09 ID:???
889 名前:876[sage] 投稿日:2010/02/10(水) 13:18:17
WEBプログラミング板に移動したのでこちらは締め切ります。
お前ら使えねえな。



590 :nobodyさん:2010/02/10(水) 13:41:06 ID:???
住人ほとんど一緒だから無駄じゃね?

まともに回答が欲しければ気がしますじゃなくてコードさらして
呼ぶ前と呼ぶ後でこうなってるって示せよ。

591 :nobodyさん:2010/02/10(水) 14:23:14 ID:???
再現する最小コードさらせや

592 :nobodyさん:2010/02/10(水) 18:06:19 ID:???
そもそもいったんblessしたリファレンスをblessしてない
状態に戻すなんてできるっけ?


別のハッシュになってるような気がするなぁ。

593 :nobodyさん:2010/02/10(水) 22:19:58 ID:???
同意。
たぶん別の値で上書きしてるんだろうな。
その変数に代入している所を全部調べてみたら?

594 :nobodyさん:2010/02/11(木) 00:37:03 ID:???
そのオブジェクトを生成してるのは自分の書いたやつ?モジュール?
モジュールでそんなエラーがでてるんなら、まずモジュール名書くべきだろ
自分の書いたやつなら、コードさらさないと答えようがない

595 :nobodyさん:2010/02/11(木) 00:56:59 ID:???
落ち着けお前ら
ここはエスパーしかお呼びじゃないスレだ

596 :588:2010/02/11(木) 00:57:44 ID:???
ソース全部さらすのは無理なので無駄かもしれませんが、

foreach(@tmp) {
$_->wget();
}
@New = sort by_LastUpdated @tmp;

という部分があってby_LastUpdatedでUse of uninitialized value in〜が多発して
その後で@Newのメソッドが呼べないといってプログラムが終了します。

オブジェクトを作るのは
sub new {
my ($url) = @_;
my $bbs;
chomp($url);
my $this = {
"OrgUrl" => $url,
};
bless $this, 'Sure';
# $thisのその他の値の設定

return $this;
}
って感じです。あとこんな事いうのも馬鹿馬鹿しいですが>>589
僕じゃありません。それとどうも新しく追加したところを消すと
バグが消えるようなのでそこを確認しようと思います。
どうもありがとうございました。

597 :nobodyさん:2010/02/11(木) 01:24:13 ID:???
ぐだぐだじゃん。

どこを切り取っても突っ込む所しか無い。
勘だけで書いたコードを晒されてもどうしようも無い。
無理して似非オブジェクト指向なコードを書くな。



598 :nobodyさん:2010/02/11(木) 08:02:25 ID:???
必要な部分を的確にさらす能力もないのか。
こりゃお手上げだな、エスパーさん後は
任せた。

599 :nobodyさん:2010/02/11(木) 09:48:23 ID:???

sub new {
my $pkg= shift;
my ($url) = @_;
my $bbs;
chomp($url);

my $this= bless {"OrgUrl"=>$url}, $pkg;
# $thisのその他の値の設定

return $this;
}

やりたいことはだいたいこんな感じなんだろうけど、一体どこを参考にして書いたの?

600 :nobodyさん:2010/02/11(木) 10:00:20 ID:???
たぶんwget()の中でオブジェクトに代入してしまってるんじゃないの?
例えばlocal化されてない$_に代入してしまっているとか

601 :nobodyさん:2010/02/11(木) 10:43:17 ID:???
ImagemagickのconvertコマンドでマルチページTIFFファイルをJPEGに変換しようとしているのですが
オプションを何も指定せずに実行すると、横幅がオリジナルよりも2倍近く引き延ばされた状態で出力されてしまいます
これは何が原因でしょうか?

602 :nobodyさん:2010/02/11(木) 12:03:47 ID:???
>>601
オプションを何も指定せずに実行したことが原因

603 :nobodyさん:2010/02/11(木) 17:12:52 ID:???
質問なのですが
サーバー上でperl からphpファイルを実行するのはどうすればいいでしょうか


$ans = `php -f post.php`;
print $ans;

print system("/usr/local/bin/php -f /virtual/user/public_html/post.php");

my $PHP = '/usr/local/bin/php';
my $PHP_FILE='/virtual/user/public_html/post.php';
open FH, "$PHP -f $PHP_FILE|";
while (my $x = <FH>) {
print "$x\n";
}
close FH;

この3つ試したんですがphpのソースが表示されてしまいます
サーバーはcoreserverです

604 :nobodyさん:2010/02/11(木) 17:55:06 ID:???
よくわからんが想定した設定(php.ini)が反映されていなくて
<? PHPコード ?>みたいな書き方が処理されてないだけでは?

605 :nobodyさん:2010/02/11(木) 18:37:07 ID:???
その場合、 php.ini で設定するには何を書けばよろしいんでしょうか;;

606 :nobodyさん:2010/02/11(木) 19:11:25 ID:???
ム板からの誘導か。

core特有のCLI版PHPの呼び出し方の問題だからここの管轄でもなくて
レン鯖板の管轄だと思う。暇だからこれやる。
ttp://www.google.co.jp/custom?domains=sb.xrea.com&q=php+cli&sitesearch=sb.xrea.com&hl=ja

607 :nobodyさん:2010/02/11(木) 19:53:29 ID:???
>>606
ありがとうこざいます

教えてもらったリンク先を参考に
/usr/local/bin/php5cli でできました!

皆様ありがとうこざいました。

608 :nobodyさん:2010/02/14(日) 07:12:06 ID:???
system ( "/usr/bin/hoge "fuga fuga"")

上記のように書いてみたのですが、エラーが出ます。
二重にクウォートというのは出来ないんでしょうか?
外部コマンドでクォートを必要とする場合はどう記述すべきでしょうか?

609 :nobodyさん:2010/02/14(日) 11:27:31 ID:???
何言ってんだお前
エスケープしろよ

610 :nobodyさん:2010/02/14(日) 11:33:14 ID:???
qwか''

611 :nobodyさん:2010/02/14(日) 11:43:44 ID:???
いちいちエスケープとかめんどくさいので俺は各引数を別々に渡す派。

system("/usr/bin/hoge", "fuga fuga");



612 :nobodyさん:2010/02/14(日) 12:26:01 ID:???
ありがとうございます
この板の人は本当に親切で助かります

ちょっとしたことも検索で見つけるのは難しいですね

613 :nobodyさん:2010/02/18(木) 01:04:18 ID:???
use utf8;
use HTML::TreeBuilder;

my $html = get("http://xxxxx");
my $tree = HTML::TreeBuilder->new;
$tree->parse($html);
$tree->eof();

my $a = "東京";
my $b = "$tree->findとか色々やって最終的に 東京 をセット";

print "A $a B $b<br />\n";
print utf8::is_utf8($a) ? 'UTF-8 Flag' : 'not UTF-8 Flag';
print utf8::is_utf8($b) ? 'UTF-8 Flag' : 'not UTF-8 Flag';

-----------------------------------------

上記をCGI処理するとweb上の表示は

A 東京 B 東京
UTF-8 FlagUTF-8 Flag

となります。
両方utf-8のようなのですが、ソースを見ると下記のように2個目の東京が文字化けしています。

A 東京 B ?x6771;?x4EAC;

if( $a =~ /$b/ )としたいのですが、うまくいきません。
文字化け部分を戻したいのですがどうすればよいでしょうか?
htmlコードの取得先はヘッダがshift-jisでした。
※use Encode qw/ decode /; など色々試しましたがよくわからずうまくいきませんでした。

614 :nobodyさん:2010/02/18(木) 03:16:49 ID:???
use utf8;
use HTML::Entities;
print "same.\n" if '東京' eq decode_entities('&#x6771;&#x4EAC;');

615 :613:2010/02/18(木) 09:15:46 ID:???
>>614
できました!!
これができずに半日ずっとぐぐったり試行錯誤して結局できてなかったので助かりました。
自分だけでは数日はEntitiesにたどり着けなかったかもしれません。
ありがとうございました。

616 :nobodyさん:2010/02/18(木) 18:04:59 ID:???
perl 5.6.1 で json を使いたいのですが、
どうすればいいでしょうか?。。。

617 :nobodyさん:2010/02/18(木) 18:10:31 ID:???
知らんがな
CPANに聞けや

618 :nobodyさん:2010/02/18(木) 18:53:38 ID:???
PPの奴が5.005だわな

619 :nobodyさん:2010/02/20(土) 15:02:55 ID:???
firefoxのURLバーに『?item=東京』と入れた時のコードは『?item=%93%8C%8B%9E』となりますが、下記コードを実行すると
一番目 %e6%9d%b1%e4%ba%ac
二番目 東京
となります。
@一番目は『東京』となってほしいのですが、なぜ『%e6%9d%b1%e4%ba%ac』なのでしょうか?
A『%93%8C%8B%9E』も『%e6%9d%b1%e4%ba%ac』もデコードサイトで変換したらどちらも東京になりました。URLエンコードには2種類あるのでしょうか?
B二番目は『東京』ではなく『%93%8C%8B%9E』を期待したのですが、なぜエンコードしたのに『東京』なのでしょうか?
以上、3点についてわからないので教えていただけないでしょうか。
最終的に行いたいことは、URLから拾った文字と別から拾った文字をマッチするかの確認です。
#-------------------------------------------
use CGI;
use Encode qw/from_to/;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;

my $query = new CGI;
my $item = $query->param('item');

my $encode = guess_encoding($item);
from_to($item, $encode->name, 'utf-8'); #$itemがSHIFTJISだったので変換

$item =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$item =~ tr/ /+/;
printf("<pre>一番目 %s</pre>\n",$item);

my $str = "東京";
$str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$str =~ tr/ /+/;
printf("<pre>二番目 %s</pre>\n",$str);


620 :nobodyさん:2010/02/20(土) 15:19:00 ID:???
まずURLデコードしてから文字コード判別(quess_encode辺り)しないと、、

二番目はURLデコードじゃなくURLエンコードしないとそりゃ期待どおりにならんやろ

621 :nobodyさん:2010/02/20(土) 15:46:06 ID:???
正規表現について質問です。
投稿されたメッセージから、半角英字を禁止したいと思い

if ($in{'message'} =~ /[a-zA-Z]/) {$flg = 1;}

としたのですが、これだと改行の<br>まで弾かれてしまいます。
そこで、bとrをのぞくように、次のようにしました。

if ($in{'message'} =~ /[(a|c-q|s-z)A-Z]/) {$flg = 1;}

これでも、bとrは除けるのですが、<br>だけを除く記述方法はありませんか?
よろしくお願いします。

622 :nobodyさん:2010/02/20(土) 15:58:07 ID:???
改行を<br>変換する前に判別すれば?

623 :nobodyさん:2010/02/20(土) 16:03:22 ID:???
>>621

/¥b(?:(?<!<)|(?!br>))[a-zA-Z]/

624 :nobodyさん:2010/02/20(土) 16:14:16 ID:???
¥bは数字と下線もワードのうちなので

/(?:^|[^a-zA-Z])(?:(?<!<)|(?!br>))[a-zA-Z]/

だった。

625 :nobodyさん:2010/02/20(土) 16:21:22 ID:???
>>622-623
ありがとうございます。
出来ました!

と思ったら、確認画面にはうまくいけたのですが、そこから、投稿処理に入ろうと
すると、<>が<とかになるみたいで、投稿できませんでした。。

brだけ除外するには、
/\b(br)[a-zA-Z]/
とすれば良いのでしょうか。何度も質問してすいません。。

626 :nobodyさん:2010/02/20(土) 16:48:32 ID:???
>>625
タグを禁止したいならbr意外も禁止しろ
お前みたいな奴がいると脆弱性付きの糞サイトが出来るんだよ
XSSでググれ
HTML::Entitiesとかで対策しろ

627 :nobodyさん:2010/02/20(土) 17:05:45 ID:???
>>626
XSS対策は施されているフリースクリプトです。サニタイズされてます。
それを更に、スパム除けとして、半角英字を禁止したいと思ったまでです。
ただ、ユーザーがテキストエリアで、改行すると、それが改行タグになり、
半角英字として扱われ投稿できなくなるみたいで困ってたわけです。
>>622-623のヒントでなんとかやってみます。ありがとうございました。

628 :nobodyさん:2010/02/20(土) 17:25:21 ID:???
>>627
エンティティ化の位置を変えればいいんじゃないかな?

629 :nobodyさん:2010/02/20(土) 18:35:41 ID:???
>>627
改行コードをその後で<br>に変換すればいいやん

630 :629:2010/02/20(土) 18:37:42 ID:???
ごめん。上は読まないで適当に書いてしまった。

SPAM対策なら、画像でパスコード生成して入力させればいいさ。

631 :nobodyさん:2010/02/21(日) 19:39:13 ID:???
悲しいね

632 :619:2010/02/22(月) 00:59:57 ID:???
>>620

ありがとうございます。
先にURLデコードしましたが結果は同じでした。
下記を実行するとこのような表示になります。↓
(A番などは文字化けしていますが、一つ一つを見ると
93,8C,8B,9EとUTF8コードがきているように見えます)

http://www.rupan.net/uploader/download/1266767521.jpg

C番とD番の間はちゃんと『東京』と表示されるのですが、
同じものを表示したのにD番だと文字化けします。
うまくコード変換が出来ていないようです。
下記スクリプトは無視してもかまいませんので、
URLの引数をperl内のUTF-8にする方法を教えてください。

#-------------------------------------------
#ヘッダ部分は619と同じなので省略

printf("<pre>A番 %s</pre>\n",$item);

$item =~ tr/+/ /;
$item =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
printf("<pre>B番 %s</pre>\n",$item);

$encode = guess_encoding($item);
printf("<pre>C番 %s</pre>\n",$encode->name);

from_to($item, $encode->name, 'utf-8');
printf("%s<br />\n",$item);
printf("D番 %s<br />\n",$item);
printf("<br />\n");

633 :nobodyさん:2010/02/22(月) 01:53:28 ID:???
>>619
use strict;
use utf8; # 619の(3)が起きるのはこれのせいなのに隠すな
use Encode;
use URI::Escape;

# print "Content-Type: text/plain; charset=UTF-8\n\n";

my $tokyo = '東京';
my @enc = qw(utf8 euc-jp shiftjis 7bit-jis);

printf "%s: %s\n", $_, uri_escape(encode($_, $tokyo)) for @enc; # これを何か勘違いしてる
print "\n";

$tokyo =~ s/(\W)/'%'.unpack('H2', $1)/eg;
print $tokyo, "\n";

utf8::encode($tokyo); # no utf8;
$tokyo =~ s/(\W)/'%'.unpack('H2', $1)/eg;
print $tokyo, "\n";

634 :nobodyさん:2010/02/22(月) 03:50:14 ID:???
後置forか。普段全く使わないから、ドキッとするぜ・・・。

635 :619:2010/02/22(月) 13:04:14 ID:???
>>633
ありがとうございます。
use utf8を入れていたのを記入漏れしていましたご指摘ありがとうございます。
書いていただいたコードを参考にすることで変換することができました。
また、参考コードは日本語を扱うときに色々確認できそうなので保存させていただきました。
ありがとうございます。

※最終的に下記のようになりました。

#----------------------------------
use utf8;
use Encode qw/from_to/;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
use URI::Escape;

#----------------------------------
#shiftjisをutf8に変換
my $encode = guess_encoding($item);
from_to($item, $encode->name, 'utf-8');
#----------------------------------
#URLデコード
$item =~ tr/+/ /;
$item =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;

utf8::decode($item);
printf("<pre>文字列 %s</pre>\n",$item);

636 :nobodyさん:2010/02/22(月) 16:00:00 ID:???
ActivePerlでTerm::ProgressBarを試してみたのですが、
ローカルファイル2万行の処理時間が、1秒→13秒になりました。
(もし200万行の処理になると、単純計算100→1300秒・・・)
ネットワーク越しの処理とか、他にボトルネックがない場面で使うなって事なんでしょうけど、
ローカルファイル処理の進捗表示をしたい場合、皆様どうしてますか?


637 :nobodyさん:2010/02/22(月) 16:08:56 ID:???
何処に表示する話だ?

638 :nobodyさん:2010/02/22(月) 16:17:37 ID:???
端末に表示するプログレスバーの精度なんて端末の幅の文字数で
100かそこらだから、余計な更新をしなければそれ以上遅くなること
はないと思うが。

639 :636:2010/02/22(月) 18:18:51 ID:???
>>637
端末上の表示です。

>>638
スクリプトの中身は、キーワードをハッシュキーにしてインクリメント、
最後にキーワードの総出現数を出力してるだけの簡単なものです。

while (<$fh>) {
  処理
$hash{$_}++;
  $term->update( $term->lastupdate + length $_ );
}
こんなカンジです。


640 :nobodyさん:2010/02/22(月) 22:11:22 ID:???
>>636
毎回update呼ぶと効率悪いよ。マニュアルよく嫁。
特にA (much) more efficient updateのあたり。

641 :636:2010/02/23(火) 11:05:30 ID:???
>>640
1,000行に一回呼ぶようにしたら、87万行に増やしても1秒弱の差で収まりました。
ありがとうございました!

642 :nobodyさん:2010/02/24(水) 17:33:29 ID:???
二つのテキストファイルを比較する処理を書いています
・a.txtの中身
1
2
3

・b.txtの中身
1
3
4

上記のような状況で、「4(b.txtにあってa.txtにない行)」を取得したいのですが、
こういった処理でオーソドックスな方法はあるのでしょうか?
今のところwhileかforeachで各ファイルを一行ずつ読み取る事を考えているのですが…
ちなみに各ファイルはせいぜい十数キロバイト程度で、一日にせいぜい数回程度しか実行せず、
実行するマシンの性能も十分に高いのでメモリ消費などは無視出来るレベルです

643 :642:2010/02/24(水) 18:04:59 ID:???
>>642に条件を追加します
a.txt、b.txtそれぞれ生成時にソート済みで、
どちらもとあるディレクトリのファイルリストなのでファイル内で重複する行は存在しません

644 :nobodyさん:2010/02/24(水) 18:33:43 ID:???
>>643
ソート条件があるならperlを持ち出すまでもなく

comm -13 a.txt b.txt

でいいと思うが、どうしても車輪を再発明したければ
1行ずつ読みながら比較でもいいし、a.txtをまとめて
ハッシュに読み込んでb.txtを読み出しながらハッシュに
なければ書き出しでもいい。

645 :nobodyさん:2010/02/24(水) 18:56:55 ID:???
>>644
回答ありがとうございます

残念ながら、さしあたり実行環境はWindowsXPを予定しているので、
commコマンドは使えません
また、ゆくゆくは他のバージョンのWindowsやLinuxなどでも動作させる予定なので
可能な限りOSに依存しない方法を採用する必要があるのです

646 :nobodyさん:2010/02/24(水) 19:02:38 ID:???
# win って ' ' じゃなくて " " じゃないと動かないんだっけ? ま、いいや。
perl -lne 'BEGIN{ $i = 1 } $h{$_} += $i ; $i = 2 if eof}{ $h{$_} == 2 and print $_ for keys %h ;' a.txt b.txt
# $h{$_} == 1 a.txt のみ
# $h{$_} == 3 a.txt & b.txt

このワンライナー解読して適当にスクリプト化すれば?


647 :nobodyさん:2010/02/26(金) 20:23:12 ID:???
呼び出し元が普通のページか frame|iframe かどうかって判別できますか?
同じスクリプトの挙動をその条件で変えたいんです
ただ、HTML側に細工をするのはちょっと難しいです
環境変数かなんかで分かればいいのですが・・・

648 :nobodyさん:2010/02/26(金) 20:50:17 ID:???
それはPerlの仕事ではない

649 :nobodyさん:2010/02/26(金) 20:59:18 ID:???
いや普通にPerlでリファラとればいいだろ

650 :nobodyさん:2010/02/26(金) 21:06:13 ID:qFPnonZh
呼出し元のファイルを開いて、
そのファイルの中でどうゆう呼ばれ方をされてるのかを
調べればいいかなと

651 :nobodyさん:2010/02/27(土) 02:04:01 ID:???
設置URLも参照URLも決まっているなら649でいいが
そうでないならJavaScriptでparentとか見て判定した方がいいな

652 :647:2010/02/27(土) 02:37:15 ID:???
>>650
案を考えていただき、ありがとうございます
ただ、後付け条件で申し訳ないですが、呼び出し元は同一ドメインのスクリプト全てが想定され、
また、そのスクリプト群はユーザーがデータベースに保存したテンプレートを加工して出力します
なので、実質どんなHTMLが返ってくるかは分からないです

>>649,651
クエリは変わりますが、アクセス元のURL自体は有限なので
リファラと正規表現でなんとかなるような気がしてきました
ありがとうございます

653 :nobodyさん:2010/03/03(水) 02:18:21 ID:???
MIME::Liteで添付ファイル(JPEG)付きメールを送るスクリプトをPerlで書いています
主要部分はこんな感じです

================
$msg = new MIME::Lite(
From => (送信元),
To => (送信先),
Subject => 'HOGEHOGE',
Data => ''
Type => 'image/jpeg',);

$msg->attach('Type' => 'applocation/octet-stream',
'Encoding' => 'base64',
'Path' => 添付ファイルのフルパス);
================

これ実行すると、確かに指定したファイルが添付された状態で宛先に届くのですが
何故か0バイトのファイルも余計に一つついてきます
また、上記は空欄になっているDataオプションに任意の文字を入れると
0バイトのファイルが、その文字が書き込まれたテキストファイルに置き換わっています

この余分なファイルが無い状態でファイルを送りたいのですが、原因は何でしょうか?

654 :nobodyさん:2010/03/03(水) 09:51:24 ID:???
>>653
マニュアルの最初に例があるからそれ見れよ。

655 :nobodyさん:2010/03/03(水) 10:32:39 ID:aprtMKKM
★自分のサイトのperlスクリプト場所
 www.samohan.jp/cgi-bin/form.cgi
★買い物カゴシステムのPOST送信先(買物カゴ中身画面のアドレスと同じ)
 https://www.jacky.jp/cgi/kago.cgi?user=samohan
とします。
htmlやphpのFORMで買い物カゴシステムへPOSTせずにform.cgiでPOSTデータをkago.cgiへ送信し、送信したらkago.cgiが表示する買物カゴ中身画面へと移動させたいです。
買物カゴシステムを乗り換えるときカンタン移行できるよう、ワンクッションかませたいとおもっているのです。
今はform.cgiでフォームを表示して「送信」ボタンを押してもらい、kago.cgiへPOSTしているのですが、押さずに済ませたいのです。
★form.cgi内のpost送信ソース
 my $url = 'https://www.jacky.jp/cgi/kago.cgi?user=samohan';
 use LWP::UserAgent;
 use HTTP::Request::Common qw(POST);
 my %formdata = ('user' => 'samohan', 'item' => $item, 'price' => $price, 'kazu' => $kazu);
 my $request = POST($url, [%formdata]);
 my $ua = LWP::UserAgent->new;
 my $res = $ua->request( $request);
 print $res->content;
としてみました。
しかし
★結果(www.samohan.jp/cgi-bin/form.cgiの結果表示画面)
 Found
 The document has moved here.
となります。
'here'はリンクとなっており、リンク内容は'http://www.samohan.jp/cgi-bin/kago.cgi?user=samohan'となっています、どうしていいのかわかりません、アドバイスよろしくお願いいたします・・・。


656 :nobodyさん:2010/03/03(水) 11:43:47 ID:???
最近perl書き始めた初心者です

書き始めてわかったんですが、書けば書くほどコードがどんどん汚くなっていくような気がします
これはやはり初心者だからでしょうか?
上達してくるときれいなコードが書けるもんでしょうか

657 :nobodyさん:2010/03/03(水) 13:20:30 ID:???
上達した人がきれいなコードというものでもない
自分で見やすくするための決まりごとを作れば書けるようになる
自分が見やすいかどうかで判断すればいい
自分の見やすいコードは上達の手助けになる
他人のコードをいろいろ見比べてみれば自分の見やすいコードを決める材料になる
これはPerlに限ったことではない

658 :nobodyさん:2010/03/03(水) 13:47:53 ID:???
やっぱ要は経験ってことですか
一朝一夕にはいかないもんですね

659 :nobodyさん:2010/03/03(水) 14:14:48 ID:???
そういうのが気になり出したら「Perlベストプラクティス」お勧め。

660 :nobodyさん:2010/03/03(水) 15:14:27 ID:???
お二方?ともありがとうございました。

お勧めの本を買って…って高っ!
図書館巡って探して、なかったら中古買って勉強してみます

661 :nobodyさん:2010/03/03(水) 17:43:02 ID:???
PBPみたいな本は「これどっかに載ってたよな」ってときに
引っ張り出す使いかたをしがちなので
図書館で借りるより古本でいいから常備するほうがいいと思うよ。

4,515円が高いかどうかは人それぞれだけど。

662 :nobodyさん:2010/03/09(火) 09:40:49 ID:JhJ16iiu
LibXML使用時の質問なのですが、getAttributeでxmlns属性をとれなくて困っています。
自宅Windows(LibXML1.64)ではうまくいきますが、レンタルサーバの1.58では何も返されません。

[xml]
<root xmlns="foo:bar" hoge="fuga">
<name>yesman</name>
</root>

[perl](一部)
my $root = $doc->documentRoot();#=>XML::LibXML::Element
my $root_nodename = $root->nodeName();#=>'root'(正常に取得)
my $namespace = $root->getAttribute('xmlns');#=>'foo:bar'がとれない
my $attr_hoge = $root->getAttribute('hoge');#=>'fuga'(これは正常に取得)

LibXML.pmを見ると、名前空間に関してはそれ用のuseしたメソッドを呼んでいて、
サーバにインストールされているもともとのライブラリ(expat?)の問題なのかなと疑ってるのですが、
なにか情報ありませんか?

関連ですが
my @names = $doc->getElementsByTagName('name');
このコードも1.64では成功しますが1.58では空です。
自分で$namespaceに値を代入して(ハードコードして)
my $namespace = 'foo:bar';
my @names = $doc->getElementsByTagNameNS($namespace, 'name');
とすると取得できます。

663 :nobodyさん:2010/03/09(火) 09:51:59 ID:???
>>662
CHANGESぐらい読めよ。

1.61のところに

- get/setAttribute(NS)? implementation made xmlns aware

とあるので、それ以前は対応してないと思われる。

664 :662:2010/03/09(火) 10:33:34 ID:???
>>663
そうでしたか〜・・・
ノードをたどっていく分には名前空間の問題はないようなので、
当面その方法で対応してみようと思います。
ありがとうございました!

665 :nobodyさん:2010/03/09(火) 13:41:19 ID:IYkocy7W
WindowsのActivePerlのNet::FTPSSLについてなのですが、
サーバ上のファイル名を決め打ちすれば問題ありませんが、
my @files = $ftps->nlst("./dir");
foreach my $file (@files) {
  next if $file =~ /^\.{1,2}$/;
  $ftps->get("$file", "$hozondir/$file") or die "get failed ", $ftps->last_message;
}
のようにすると、
(Debug => 1)
>>> RETR readme.txt (←$file)
: No such file or directory
Can't get file: Bad file descriptor at C:\Documents.......
とエラーを返され、ローカルに空ファイル(readme.txt)が作成されて終了します。
決め打ちすれば問題ないので、配列のデータの扱い方?だと思うのですが、
どうしたら良いのでしょうか?
何かご助言お願いします。


666 :nobodyさん:2010/03/09(火) 16:30:28 ID:???
>>665
$ftps=>getの行の上に
print $file, "debug print¥n";
してみりゃ、原因わかるんじゃね?

667 :665:2010/03/09(火) 16:47:08 ID:IYkocy7W
>>666
ヒントありがとうございます。
Windowsといえば改行コードだと閃いて、以下一行追加したら正常に動きました。

@files = map { s/\r//g; $_ } @files;


668 :nobodyさん:2010/03/09(火) 16:51:36 ID:???
chompじゃ駄目なのか

669 :665:2010/03/09(火) 23:23:47 ID:???
chompは確か最初か2番目くらいに試したけどダメでした。
試した事を書くのすっかり忘れてました・・・すみません。
ちなみに
 ○ @files = map { s/\r//g; $_ } @files;
 × @files = map { s/\n//g; $_ } @files;
 × @files = map { s/\r\n//g; $_ } @files;
でした。なんだかよく分かりません・・・

670 :nobodyさん:2010/03/10(水) 02:09:38 ID:???
多分\r\nから\rが消えて、実質\r\n→\nの置換になってるから上手く行ったんじゃないか?

671 :nobodyさん:2010/03/10(水) 02:13:37 ID:???
chompして\nつけるのが正しいやり方では

672 :665:2010/03/10(水) 12:22:41 ID:???
色々試してみました。

○ $file =~ s/\r//g;
○ $file =~ s/\r$//g;
× $file =~ s/\r\n//g;
× $file =~ s/\n//g;
× chomp $file;
   $file .= "\n";

× @files = map { s/\r\n/\n/g; $_ } @files;
× @files = map { s/\r\n/\n/g; $_ } @files;
   chomp $file;

○ @files = map { s/\r/\n/g; $_ } @files;
   chomp $file;

どうやら配列には、\rだけが入ってるようです。(\r\nでも\nでもなく)
で、chompは\rを処理しないということでしょうか。
ちなみにNet::FTPでmy @files = $ftp->ls()した場合は、こういう改行コードの問題は起きません。
推測ですが、$ftp->ls()は改行処理してるけど$ftps->nlst()はしてなくて、
ActivePerlの改行自動変換で\n→\rになって配列に入れられるのかなと思いました。


673 :nobodyさん:2010/03/12(金) 23:39:43 ID:???
ifの順番はこの順番で下記のようなことをしたいのですが、@hogeの第二要素もtypeAになります。
[]の中を()で一まとめになるかと思ったのですが、やはり[]内は一文字に対してしかきかないのでしょうか?
解決できる正規表現はどのように書けばよいでしょうか?

@hoge = ("a---b---c","w---x---y---z");

foreach(@hoge){
if( /^[^(---)]+---[^(---)]+$/ ){
printf "typeA %s %s\n",$1,$2;
}elsif( /^[^(---)]+---[^(---)]+---[^(---)]+$/ ){
printf "typeB %s %s %s\n",$1,$2,$3;
}

}



674 :673:2010/03/12(金) 23:48:42 ID:???
if内の正規表現が1個づつ足りなかったorz

foreach(@hoge){
if( /^[^(---)]+---[^(---)]+---[^(---)]+$/ ){
printf "typeA %s %s\n",$1,$2;
}elsif( /^[^(---)]+---[^(---)]+---[^(---)]+---[^(---)]+$/ ){
printf "typeB %s %s %s\n",$1,$2,$3;
}
}

675 :nobodyさん:2010/03/13(土) 00:26:20 ID:???
@hoge値がその2パターンぐらいならこれでいいじゃん

my @hoge = ("a---b---c","w---x---y---z");

for (@hoge) {
my @match= split(/---/);
if (@match == 3) { printf("typeA %s %s %s\n", @match); }
elsif (@match == 4) { printf("typeA %s %s %s %s\n", @match); }
}

676 :nobodyさん:2010/03/13(土) 01:17:06 ID:???
>>673
[] は「マッチする文字を指定できる . 」であって、
文字列のグループ化ではない
http://perldoc.jp/docs/perl/5.10.0/perlretut.pod
http://perldoc.jp/docs/perl/5.10.0/perlreref.pod

そしてそういう処理は、フツーはこうする

my @hoge = ('a---b---c', 'w---x---y---z', '', '1', '2---3');
my @type = ('!', 'A', 'B', '?');

for my $hoge (@hoge) {
  my @item = split /---/, $hoge;
  pop @item;
  print "type$type[$#item] @item\n"; # $" = ' ' の場合
}

for my $hoge (@hoge) {
  my @item = split /---/, $hoge;
  if (@item == 3) { printf "typeA %s %s\n", @item[0,1] }
  elsif (@item == 4) { printf "typeB %s %s %s\n", @item[0..2] }
}

677 :nobodyさん:2010/03/13(土) 03:25:52 ID:???
上の御二方と同意見だが、正規表現のお勉強として。
>>674
× /^[^(---)]+---[^(---)]+---[^(---)]+$/
◯/^([^-])---([^-])---([^-])$/
キャプチャしたい文字が各々単独一文字で無いなら、([^-]) を
([^-]+) とかに変えりゃいい。
typeB の正規表現も同じ事なので略。

ちなみに[^(---)] は、
・"(--" => "(" から "-" までの文字列(アスキーコード10進で、40 から 45 まで)
・次の "-" => "-" 。# => だけど上で既に含まれてる
・ ")" => ")" 。# => だけど既に含まれてる
上記の条件に合わないものにヒット
って意味。


perl -e ' ( chr $_ ) !~ /[^(---)]/ and printf "%s\t%s\n", $_, chr $_ for 0 .. 255 ;'
perl -e ' ( chr $_ ) !~ /[^a-c-e]/ and printf "%s\t%s\n", $_, chr $_ for 0 .. 255 ;'

とかやってみりゃ納得出来るかな。




678 :nobodyさん:2010/03/13(土) 16:12:28 ID:moD4aVFU
LWPを使ってwebページを取得するのですが、あるディレクトリ以下のファイルをとるとき、
どのライブラリを使用すべきでしょうか。
現状、LWP::UserAgentのファイル指定で単独ページの取得は成功してるのですが、
ディレクトリ指定ではインデックスページがとれるだけです。

679 :nobodyさん:2010/03/13(土) 16:22:26 ID:???
なんかずいぶん楽しそうなのは気のせいだろうか

680 :nobodyさん:2010/03/14(日) 00:07:51 ID:???
>>678
君はブラウザで取得する時にどうyってディレクトリ以下のファイルを取ってるってるんだよ

681 :678:2010/03/14(日) 14:52:56 ID:???
どうもやはりファイル一覧の取得の仕方がわかりません。
>>680のいうブラウザの場合は、ディレクトリへのアクセス時に一覧を作成してくれるから
こういうファイルがあるなということがわかって選択(取得)できると思うんですが・・・

682 :nobodyさん:2010/03/14(日) 19:11:57 ID:???
>>681
こういうファイルがあるなということがわかれば
こういうファイルを配列に入れて
ループで回してLWP::UserAgentのファイル指定でこういうファイルの単独ページを取得する

683 :678:2010/03/14(日) 21:06:20 ID:???
>>682
ループでというのはLWP::UserAgentのコードで多く見ました。
ですがいずれも、取得すべきURLが分っている前提のコードでした。

あるディレクトリ下に"こういうファイルがある"というのは
どのように知るのでしょうか。

684 :nobodyさん:2010/03/14(日) 21:17:37 ID:???
少し頭使った方が

685 :nobodyさん:2010/03/14(日) 22:04:33 ID:???
リンクをたどる方法が分からないのか
それとも(人間様から見ても)不明なファイルの在り処を探りたいのか
どっちの問題なのかが分からんのう
前者ならHTML解析してURLを得ればいいって話だし

686 :678:2010/03/14(日) 22:27:12 ID:???
>>685
なんとなく、うまく説明できていないでしょうか・・・
おそらく後者に近いのかもしれませんが、
ファイル名や構成がわからないディレクトリにアクセスして
中を検索の上、必要なファイル(あるいは全部)をとりたいだけなのですが・・・

687 :nobodyさん:2010/03/14(日) 22:28:11 ID:???
そんなことできたら、セキュリティーやばいなw

688 :nobodyさん:2010/03/14(日) 22:33:40 ID:???
ま、いずれにしろここで聞く話じゃないね

689 :nobodyさん:2010/03/15(月) 00:27:31 ID:???
>>681
スレ違いだけど、このままだと何回も質問しそうな気がするので説明をすると、

>>>680のいうブラウザの場合は、ディレクトリへのアクセス時に一覧を作成してくれるから
>こういうファイルがあるなということがわかって選択(取得)できると思うんですが・・・
これは、
1.ブラウザが/とかにindex ofページを置いているサイトからHTMLを取得する
 (webサーバの設定でそういう表示設定をしているサイトがある)
2.そうすると帰って来たHTMLに<a>のリンクが並んでる
3.それをブラウザが表示する(ブラウザはそれぞれのファイルを取得してるわけじゃない。リンクを表示してるだけ)
(4.リンクをクリックすればファイルが取得できる)
ってことをやってる。

LWPができるのは1番で、「(2番の)HTMLが返って来たんならそのリンクをループで回して取ればいい」
って言ってるのが>>682

で、ブラウザの動きも2番のHTMLがあるからファイル一覧を表示できるのであって、
そういうサイトじゃなかったら(index ofを設定してないサイトだったら)表示できないよって話。
リンクもないのにサーバ上のファイルの場所がわかっちゃったらそのサイトは攻撃されるでしょ?

690 :678:2010/03/15(月) 10:36:57 ID:???
>>689
おかげさまでどう取得すべきなのかわかりました。
初歩的な問いのつもりでいたのですが、こちらの知識不足により
突飛な発想になってしまっていたのですね。

その後、リンクを辿っていく(本来の)方法で解決できました。
ありがとうございました。

691 :nobodyさん:2010/03/15(月) 12:42:45 ID:???
いいってことよ

692 :nobodyさん:2010/03/15(月) 23:14:53 ID:???
http://fumidai.net/http://www.php.co.jp/
でどうなる

693 :nobodyさん:2010/03/17(水) 16:12:18 ID:???
DBIでINSERTが出来ません。
登録フォームからCGIでパラメータを取ってやってたのですが、上手く行かないので
最終的にMySQLターミナル上で有効なINSERT文を、そのままリテラルにprepareし、
ターミナルから"perl insert.pl"を実行したのですが、どうしてもレコードが追加されません。

# insert.pl
use strict;
use warnings;
use DBI;

my $data_source = "DBI:mysql:mydatabase:localhost:3306";
my $user = "user";
my $pass = "pass";
my $dbh = DBI->connect($data_source, $user, $pass,
    { RaiseError => 1, AutoCommit => 0 });
my $sth = $dbh->prepare("insert into table1 (名前) values ('ほげ')");
$sth->execute;
$sth->finish;
$dbh->disconnect;

[環境]
Fedora12(2.6.31.12-174.2.3.fc12.i686)
MySQL-5.1.42-2
Perl-5.10.1
DBI-1.609
getenforce -> Permissive

何かヒントをお願いします・・・

694 :nobodyさん:2010/03/17(水) 16:42:17 ID:???
AutoCommit を1にするか自力でコミットするか

じゃない?

695 :693:2010/03/17(水) 17:09:03 ID:???
>>694
ありがとう!!!!!

696 :nobodyさん:2010/03/18(木) 00:26:44 ID:???
下記のような感じでハッシュのアレイを作成しています。

my @testArray;
my $testHash= { value=>0, name=>'テスト0' };
push (@testArray, $testHash);
my $testHash= { value=>1, name=>'テスト1' };
push (@testArray, $testHash);

これをdeepcopyしたいのですが、
my @testArray2 = @testArray;
だとshallowcopyになってしまうようです。

有識者の方、deepcopyの方法をご教授願います。

697 :nobodyさん:2010/03/18(木) 00:36:33 ID:w0JRv+Cl
use Clone;

698 :696:2010/03/18(木) 00:46:07 ID:???
>>697

ありがとうございます!試してみます。

後学のため、cpanモジュールに依存しないようなコーディングもご教授頂けたら幸いです。

699 :nobodyさん:2010/03/18(木) 09:24:09 ID:???
my @testArray2 = @$testArray;

はどうだろうか

700 :nobodyさん:2010/03/18(木) 09:24:24 ID:???
>>698
Cloneはxsだからperlでどう書くかの参考にはしにくいけど、
Clone::PPはpure perlなので読んでみるといい。

701 :nobodyさん:2010/03/18(木) 16:13:26 ID:???
GET /a.xml HTTP/1.1
Host: 192.16
Connection: close
User-Agent:
x-ModelName: pp-pppp
x-SDKVersion: 1.1.1

リクエストヘッダが上のようにあり、この中で特殊な、x-ModelName
の pp-pppp を取得したいと考えています。(クライアントからリクエストを受けた、
サーバー側で)

しかし、
ttp://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0#HTTP.E7.92.B0.E5.A2.83.E5.A4.89.E6.95.B0

をみますと、これに該当する環境変数がありません。
この場合、どうやって、pp-pppp を取得できますでしょうか?

702 :nobodyさん:2010/03/18(木) 16:47:58 ID:???
>>701
環境変数の例なんかじゃなくてCGIの仕様を読むべきだな。

でもperlでCGI使うんならCGIモジュール使った方がいいんじゃ
ないか。headerメソッドってのが用意されてる。

703 :nobodyさん:2010/03/18(木) 18:53:46 ID:???
>>696
ハッシュの要素にはスカラーしか存在しないと考えていいなら
@testArray2 = map{ { %$_ } } @testArray;
とか?

704 :nobodyさん:2010/03/19(金) 02:13:52 ID:???
>>701
x-SDKVersionはとれてx-ModelNameだけがとれないのか、
環境変数の取得の仕方自体が分からないのか、どっち?

リクエストヘッダの内容は%ENVに入るんだから、普通に$ENV{x-ModelName}で取れるはずだけどね。

705 :nobodyさん:2010/03/19(金) 15:01:50 ID:???
$ENV{HTTP_X_MODELNAME} janaino?

706 :nobodyさん:2010/03/19(金) 16:49:50 ID:???
MySQL+DBIで、カラム名とデータを両方取りたいのですが、
fetchrow_hashrefだと、カラム名の順番がバラバラになってしまいます。
カラム順をテーブル通りにする良い方法はないでしょうか?


707 :nobodyさん:2010/03/19(金) 16:59:18 ID:+1gTM2xb
keys で全部吐き出してみれば答えが分かるかと

708 :nobodyさん:2010/03/19(金) 19:18:24 ID:???
>>706
つ ttp://www.ksknet.net/dbi/dbi_1.html

709 :706:2010/03/19(金) 21:47:59 ID:???
>>708
ありがとうございます。
休み明けに試してみます。

710 :nobodyさん:2010/03/19(金) 22:07:21 ID:???
JAVA でいう、
response.setHeader("Refresh", "15");
 
レスポンスヘッダを作成する方法は
Perl
ではどうやればいいでしょうか?

711 :nobodyさん:2010/03/19(金) 22:23:13 ID:???
>>710
print "Content-Type: text/html"
とかやるだろ?
それと一緒。

712 :nobodyさん:2010/03/20(土) 02:35:36 ID:???
エディタはみなさん何を使っていますか?
emacs?
eclipse?


713 :nobodyさん:2010/03/20(土) 03:28:56 ID:???
eclipseはエディタなのか

714 :nobodyさん:2010/03/20(土) 11:51:52 ID:???
エディタは基本的に脳内
最終的にファイル化するためにメモ帳使うぐらいかな

715 :nobodyさん:2010/03/20(土) 12:20:32 ID:???
メモ帳だとエラーがでたとき場所が特定できないので、結局エディタ使ってるわ

716 :nobodyさん:2010/03/20(土) 13:53:37 ID:???
>>712-715
Perl書くのにどんなエディタ使ってる?
http://pc11.2ch.net/test/read.cgi/php/1014357485/

717 :nobodyさん:2010/03/20(土) 15:56:20 ID:???
メモ帳で書いてるとかぶっちゃけ書いたことない奴だろ
文字コードと改行コードは最低選べるエディタじゃないと

718 :nobodyさん:2010/03/20(土) 15:59:35 ID:???
ネタにマジレス

719 :nobodyさん:2010/03/20(土) 16:25:03 ID:???
>>717
はあ?
FFFTPでアップすればなんか勝手にそういうのよくしてくれるだろ?
Linuxのサーバー使ったことない初心者ですか?w

720 :nobodyさん:2010/03/20(土) 18:03:56 ID:???
詳しい説明サンクス
これならメモ帳でも充分だな。

721 :nobodyさん:2010/03/20(土) 18:33:08 ID:???
なんか勝手にそういうの

722 :nobodyさん:2010/03/20(土) 20:13:06 ID:VJC6JTjm
自鯖でテストしたこと無いやつら多すぎ

723 :nobodyさん:2010/03/20(土) 22:19:00 ID:???
「なんか勝手にそういうの」とLinux鯖使用に何の関係が。
Linux鯖使ったことない初心者じゃなければ
SSH+vimか、Samba or rsync, and so on+エディタでしょ。

724 :nobodyさん:2010/03/20(土) 22:28:51 ID:VJC6JTjm
Windows で編集を省くなよw

725 :nobodyさん:2010/03/20(土) 22:30:19 ID:???
わざわざ言わないでも解る

726 :nobodyさん:2010/03/21(日) 10:16:56 ID:???
LWPのgetstoreで質問です。
特定のサーバーの画像ファイルを定期的にコピーして取ってきているのですが一度 画像が壊れていることがありました。
画像の下半分がグレーになっていました。

is_successでチェックをしていたのですが、画像ファイルが完全に取得できたかは判断出来ないでしょうか?
codeを見て200だったらと改造しようかと思っていますが、この方法でエラーチェック出来るのか不安で

ほとんどの場合コピーに成功しているので再現が出来ていないです。


727 :nobodyさん:2010/03/21(日) 11:05:05 ID:???
getstore って勝手に binmode してくれたっけ?
ステータス見てもその続きで届く画像が壊れてるかどうかはわからないよ。

728 :726:2010/03/21(日) 11:45:10 ID:???
ありがとうございます。
LWP mirror というのがあるようですがこちらはcontents-lengthなども比較してくれるようなので
ファイルが壊れてファイルサイズが違う場合のエラーはとれると考えてよいのでしょうか

729 :726:2010/03/21(日) 12:05:21 ID:???
mirrorは、ローカルにあるファイル(キャッシュ)とサーバー上のファイルの更新日時やサイズを見てダウンロードするかを決めているだけで
ダウンロードの処理自体は getstoreと同じという考えてあっていますか?

730 :nobodyさん:2010/03/21(日) 18:55:46 ID:???
use Net::SMTP;を使用してメール送信を行っています。

特定のメールアドレス宛にのみ、メールが送信できない状況ですが、
my $ret = $smtp->dataend();
で1が返ってきます。

これは正常に送信できているということで良いのでしょうか?
受信側の問題でしょうか?

731 :nobodyさん:2010/03/21(日) 20:24:00 ID:???
メールのログを見た方がいいと思う。
たぶん550 mailboxが無いとかそんなエラーが書かれてるんじゃないかな


732 :nobodyさん:2010/03/22(月) 14:13:32 ID:???
$string =~ s/(hoge)// で置換したとき、置換に成功した個所のhogeを戻り値で得たいのですが、$1を使う以外に方法はありますか?

733 :nobodyさん:2010/03/22(月) 15:53:22 ID:???
$&でもいいし

$string=~ s/((hoge))//;
にすればあら不思議、$2も使える

734 :nobodyさん:2010/03/22(月) 17:06:11 ID:2ZzVyfyy
$cnt = $string =~ s/(hoge)//isg;

でどう?

735 :nobodyさん:2010/03/23(火) 17:33:46 ID:E0uSL26K
perlのモジュール「RTF::Writer」についての質問です。

RTF::Writerを使い、日本語を出力しています。
このモジュールに%sで出力すると、何故か「く」という文字が「,」に置き換えられてしまいます。
この不具合の解消法をご存じの方いましたら教えていただけませんか?

736 :nobodyさん:2010/03/23(火) 21:42:53 ID:22je5/ss
質問です。
あるファイルの一行が以下のようになっています。

[SA_Pre]perl[SA_BORY]hoge[SA_2323BO]

これをパターンマッチで「perlhoge」を抽出するようにしたい。[]で囲んだキーワードを取り除く
s/\[SA.*?\]//eで[]で囲んだキーワードを削除できません。
サクラエディタの置換機能なら、検索キーワードを「\[SA.*?\]」とすることでうまくいくようですが…

737 :167:2010/03/23(火) 21:48:12 ID:???
s/\[\w+\]//g

738 :nobodyさん:2010/03/23(火) 21:56:31 ID:22je5/ss
>>737
ありがとう。感動しました

739 :nobodyさん:2010/03/23(火) 22:55:28 ID:???
>>733
ありがとうございます。
>>734
すいませんカウントじゃないんです。

740 :nobodyさん:2010/03/23(火) 23:24:25 ID:LM1mmRsS
my @data = $string =~ s/(hoge)//isg;

じゃぁこれで

741 :nobodyさん:2010/03/23(火) 23:32:04 ID:???
s///gの返り値はコンテキスト関係なく置換回数じゃなかったっけか

my @data;
$string =~ s/(hoge)/push @data, $1; ""/ge;
とか

742 :nobodyさん:2010/03/24(水) 12:52:57 ID:???
>>735
できるだけ詳しくソース、環境書いてみて

743 :nobodyさん:2010/03/24(水) 17:37:14 ID:gXJd/117
>>742
おぉ、やっと返信が!

環境はwindows vista、active perl version 5.10.1をソースコードに使ってます。

以下ソースコード(TestRTFWriter.pl)
--
&useRTFWriter();

sub useRTFWriter(){

use RTF::Writer;
my $rtf = RTF::Writer->new_to_file("RTFsample.rtf");
$rtf->prolog('fonts' => ["MS Pゴシック"]);

$testStr = "くが表示できません。";

$rtf->printf(\'{\fs40 %s}',$testStr);
$rtf->print("\n\n");
$rtf->close;
}
--

そんでRTFSample.rtfの内容

?¬が侮ヲできません。

--

他の文字も化けてるね。。



744 :nobodyさん:2010/03/24(水) 17:55:26 ID:JL5BpxOE
Perlマニュアル
http://douseidoumei.com/perlman2/

745 :nobodyさん:2010/03/24(水) 19:02:04 ID:???
>>743
use utf8;
を先頭につけて文字コードをutf8にして保存するのが無難な気がするなぁ

use Encode;
$testStr = decode('sjis', "くが表示できません。");
でやってみたんだけどダメだった。
これはこれで誰か知ってたら教えて欲しい

==== utf8版Dump
PV = 0xa74bdc "\343\201\217\343\201\214\350\241\250\347\244\272\343\201\247\343
\201\215\343\201\276\343\201\233\343\202\223\343\200\202"\0
[UTF8 "\x{304f}\x{304c}\x{8868}\x{793a}\x{3067}\x{304d}\x{307e}\x{305b}\x{3093}\x{3002}"]

==== Encode版Dump
PV = 0xb3a2ec "\343\201\217\343\201\214\344\276\256\357\275\246\343\201\247\343
\201\215\343\201\276\343\201\233\343\202\223\343\200\202"\0
[UTF8 "\x{304f}\x{304c}\x{4fae}\x{ff66}\x{3067}\x{304d}\x{307e}\x{305b}\x{3093}\x{3002}"]

746 :743:2010/03/24(水) 21:28:05 ID:???
>>745

utf8にしたら上手く行きました。
ありがとう。

自分の環境でもencode版はだめでした。
後学のためになぜUTF-8だと上手く行くのか(UTF8と他の文字列の違い)を教えてくれませんか?

UTF-8は2バイト文字っていう認識しかないんだけど。

747 :nobodyさん:2010/03/25(木) 00:26:57 ID:2wRnf0pF
質問です。
ファイルを処理する際、ファイルの先頭から一行ずつ処理していくのが一般的ですが
これを2〜3行ずつ読み込んで処理することは可能でしょうか。
たとえば以下のようなプログラムを処理した場合
---------------------------
#include <stdio.h>

int main(void)
{
return 0;
}
-------------------------
// int main(void)
// {
// return 0;
// }
-------------------------
といったように特定の関数をコメントアウト化したいです。

748 :nobodyさん:2010/03/25(木) 01:09:18 ID:???
>>747
そのコメントアウト化ってどういうアルゴリズム?
ルールさえ決まってるなら1行ずつ処理していく方法でも上手くいきそうな気がするけどそれじゃダメそう?

749 :nobodyさん:2010/03/25(木) 01:16:51 ID:???
$/=適当な区切り文字列

750 :nobodyさん:2010/03/25(木) 09:47:05 ID:???
undef $/;
my $file = <$fh>;

これでファイルが丸ごとスカラに入る。


751 :nobodyさん:2010/03/25(木) 11:11:15 ID:???

use CGI::Lite;
を付け加えると、
下記のエラーが出ます。
どうすれば解決できますか?

[user@aaa ~]$ ./test.pl
Can't locate CGI/Lite.pm in @INC (@INC contains:
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl
/usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .)
at ./Extension_Mobility_test2.pl line 30.

752 :nobodyさん:2010/03/25(木) 12:43:51 ID:???
>>751
root権限でcpan CGI::Lite

753 :nobodyさん:2010/03/27(土) 12:20:26 ID:???
>>751
CGI::Lite をCPANからDLして、
http://search.cpan.org/dist/CGI::Lite/

使いたいCGIのあるディレクトにCGIってフォルダ作って中にLite.pm置くだけで使えるんじゃね?
試してないけど。

754 :nobodyさん:2010/03/27(土) 13:37:23 ID:???
use lib がどうこう
依存関係がうんぬん

755 :nobodyさん:2010/03/27(土) 13:42:43 ID:???
>>754
CGIのサブセットっぽいから動くんじゃね?
use libしなくても実行ファイルのルートからはたどってくれなかったっけ?

756 :nobodyさん:2010/03/29(月) 09:22:31 ID:???
751のエラーを見る限りでは . が含まれてるようだけど、
コマンドラインで試すときとCGIとして起動されるときは
また環境が違うから、置き場所決めてuse libしといた
方がいいんじゃないかな。

757 :nobodyさん:2010/03/29(月) 14:57:28 ID:???
ttp://www2u.biglobe.ne.jp/~MAS/perl/waza/authbasic.html

LWP::UserAgent->new;
を使っているのは理解しております。

HTTP::Requestもプログラム中では使っていますが、
なぜ、モジュール利用の宣言で
use LWP::UserAgent;
だけで、
use HTTP::Request;
となっていないのでしょうか?

758 :nobodyさん:2010/03/29(月) 15:23:53 ID:???
LWP::UserAgentの中でuseしてるから

759 :nobodyさん:2010/04/02(金) 14:04:38 ID:???
true と false を使いたいのですが定数でできますか?

760 :nobodyさん:2010/04/02(金) 15:26:59 ID:???
>>759
1と0を使うのが習わし

761 :nobodyさん:2010/04/02(金) 15:33:40 ID:???
マッチ演算子と置換をセットですることはできるのでしょうか?
イメージは下記のようにしたいのですが、エラーになります。


my $a = "aaa/bbb/ccc";
$a =~ sm|aaa/bbb|zzz|g;

762 :nobodyさん:2010/04/02(金) 15:44:52 ID:???
>761
sm///演算子なるものはない。
s///のセパレータに/以外を使いたいという意味なのか?
であれば、s|aaa/bbb|zzz|g でよいのではないか?


763 :761:2010/04/02(金) 16:01:28 ID:???
>>762
エスパー回答ありがとうw

セパレータを変えたかったんです。
mはいらなかったんですね。
ありがとうございました。

764 :nobodyさん:2010/04/02(金) 16:44:23 ID:???
知っているとは思うが、$aはmyの対象外だからねっ

765 :nobodyさん:2010/04/02(金) 20:09:24 ID:TSIkzIjB
そ、そうだったのかw

766 :nobodyさん:2010/04/03(土) 02:45:47 ID:???
$b too.

767 :nobodyさん:2010/04/03(土) 18:36:58 ID:???
<更新情報>========================
〜内容〜
==============================

テキストファイルに上記のように囲まれた部分があり、HTML として整形して
表示する際にこの部分を blockquote で囲んで出力したいと思ってます。

単純に 「===」 を </blockquote> にしたら、1行目でいきなり閉じちゃうので駄目でしたw。

今は1行目をテキストファイルに存在しえない様な文字列に置換してから、
「===」 を </blockquote> に置換してから、1行目を置換するといったことをやってます。

しかしどう考えても正規表現で1行で済むように思えてならないんです。

ちなみに 「=」 の個数は2〜3ほどのバラつきがあります。


768 :nobodyさん:2010/04/03(土) 18:53:47 ID:???
>>767
内容中に=がないことが前提だが。

use utf8;
use Encode;

$str = <<EOF;
<更新情報>========================
〜内容〜
==============================
EOF

$str =~ s|=+([^=]+)=+|<blockquote>$1</blockquote>|sg;
print $str;

769 :nobodyさん:2010/04/03(土) 20:22:50 ID:???
ありがとうございます。

使わせていただきます m(_ _)m

770 :nobodyさん:2010/04/03(土) 21:16:07 ID:???
>>768さんのがまったく動作しなかったので、30分悩んでたら出来たので報告
(<更新情報>[=]+.*?=[=]+)

=[=]+ とやらずに [=]+ とすると文字化けするので、こうなった次第。
euc-jp をやめて utf8 にした方がいいのだろうか?

771 :nobodyさん:2010/04/03(土) 21:17:14 ID:???
20%の確率であたりが出るといった処理を書いてみたのですが、
下記の考え方であってますでしょうか。

当たりカードを20枚発行し、100枚の中から抽選して一つでも
発行カード番号が入っていれば当選、としたかったのですが、
スマートな方法が見つからなかったので、このように書いて
みました。


# $rate%の確率で当選者が決定。
my $rate = 20;

# 抽選カード番号を100枚の中から発行
my $rand_num = int((rand(100))) + 1;

# 抽選カード番号が設定値($rate)以下であれば当たり(1〜$rateまでに含まれている)。
if($rand_num <= $rate){ 当選処理; }


772 :768:2010/04/03(土) 22:13:10 ID:???
>>770
Perlは内部ではutf-8を扱うのが基本
ソースももちろんutf-8
そして
use utf8;
という一文を最初のほうに加える (こうしないと2バイト文字を2文字としてカウントしてしまう)
入力と出力もutf-8であるべきだけど、
もし他の文字コードを用いたい場合には Encode.pm でデコード・エンコードしてやり、
常に内部ではutf-8を扱っている状態にしてやるのがよい

あと内部で扱う utf-8 と入出力で扱う utf-8 は別物だったりするので要注意

773 :nobodyさん:2010/04/03(土) 22:29:35 ID:???
>>771
同じこと書いてるけどこれじゃだめなの?

if(rand() <= 0.2){ ... }


774 :nobodyさん:2010/04/03(土) 22:52:36 ID:???
CGIとコマンドラインで実行したことを実行中のスクリプトから知るにはどうすればいいんでしょう?
ENV{'HTTP_HOST'}の有無で判別しても問題はないでもんでしょうか?

775 :nobodyさん:2010/04/03(土) 23:02:47 ID:???
my $urldata = {
'1' => { 'name' => 'TEST1', 'url' => 'http://〜', 'file' => 'test1.txt' },
'2' => { 'name' => 'TEST2', 'url' => 'http://〜', 'file' => 'test2.txt' },
'3' => { 'name' => 'TEST3', 'url' => 'http://〜', 'file' => 'test3.txt' }
};

foreach my $targetinfo (sort keys(%{$urldata})){
my $req = HTTP::Request->new(GET => $urldata->{$targetinfo}->{'url'});

上記のようなことをしたら

index.cgi: Argument "" isn't numeric in sprintf at [PATH] line 45.

とエラーが出たのですが、今いじってるスクリプトに sprintf を使っていないのでエラーの言ってる意味がわかりません。
それとも、そもそも間違ったことをしてるのでしょか?

776 :nobodyさん:2010/04/03(土) 23:18:09 ID:???
>>775
ごめんなさい別のファイル見てましたw
質問の仕切り直しです。
@mediainfo = map { $_->[0] } sort { sprintf("%02d", $a->[3]) cmp sprintf("%02d", $b->[3]) || $b->[2] cmp $a->[2] } map { [$_, split /\t/] } @mediainfo; # レギュラー (曜日設定) と日付でソート

こうしたとき、[3] には曜日を表す 0-7 の数字が入ってるのですが、毎週無い予定に関しては曜日設定を入れてません。
そこで sprintf でエラーが出てる状況です。
split した結果、配列の中で値の無い部分に対して 0 を代入することって出来るのでしょうか?
データに -1 でも入れておけと言われればそれまでなのですがw

777 :nobodyさん:2010/04/03(土) 23:27:56 ID:???
>>776
それ、エラーじゃなくてwarning。
その後、文字列"00"としてちゃんと実行はされている。
どうしてもその表示を消したければ、その部分で
no warnings "numeric";

778 :nobodyさん:2010/04/03(土) 23:43:36 ID:???
とりあえずそれを指定してwarnを消そうと思います

779 :nobodyさん:2010/04/03(土) 23:59:36 ID:???
no warnings でも消えなかったので
@mediainfo = map { $_->[0] }
sort { sprintf("%02d", ($a->[3] ? $a->[3] : 0)) cmp sprintf("%02d", ($b->[3] ? $b->[3] : 0)) || $b->[2] cmp $a->[2] }
map { [$_, split /\t/] } @mediainfo; # レギュラー (曜日設定) と日付でソート
こうしました。
強引且つ見栄えが汚いですがww

780 :nobodyさん:2010/04/04(日) 00:13:51 ID:???
sprintf "%02d", $a->[3] || 0
とかでいいじゃん
あと @mediainfo の要素数がかなり多いようだったら sprintf とかは事前にすませといて sort ブロックの中はなるべく単純な比較だけにするようにしたほうがいいかも

781 :nobodyさん:2010/04/04(日) 13:38:51 ID:???
そもそもsprintfいるのかとか、数字の比較なら<=>だろうが、とか

782 :nobodyさん:2010/04/06(火) 18:12:36 ID:???
# 設定の読み込み
open(INFH, '<', $config->{'file_mailform_config'});
my $config;
my $cnt = 0;
while (my $line = <INFH>){
  chomp $line;
  my ($tmpNAME, $tmpTITLE, $tmpALLOWVAL) = split(/\t/, $line);
  $config->{$cnt}->{'name'} = $tmpNAME;
  $config->{$cnt}->{'allowval'} = $tmpALLOWVAL;
  $config->{$cnt}->{'title'} = $tmpTITLE;
  $cnt++;
}
close(INFH);

この様にデータ内容を読み込んで、データの1行目はヘッダなので
undef $config->{0};
として削除したつもりでしたが、

foreach my $inputitem (sort keys %{$config}){
  print "$config->{$inputitem}->{'name'}<br>\n";
}

としたら、1行目があった場所 (undef する前に表示されてた場所) が空行で出力されました。
undef では連想配列の要素を削除することは出来ないのでしょうか?

undef を外すとヘッダ行が表示されます。

783 :nobodyさん:2010/04/06(火) 18:21:25 ID:???
>>782
つ delete

784 :nobodyさん:2010/04/06(火) 18:55:48 ID:???
そ、そんなのが用意されてたのか
無事、期待度通りの動作になりました。


785 :nobodyさん:2010/04/07(水) 23:42:24 ID:???
use threads;

にて
Software error:
This Perl not built to support threads
とのメッセージ

さくらのレンタルサーバーなんですがthreadsはサポートしてないのでしょうか・・・

786 :nobodyさん:2010/04/08(木) 00:04:18 ID:???
>>785
そう書いてあるようにしか見えないが

787 :785:2010/04/08(木) 00:20:24 ID:???
>>786

ありがとうございます。

788 :nobodyさん:2010/04/14(水) 01:52:36 ID:???
CGI::Applicationにてチェックボックスの値を受け取るのに苦戦しています。

my @check = $self->query->param('check');
foreach $temp(@check){
print $temp;
}

チェックボックスを何箇所チェックしようが、一つ目の値しか取り出せません。
URLにはキチンと &check=xxx&check=yyy〜 と渡ってきているように見えるのですが、、、

789 :nobodyさん:2010/04/14(水) 01:53:37 ID:???
[]

790 :788:2010/04/14(水) 02:06:40 ID:???
>>789
どういうことでしょうか?

foreach $temp(@check)の部分で配列から1要素取り出せてるので[]は必要ないという認識なんですが、
間違ってますか?

791 :nobodyさん:2010/04/14(水) 02:20:18 ID:???
name属性に[]つけるんだっけか

792 :788:2010/04/14(水) 02:30:47 ID:???
&check[0]=xxx&check[1]=yyy〜

という形で渡せればいいということでしょうか?
試してみましたが、
my @check = $self->query->param('check')
で値がひとつも取れなくなりました。。。

というか、基本的なことなんでしょうがググっても情報得られず。。。
調べ方が悪いのかな・・

793 :nobodyさん:2010/04/14(水) 02:49:00 ID:???
Perlはエスパーじゃないからパラメタが配列かそうじゃないかは解らない

794 :nobodyさん:2010/04/14(水) 02:58:53 ID:???
>>792
ごめん、name="check[]"とやるのはPHPだったかも

795 :788:2010/04/14(水) 03:23:59 ID:???
うーん、、、もうお手上げでございます。。

my @check = $self->query->param('check');
print "@check";

見事に一つ目しか取れてませんね。。。

796 :nobodyさん:2010/04/14(水) 03:56:01 ID:???
use CGI;

my $q = new CGI;
my @check = $q->param('check');

foreach $a(@check) {
print $a . "<br>\n";
}

とりあえずこれは動くんだけど、CGI::Applicationだとだめなんかね

797 :788:2010/04/14(水) 04:00:45 ID:???
>>796
うーん、、、一つ目しかとれないっすね。。。

HTML部分が悪いんでしょうか?

<input type="checkbox" value="xxx" name="check"/>
<input type="checkbox" value="yyy" name="check"/>

HTML部分はこんな感じです。


798 :nobodyさん:2010/04/14(水) 04:17:49 ID:???
〜.cgi?check=a&check=b
でやってんでしょ?
なんでいまさらHTMLを疑うのか。。

799 :788:2010/04/14(水) 04:22:31 ID:???
>>798

仰るとおり、、申し訳ない。

800 :nobodyさん:2010/04/14(水) 04:27:42 ID:???
>>796でもだめだったんだよね?
久しぶりにPerlインスコして書いてみたら動いたというだけなので、これ以上はサポートできず申し訳ない
環境はWS2003+IIS6+Perlis.dll

801 :788:2010/04/14(水) 04:33:19 ID:???
>>800他、アドバイスしてくださった皆さん

どうにもならなかったので力業ですが解決させました。

name要素をcheck_1,check_2に変更した上で、
my $i = 0;
while ($self->query->param("check_$i")) {
# 処理
$i = $i + 1;
}

とすることで無事に取り出せました。

解決しましたが頭の中は?でいっぱいでございます。。。

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

802 :nobodyさん:2010/04/14(水) 22:49:50 ID:???
CGI::Application のparam()とCGI.pmのpara()が違ってて、
CGI::Applicationの方はhashにしか対応してないからじゃない??
Applicationは使ったことないからどういう使い方をするのかあまり知らないが、
そもそも重複したparam名を使用すべきではないとか。。

CGI::Application こっちのsub array はハッシュのみ。
http://cpansearch.perl.org/src/MARKSTOS/CGI-Application-4.31/lib/CGI/Application.pm

CGI.pm こっちのsub paramは、arrayに対応。
http://cpansearch.perl.org/src/LDS/CGI.pm-3.49/lib/CGI.pm

803 :nobodyさん:2010/04/14(水) 23:02:13 ID:???
俺も使ったことないんだけど、CGI.pmでもだめらしいからね
>>796がうまく動かないらしい。

まぁ何かの間違いだと思うけど

804 :nobodyさん:2010/04/23(金) 00:45:52 ID:???
配列A と 配列B があって
それぞれ先頭から順番に値がセットになるような感じで並んでいたとします
また、それぞれに同じ値はないものとします

配列Aから条件式でマッチングを行い
必要なデータを取り出します

この条件式は配列Bでは使えないのですが
同じ条件で配列Bから抜き出すにはどうしたらいいでしょうか?

@a = (あ,い,う,え,お);
@b = (1,2,3,4,5);

@aのみ条件式でマッチング

最終的に
あ&1、う&3、お&5
みたいな感じで取り出したいんです

805 :nobodyさん:2010/04/23(金) 01:01:20 ID:???
@results = map { $a[$_] =~ /あ|う|お/ ? "$a[$_]&$b[$_]" : () } 0..$#a

806 :nobodyさん:2010/04/23(金) 01:04:47 ID:???
SQL だったら WHERE a.id = b.id と書くところだな
マッチング時に要素番号と要素をセットにした連想配列を作って
さらにその連想配列のkeyでループを回せばいいんじゃないかな

807 :nobodyさん:2010/04/23(金) 01:06:19 ID:???
s/WHERE/JOIN b WHERE/

808 :nobodyさん:2010/04/24(土) 20:33:36 ID:???
use 5.010;
my @array = qw(1 2 3 4 5);
say "found!(1)" if 3 ~~ @array;
say "found!(2)" if @array ~~ 3;

上記で「found!(1)」しか出力されません。
スマートマッチは可換ではないのでしょうか?


809 :nobodyさん:2010/04/24(土) 23:01:11 ID:???
勝手に仕組みを変えるなw

810 :808:2010/04/25(日) 14:09:14 ID:???
あるPerlの入門書には「可換」と書いてあるのですが。

ttp://perldoc.jp/docs/perl/5.10.0/perlsyn.pod
ここにも。

use 5.010;
my @array = qw(1 2 3 4 5);
my $number = 3;
say "found!(1)" if $number ~~ @array;
say "found!(2)" if @array ~~ $number;
say "found!(3)" if grep $_ == $number, @array;

811 :nobodyさん:2010/04/25(日) 14:27:40 ID:???
スマートマッチを今はじめて知った。
演算子が増えるとわくわくするよねw

812 :nobodyさん:2010/04/25(日) 19:23:39 ID:???
>>808
> Any Any string equality $a eq $b

これに引っかかってるのでは?

813 :nobodyさん:2010/04/25(日) 19:58:29 ID:???
>>808
それ普通に実行されるけど・・・

ちなみにうちの環境

v5.10.0 built for MSWin32-x86-multi-thread
Binary build 1004 [287188] provided by ActiveState
Built Sep 3 2008 13:16:37


814 :812:2010/04/25(日) 21:00:28 ID:???
私のところはv5.10.1だったので、5.10.1deltaを調べてみたら、あったよ。

http://search.cpan.org/~dapm/perl-5.10.1/pod/perl5101delta.pod#Changes_to_type-based_dispatch
> Changes to type-based dispatch
> The smart match operator ~~ is no longer commutative.

815 :nobodyさん:2010/04/25(日) 21:50:33 ID:???
DBD:OracleとDBI使ったタイムアウトの実装ってどうやってますか?例えばSELECT文実行して10秒返ってこなかったらエラーみたいな。
evalで囲っただけじゃOracleの戻りを待っちゃってうまい実装を探してます。

816 :nobodyさん:2010/04/26(月) 00:42:37 ID:???
「evalで囲っただけ」ってのは定番のこの処理のこと?

eval {
  local $SIG{ALRM} = sub { die 'timeout'; };
  alarm 10;
  # ディスパッチ
  alarm 0;
};
unless ($@ =~ /timeout/) {
}

817 :808:2010/04/26(月) 03:49:45 ID:???
>>812
>>813
>>814

ありがとうございます。
スッキリしました。( ^ー゚)bグッ!

ちなみに私のは、
v5.10.1 built for MSWin32-x86-multi-thread
Binary build 1007 [291969] provided by ActiveState
Built Jan 26 2010 23:15:11
です。


818 :nobodyさん:2010/04/26(月) 12:44:34 ID:???
>816さん
そです。
でもその実装だと10秒でdieしてくれなくてOrcleから処理が戻ってきてからじゃないとハンドリングできないんですよ。

819 :nobodyさん:2010/04/26(月) 13:04:32 ID:???
>>815
DBIのマニュアルにまさしくDBD::Oracleだとうまくいかないからこうしろってのが
書いてあるのでためすといいよ。

820 :nobodyさん:2010/04/30(金) 10:50:25 ID:???
掲示板でタグの入力を単純化するために、独自のタグを使っています。
内容的には非常に単純で
<hoge>テスト</hoge>
とすると、
<font style="font-size:x-large">テスト</font>
のように置換するだけです。

ここでみなさんにお伺いしたいことは
テストの文字を取得して加工する
というものです。
以下のような式を考えましたが、

($art) = $mes =~ /<hoge>(.*?)<\/hoge>/;
if($art){
$mes =~ s/<hoge>(.*?)<\/hoge>/<span style=\"font-size:140%;\">$art<\/span><span style=\"font-size:180%;\">$art<\/span>/g;
}

一回の書き込みの中で2回使用しようとすると、
2回目の方まで一回目の内容で適用されてしまいます。
↑よくよく考えてみれば、当たり前ですが。
なんとか、一回の書き込みの中で複数回使用できるようにしたいのですが、
どのようにすればよろしいでしょうか?

宜しくお願い致します。

821 :nobodyさん:2010/04/30(金) 10:58:23 ID:???
$mes =~ s#<hoge>(.*?)</hoge>#<span style="font-size:140%;">$1</span><span style="font-size:180%;">$1</span>#g;

822 :nobodyさん:2010/04/30(金) 11:28:59 ID:???
>>821
早速のレスありがとうございました。
大変助かりました!

823 :nobodyさん:2010/04/30(金) 22:13:35 ID:???
余計なお世話だけど、変換する前の内容も
表示用とは別に保存しておくといいよ

824 :nobodyさん:2010/05/01(土) 04:35:43 ID:???
画像のContent-Typeを取得したいのですが、
下記で取得が行えません。

my $q = new CGI();
my $fh = $q->upload($fieldname);
my $mime =uploadInfo($fh)->{'Content-Type'};

エラーログには下記がはかれていました。
Premature end of script headers:
Can't use an undefined value as a HASH reference at /image line 82, <DATA>

他にもContent-Typeを取得する方法があればそれでもいいのですが、
このエラーも解決してみたく持ってますので、ご教示いただけますと
幸いです。

825 :nobodyさん:2010/05/01(土) 05:00:33 ID:???
uploadInfoに$q->がない?

826 :nobodyさん:2010/05/01(土) 05:16:37 ID:???
>>825
早急なご返答感謝です。

状況ですが、変わりませんでした。。

827 :nobodyさん:2010/05/01(土) 07:52:23 ID:???
my $info = uploadInfo($fh);
my $mime = $info->{'Content-Type'};

ようわからんけど uploadInfo から帰ってきた値が undef だと言われてるみたいだけど


828 :nobodyさん:2010/05/01(土) 09:41:14 ID:???
>>824
moduleのドキュメント見てみたけど、
uploadInfoに渡すのはfile handleじゃなくファイル名じゃないとダメなんじゃない?

[module doc]
$filename = $q->param('uploaded_file');
$type = $q->uploadInfo($filename)->{'Content-Type'};
unless ($type eq 'text/html') {
die "HTML FILES ONLY!";
}


829 :824:2010/05/01(土) 18:35:17 ID:???
皆様有難うございました。

これってフォームからアップロードされた画像を対象にContent-typeの
取得を行うんですね。。根本的に間違えてました。。

指定した画像のContent-Typeを取得する簡単な方法はないもので
しょうか。
拡張子がgifなのに実際はpngであったりとするケースがあるため、
Content-Typeで判定をしたいのですが、ご存知でしたらどうか
教えてください。

830 :nobodyさん:2010/05/01(土) 19:30:27 ID:3heBO4S1
>>829
それってUploader云々ではなくて、例えばローカルとかに保存してあるファイルのことかい?
だったらGDでもImage::Magicでも使って、画像を判定すればいいんでね。
まあヘッダの数十〜百バイト程度の判定で済むから、自前でバイナリ読んで解析するとかもあり。
(GDではWindows-bmpに未対応なので、以前自分で書いた)

831 :nobodyさん:2010/05/01(土) 20:59:59 ID:???
>>830
はい、そうです。
Image::Magickはサーバに入れられなかったので、GDで
できる方法があれば教えていただけますと幸いです。

よろしくお願いいたします。

832 :nobodyさん:2010/05/01(土) 21:32:17 ID:???
ファイルの先頭8バイトだけで画像のフォーマットを調べる
ttp://labs.gmo.jp/blog/ku/2007/05/8.html

phpだがperlに応用可能だろう

833 :nobodyさん:2010/05/01(土) 22:50:54 ID:???
Windows だったら Apache の conf ディレクトリにある magic.default を使うのも
ただ、PNG が無いっていうw


834 :nobodyさん:2010/05/01(土) 23:06:47 ID:???
http://perldoc.jp/docs/modules/File-MMagic-1.21/MMagic.pod
モジュールあるのね

そこそこ設定の揃ってるマジックファイルって、誰か配布して無いっすかね

835 :nobodyさん:2010/05/02(日) 02:25:22 ID:???
>>832-834
ありがとうございます。
勉強になりました。

最終的には、MMagicを使用させていただきました。
これ便利ですね。

この場をお借りし御礼申し上げます。

836 :nobodyさん:2010/05/10(月) 14:42:47 ID:???
use CGI;
$q = new CGI;
@hoge = $q->param('hoge');

@hoge = ("hoge", "hogehoge")

と同じ方法をCGI.PMをもちいらないで出来ませんか?

read(STDIN, $q, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $q);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
@FORM{$name} = $value;
}
@FORM{$name} = ("hoge", "hogehoge")
みたいな感じで

837 :nobodyさん:2010/05/10(月) 14:45:58 ID:???
頑張ってプログラム書けばできるよ。

838 :836:2010/05/10(月) 18:06:05 ID:???
read(STDIN, $q, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $q);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
push(@hoge, $val) if $key =~ /hoge/;
@FORM{$name} = $value;
}
で自己解決しました。
お邪魔しました。


839 :836:2010/05/10(月) 18:07:53 ID:???
push(@hoge, $value) if $name =~ /hoge/;

だった。

840 :nobodyさん:2010/05/10(月) 20:01:30 ID:???
そもそも form の値が不明の時点で、行儀のいいスクリプトなのかな・・・

841 :nobodyさん:2010/05/12(水) 14:33:57 ID:l5g8HUnE
フォームから入力した「漢字データ」をtxtファイルに出力したら、
文字化けしています。どうすれば良いのでしょうか。

Perlのソースに記述した漢字は、パソコンのテキストエディタ表示、
IE上のフォーム表示、サーバのファイル上のいずれでも文字化けして
いません。
フォームを表示するhtmlの<meta>タグではShift-JISを指定しています。

よろしくお願いします。


842 :nobodyさん:2010/05/12(水) 21:13:03 ID:???
それだけの情報だと
ソースが無いことにはなんとも

843 :nobodyさん:2010/05/13(木) 09:22:25 ID:???
use Encode;
使っててダメなのなら>>842に同じ。

844 :nobodyさん:2010/05/14(金) 23:42:43 ID:???
LWP で取得した JPEG を扱うときって なんちゃら blob とかで
変換?してたような気がするんですけど、なんでしたっけ?

ちなみに GD 使ってます

845 :nobodyさん:2010/05/15(土) 00:20:02 ID:???
>>844
ImageMagik?

846 :nobodyさん:2010/05/15(土) 00:26:24 ID:???
あ〜、ImageMagick でしたねw

GD にメモリの中にあるバイナリを GD と結びつける方法は無いのかしら?
一旦ファイルに書き出さないと駄目な感じなんですかね・・・

847 :nobodyさん:2010/05/15(土) 00:35:15 ID:???
>>846
SEE GD Manpage
>Alternatively, you may create a GD::Image object based on an existing image by providing an open filehandle, a filename, or the image data itself.

848 :nobodyさん:2010/05/15(土) 00:52:53 ID:???
英語読めないけどニュアンスで読むと
「ファイルから読め」
って事っすね orz

849 :nobodyさん:2010/05/15(土) 02:58:47 ID:???
my ($tmp_fh, $tmp_filename) = tempfile(DIR => $config->{'dir_temp'});
〜 ファイル名 $tmp_filename で画像を作る処理 〜 省略 〜
my $imgbin = GD::Image->new($tmp_filename);

こうやるとエラーログに

[Sat May 15 02:42:21 2010] index.cgi: Use of uninitialized value $pkg in concatenation (.) or string at /perl/lib/Symbol.pm line 129.

が出てきます。

Symbol.pm の 129 行目を含む関数は qualify なんですが、 GD.pm のソースを見ても qualify が有るわけも無く、デバッグしようにも負えません。

GD::Image->new($tmp_filename); に必要な引数があるのかと思って、CPAN の GD とこを見ても、サンプル自体がこういう記述の仕方。

コレって解決方法無いんでしょうか?


850 :nobodyさん:2010/05/15(土) 13:25:56 ID:???
GD::Image->new($data);
これでファイルの読み込みしなくて済むようになった
ImageToBlobみたいのがあるかと思ったら、そのままGDに投げてよかったんですね

851 :nobodyさん:2010/05/15(土) 17:41:13 ID:???
>>850
ニュアンスで読むからそうなる

852 :nobodyさん:2010/05/15(土) 20:30:59 ID:???
or the image data

これか!
言われて今気が付いたw

853 :nobodyさん:2010/05/15(土) 23:27:44 ID:???
HTTP::REQUEST を使って、例えば、xmlをポストすると、どうして、url ENCODE が必要なのでしょうか?普通に、POST コマンドを使ってxmlをポストするときは、URLエンコードが必要ないです。

なぜURLエンコードが必要が教えて下さい

854 :nobodyさん:2010/05/16(日) 02:50:47 ID:???
え?

855 :nobodyさん:2010/05/16(日) 08:07:46 ID:???
>>853
教えてgoo@韓国とかないの

856 :nobodyさん:2010/05/16(日) 08:23:36 ID:???
>>855
あるよ↓

OK World - ?? ???? ?? ?? ??
http://world.okwave.jp/korean/

857 :nobodyさん:2010/05/16(日) 18:26:33 ID:GMFXnF2I
現在、下記のようなpgをかいています。
my $method = 'POST';
$request = HTTP::Request->new( $method, $uri,$header,$xml); --@


POSTする際に、BASIC認証が必要なのですが、
別のモジュールでいう、
$req->authorization_basic("username","password");
的なことを、
use HTTP::Request;
を使って行いたいと思っています。つまり、@に追加して認証を行わせたいと思っています。
http://search.cpan.org/~gaas/libwww-perl-5.836/lib/HTTP/Request.pm

何か方法はありますでしょうか?

858 :nobodyさん:2010/05/16(日) 19:17:21 ID:???
>>857
http://search.cpan.org/~gaas/libwww-perl-5.836/lwpcook.pod#ACCESS_TO_PROTECTED_DOCUMENTS

859 :nobodyさん:2010/05/16(日) 22:43:32 ID:GMFXnF2I
A(CLIENT )
B(AP SERVER)

A-B 間は、HTTPプロトコルでXMLをやり取りするシステムだとします。
この際、AからBに何らかのXMLを送られてきたときHTTP GET で、

Bには、http://www.geekpage.jp/programming/perl-network/lwp-useragent-0.php
のプログラムがあり、BのAPサーバー上で 上のプログラム.pl とすると、期待通り、htmlファイルを
すべて画面に表示します。

さて、クライアントAから上のCGIにアクセスがあったとき GET でhoge.cgi としてクライアントからサーバーにアクセスします。上の結果をA(クライアント)に帰してやりたいと考えています。

具体的には、AからのレスポンスのXML内に埋め込んでやりたいと考えています。
どうやれればいいでしょうか?
もう少し言うと、
APからのサーバのレスポンスは、
HTTPレスポンスヘッダと、
<XML1>
ここに取得した情報を書きたい
<XM1>

このレスポンスを返したいと思います。

860 :nobodyさん:2010/05/17(月) 04:32:17 ID:???
blog とかで画像を保存する場合、多すぎるなるであろうファイル数の対策として

/img/5/a/7/d/20304495.jp

みたいにすることがありますが、これって技術的な名前ってあるんでしょうか?

ディレクトリ 分散化 でググっても知識として手に入れる例とかが出てこないので・・・


861 :nobodyさん:2010/05/17(月) 10:48:50 ID:???
「データ正規化」でググって。
例えば、はてなブックマークのスクリーンショットはSHA-1で正規化したコードを
ディレクトリとファイル名に使ってる。

862 :nobodyさん:2010/05/17(月) 11:04:55 ID:???
>>859-861
>>1

863 :nobodyさん:2010/05/17(月) 12:40:45 ID:???
言葉が足りなかったですね

自分が作るサービスに数万ものユーザーが来るわけではないですが、それを見越した設計をするのが良いのかなと思ってたとこでの質問でした。


1時間に数百ものファイルが投稿されたら、1つのディレクトリに1万ものファイルとか余裕でたまるわけで、
全てのサーバーが新しいファイルシステムを採用してるわけではないので、1つのディレクトリあたりのファイル数を
1万未満に制限し、あふれたファイルは別のサブディレクトリというのを考えてます。

純粋に http://〜.com/files/2010/05/17/hh_xxxxxx.xxx の様にしてもいいのかなと思いましたが、
記念日の0時、例えば正月なんてそれで足りるとは思えませんしw
だったら http://〜.com/[a-z]/[a-z]/[a-z]/[a-z]/[a-z]/ のようなディレクトリを先に作ってしまい、偏らないように分散出来ないものかな?

などなど思ってたりするわけです。


ここまで書いて思ったけど、perl の話じゃなかった・・・

864 :nobodyさん:2010/05/17(月) 17:36:43 ID:???
通じてねええええええ
すごく・・・ガッカリです・・・

865 :nobodyさん:2010/05/17(月) 23:55:28 ID:OKXaqr1F
すいません、普通にATOMをテキストの行として扱えるモジュールいいのないでしょうか?
XML::ATOMって多くのモジュール入れるみたいで、エラーになります。環境は普通のWinXPです。

866 :nobodyさん:2010/05/18(火) 01:44:50 ID:???
異常なWinXPってあるのか?

867 :nobodyさん:2010/05/18(火) 01:49:44 ID:???
あるよ。中華版。

868 :nobodyさん:2010/05/18(火) 06:45:19 ID:???
XML-Atomはppmに無いからめんどくさいんだよな
だから俺は使ってない
あとこいつマルチだな

869 :nobodyさん:2010/05/18(火) 07:30:05 ID:???
>>864
SHA-1として生成した文字列があった場合、色んなディレクトリにバラけると思うが、
SHA-1から得たディレクトリに収めようとして、そのディレクトリがすでに10000を超えようとしてたら
どうやって違うSHA-1の文字列を得るの?

再生成事態があってはならない事だと思うのだけど?

870 :nobodyさん:2010/05/18(火) 14:02:13 ID:???
桁を分割しろよ
頭から一桁ずつ6階層のフォルダを作るだけで16777215通りにバラけるだろ
必要に応じてもっと深くしてもいい

なんでそんなことも思いつかないの?

871 :nobodyさん:2010/05/18(火) 19:28:59 ID:???
いやそれぐらい思い付く

それだと、特定のディレクトリに一定数 (今回は1万) 以上溜まらない。 って事になるでしょう。

しかもファイルから保存場所を求めるわけだから、別の値を求められるわけではない。


872 :nobodyさん:2010/05/18(火) 22:03:00 ID:???
>>871
ただ単にディレクトリをDBで管理すればいいだけじゃないの?
ランダム文字列/3桁数値
ファイル名とディレクトリ・数値をDBで紐付け

いまいち論点が掴めない

873 :nobodyさん:2010/05/19(水) 00:40:36 ID:???
こういう破天荒な事を質問するような事態はどこかで何かを間違えている

874 :nobodyさん:2010/05/19(水) 06:25:00 ID:???
>>871
なんで別の値を求めようとするわけ?
やっぱり分かってねえなコイツ

875 :nobodyさん:2010/05/19(水) 08:17:09 ID:???
ファイル数が少なすぎる例えですが、
ディレクトリあたり2までしか保存させないとする。

ファイルのデータからSHA1を求めて、求めた文字列から保存するディレクトリを決める。

(めんどくさいので文字列は短め&単純にしてます)

ファイル   SHA1     保存先
aaa.jpg  123456789 -> 1/2/3/456789.dat
aab.jpg  123456890 -> 1/2/3/456890.dat
acd.jpg  123456000 -> 1/2/3/456000.dat

例えばこうなった場合、3つめのファイル acd.jpg の保存先はどうなるのかなと。
実際の得られる文字列はもっと長いから、ディレクトリ自体を深く掘ればいいでしょうが、
それだけではファイルが溢れないという約束は得られないですよね?


876 :nobodyさん:2010/05/19(水) 09:13:26 ID:???
どんなに深くなってもよければファイル名はuniqueにつけてるとして
ファイル名を2文字ずつぐらいに区切ったディレクトリをずんどこ掘って
格納すれば絶対に大丈夫ではある。

たとえば

aaa.jpg → aa/a./jp/aaa.jpg

877 :nobodyさん:2010/05/19(水) 09:15:14 ID:???
約束はもちろん得られる。
最終的なディレクトリに置くファイル数が二つまでなら、1ビットになるまで桁を分割すればいい。

サブディレクトリ数1万までという前提で話すが、
SHA-1で得られる文字列は16進数なので、3桁ずつ使えばサブディレクトリ数は4095個に制限できる。
fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/f.dat

最終的なファイル数を二つに制限したい場合はこうなるな。
000/000/000/000/000/000/000/000/000/000/000/000/000/0/0.dat から
fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/7/1.dat まで

これでもまだ分からないようなら俺は降参するよ。

878 :nobodyさん:2010/05/19(水) 09:32:00 ID:???
いやハッシュ値は衝突があるから衝突したファイルがたくさんあったら終わるのよ。
SHA-1は160bit(=20バイト)しかないんだから、100文字ぐらいのファイル名なら
いくらでも衝突させられるよ。狙ってファイル名を決めない限り現実にはそうそう
起きないけどね。

879 :nobodyさん:2010/05/19(水) 10:35:56 ID:???
ファイル名?

[hoge@foo ~]$ openssl sha1 -c a.txt
SHA1(a.txt)= 5f:e4:3b:0e:3e:95:d4:3c:1f:a4:8b:35:cf:39:e6:9c:62:83:42:81
[hoge@foo ~]$ openssl sha1 -c b.txt
SHA1(b.txt)= 5f:e4:3b:0e:3e:95:d4:3c:1f:a4:8b:35:cf:39:e6:9c:62:83:42:81

試しに2つくらい狙って衝突させてみてくれないか?

880 :nobodyさん:2010/05/19(水) 10:48:02 ID:???
狙って起こすのはたいへんだけど偶然には起きるもんだからなぁ。

881 :nobodyさん:2010/05/19(水) 11:04:11 ID:???
ファイル名からハッシュ求めたらいくらでも衝突するだろ
普通中身で求めるもんだと思うけどな

882 :nobodyさん:2010/05/19(水) 11:15:49 ID:???
ファイルの中身でハッシュ求めるのは改ざん防止とかそっちの方の
目的だよ。単にファイルをディレクトリに分散して置きたいだけなのに
中身のハッシュとるのは重過ぎる。

883 :nobodyさん:2010/05/19(水) 11:41:02 ID:???
1万のファイル数制限をかけたいのに4000物ディレクトリなんて使いたくないよママンw

データに対してハッシュを取るのは確かに重いですね。
WEB サービスでなければ全然問題ないですが、、、


そう考えると「readme.txt」 をアップする人なんてたくさん出てくる可能性もあるし、
a.avi をアップしようとする人はたくさんいると思う。
みんながみんな、毎回毎回違うファイル名を使ってくれるとは思わない。

どう考えても衝突しますよね・・・

884 :nobodyさん:2010/05/19(水) 12:13:20 ID:???
ID bigint auto_incrementを1万で割るなりしたら?
将来を見越すと、bigintが溢れる不安が残るかもねー。

885 :nobodyさん:2010/05/19(水) 13:19:13 ID:???
お前らコーディングしろよ。アルゴリズムスレに来たのかと勘違いしたわ

886 :nobodyさん:2010/05/19(水) 14:46:10 ID:???
>>870
関係ないが奇数通りはおかしいとおもってほしいな

887 :nobodyさん:2010/05/19(水) 15:30:14 ID:???
むしろauto_incrementを使わない理由が分からない
頭おかしいんじゃねえの?

888 :nobodyさん:2010/05/19(水) 15:41:50 ID:???
ファイル名がただの連番だとパスワードかけてないシステムだとスコスコ抜かれてアクセス増えて面倒よ

889 :nobodyさん:2010/05/19(水) 17:41:34 ID:???
保存しようとするディレクトリは初めからバラけさせるんじゃなく順次作成し、
何等かの管理ファイルまたはdbには

現在の保存ディレクトリ
現在の保存数

を記録。


ただディレクトリが深くなりすぎず、且多くなりすぎないボーダーがわからん

ext3とかNTFSがパフォーマンス低下しないレベルの数どれぐらいなんだろうな

890 :nobodyさん:2010/05/19(水) 17:57:19 ID:???
use Error qw(:try);
の「:」って何?

891 :nobodyさん:2010/05/19(水) 18:02:03 ID:???
>>888
それをハッシュにかければ問題ないな
衝突するっていうならIDをインクリメントして再試行すればいいし

892 :nobodyさん:2010/05/19(水) 22:01:01 ID:???
>>891
とりあえず0〜10000000まで衝突なし。
while( $i < 10000000 ){
  $sha1 = sha1($i);
  $digest{$sha1}++;
  $i++;
}
で衝突有無の確認したんだけど、
たったこれだけでメモリ1GB消費するんだよね。
単体スクリプトで、他に何かいい書き方ってあるのかな?

っつーか、sha1って脆弱性突いて2^52の計算でおk!なんだよね・・・・
まだ2^24未満だよ。このままだと$i = 2^80まで衝突しないんだろうか?

893 :nobodyさん:2010/05/19(水) 23:46:07 ID:???
>>892
逆にどのくらいのメモリ消費なら納得したのかな

894 :nobodyさん:2010/05/20(木) 01:34:31 ID:???
いや、「たったこれだけ」ってのは、bigint中の1000万しか検証してないって事ね。
何か省メモリな方法(知恵?)があったりするんかなーって思っただけだから。

895 :nobodyさん:2010/05/20(木) 01:34:50 ID:Y0b7Ouqx
WEB API 等を使ってATOM形式のデータを
my $data = get 'http://search.twitter.com/search.atom?q=java';
use XML::Atom::Syndication;
を使って
my $doc = XML::Atom::Syndication->instance->parse_file($data);ーー@

として、##XPathを使用して取り出す
my $title = $doc->query("/feed/title")->text_value;のようにして、各要素を取りだそうとおもったのですが、
Can't locate object method "instance" via package "XML::Atom::Syndication"
と@で、エラーになります。どうすれば、@で変数に格納できるでしょうか?

896 :nobodyさん:2010/05/20(木) 01:44:41 ID:???
>>895
まず、その使い方はどこで覚えたの?

897 :nobodyさん:2010/05/20(木) 05:12:58 ID:???
>>883
>1万のファイル数制限をかけたいのに4000物ディレクトリなんて使いたくないよママンw
>>863
>1万未満に制限し、あふれたファイルは別のサブディレクトリというのを考えてます。

ここなんか矛盾してない?

898 :nobodyさん:2010/05/20(木) 05:38:10 ID:???
>>891
YouTubeがそれやってるね

>>895
XML::Atom::Syndicationはバージョンによって
インタフェースがガラッと変わってるので、まずはバージョンを

899 :nobodyさん:2010/05/20(木) 17:06:08 ID:???
本当は5000に制限したいんだけど、スレに書いたときは10000万だったので便宜上数は変えないでいるだけっす。

900 :nobodyさん:2010/05/20(木) 17:43:39 ID:???
1億個か
inode的には全然余裕あるな
もう分ける必要ないね

901 :nobodyさん:2010/05/20(木) 18:16:37 ID:???
あ〜、、、間違えたorz

902 :nobodyさん:2010/05/20(木) 19:07:44 ID:???
ここWebProgだよね…

「年月日/時/分/秒/ミリ秒/接続元IP.拡張子」でよくない?
1ミリ秒に5,000〜10,000リクエストなんて処理できないから大丈夫だよ


903 :nobodyさん:2010/05/20(木) 19:10:04 ID:???
そういう簡単な答えを欲してたんかもね>質問者

904 :nobodyさん:2010/05/20(木) 21:48:03 ID:???
すみません教えてください。
インターネットを見ながら見よう見真似なのですが、ファイルを上手く書き出せません。
Windowsのperl(5.8.8)です。スクリプトはUTF-8でUTF-16でファイルを作りたいのですが、
文字が■□◇みたいになって化けてしまいます(><)何処がおかしいですか?

#!/usr/bin/perl

use strict;
use utf8;
binmode STDIN, ":encoding(cp932)";
binmode STDOUT, ":encoding(cp932)";

open W, ">:encoding(utf-16)", "[TEST].txt" or die $!;
print W <<EOF;
A「もしもしB君?パソコンが動かなくなっちゃったんだけど」
B「どこのメーカーのPCだっけ?」
A「スイッチ押すとピーって言って止まっちゃう」
B「ふーん・・・で、メーカーは?」
A「何回も再起動してるんだけど、ピーって言って止まっちゃう」
B「・・・なんかエラーメッセージ出てない?」
A「まただ・・・またピーって言って止まったよ。なんで?」
B「知るかっ!」
EOF
close W;
print "書き出しました...\n";
exit;

__END__

905 :nobodyさん:2010/05/20(木) 22:13:30 ID:???
>>904
エディタ何使ってる?メモ帳?

906 :nobodyさん:2010/05/20(木) 22:18:16 ID:???
>>905
秀丸です。

907 :nobodyさん:2010/05/20(木) 22:36:11 ID:???
>>906
で、このスクリプトはutf8で保存してる?
書き出されたファイルは全部文字化け?

908 :nobodyさん:2010/05/20(木) 22:44:57 ID:???
>>907
秀丸の表示ではスクリプトは[UTF-8][CR+LF]になってます。
書き出されたファイルは↓な感じで部分的に読めます。
秀丸では[Unicode(Big-Endian)][CR]と出ています。


A「もしもしB君?パソコンが動かなくなっちゃったんだけど」
???椰???????????????A「スイッチ押すとピーって言って止まっちゃう」
???田???????????????A「何回も再起動してるんだけど、ピーって言って止まっちゃう」
??????????????????????A「まただ・・・またピーって言って止まったよ。なんで?」
??????????

909 :nobodyさん:2010/05/20(木) 22:47:27 ID:???
あれ、一行明けでおかしくなってるのかな。どうしてだろう。

910 :nobodyさん:2010/05/20(木) 22:57:45 ID:???
>>908
ttp://hirakun.blog57.fc2.com/blog-entry-76.html
これかな

911 :nobodyさん:2010/05/20(木) 23:04:25 ID:???
>>910
できました。
真似してみたら解決しました。
嘘みたいです。
嬉しいです!!
有難うございました!!!!

912 :nobodyさん:2010/05/21(金) 03:02:13 ID:???
>>902
5000個ごとに分けたいだけなのに1000ディレクトリもわけないといけないなんて
と嘆くのが今回の質問者

cronで定期的にファイルの数かぞえて、(たとえば)4500を超えていたら新しいディレクトリを作成して、
シンボリックリンク(たとえばcurrent)を張り替えるのがいいかもしれん

913 :902:2010/05/21(金) 04:19:19 ID:???
(現状では)SHA-1の話しは論理的に)280回の施行で衝突を起こせるらしいので
SHA-1以外のなにかで、280とおりもとめられればおよそ問題ないハズなのでそっちから検討するのもあり
(誕生日問題を含む)偶然まで考慮するなら他のアルゴリズムを採用するべき
ただし、どの場合でも(衝突率が誕生日問題で崩壊してるので)ファイル名はキーになりえない。


914 :902:2010/05/21(金) 04:21:28 ID:???

1. ベストは「要件に合わせて適切な処理をする」なのでこんな大雑把な質問にベストの解は無いので
 小でも動くけど大まで見越すのであれば大がある程度基準になってしまうのはしょうがないと思う。
 「小でも〜」を考慮するとあらかじめ保存先をすべて作っておくよりなければ都度作る方が効率がいいと思う。
 >アクセスに依存する考えなので「1000に分けないで〜」と言う要件は解決
2.FAT16やext2世代より以前のファイルシステム使ってるようなサーバなら
 そもそもそんなにトランザクションさばけないので要件を満たす。
 現状の良いスペックでも要件を満たす。
 将来性もある程度考えた仕組みを考える。
 >勝手に作った前提
3. 株とかFXみたいにものすごいトランザクションでは無い投稿系の処理なら
 msまでわけないで秒までにしておいて衝突するようなら攻撃的なアクセスとみなしてエラーにしちゃえばいい
4. ディレクトリ数は秒までなら366*24*60*60ディレクトリ(合計31,622,400)となるので
 ひとつのディレクトリは1000こえないのでext2でも十分機能する
 もっと古いFSを考慮するなら255こえないほうが安全なので年/月/日にすればいい
 >msまで考えると1000になりえるので破綻
5. 最近のハードでも1台で運用するのであれば5000〜10000UU/秒をさばける構成は思いつかない。
 将来的(5〜10年後)もよほど画期的な何かがでてこない限り要件を満たすハズ。
 画期的なアイデアがでたとしても普及には時間がかかるので見直して修正する時間は十分にある。
 「一台で」という勝手に作った前提がくずれて複数のフロントエンド、1つのファイルサーバとみても
 フロントエンドのIPを要件にあわせて必要な位置に足せば十分機能する。
6. (プログラムの性質にもよるけど一般的に)拡張性を考えても頭の方の「年月日」を「年/月/日」にして
 当年ディレクトリまたは当月ディレクトリ辺りを早いデバイスにすれば十分な速度が得られる
 

915 :nobodyさん:2010/05/21(金) 07:37:40 ID:???
「年月日/時/分/秒/ミリ秒/接続元IP.拡張子」で良いかと思う
に対する考察ってことでOK?

916 :nobodyさん:2010/05/21(金) 17:19:06 ID:???
秒間2000ファイル前後ぐらいしか作れなかった。無念。

917 :nobodyさん:2010/05/21(金) 23:24:55 ID:???
>>913
280 って何じゃそりゃ?
SHA-1 の衝突(#)困難性の脆弱化は、 総当たり攻撃で
2**80 の計算で一回起ると言われていたが、現在
2**52 で起るとの報告がされてる。
「4.5035996273705e+15」の計算だ。
「 280 回の施行で衝突を起こせる」つーのはググって、
ソース元にアクセスせずに鵜呑みで書いてるだろ。
ま、一つほど大歩危カマしてる .jpg ファイルは見つけたけど。

== 余談 # の事 ==
SHA-1 の話題で「衝突」と言えば、
「異る2つの対象ファイルが同一のハッシュ値を持つ事」
を意味する。
決して「偶然同じ名前を付けられた二つのファイルの
ハッシュ値が同じ」などの意味では使わない。
んなもん一回の計算で衝突させられるに決まってる。
ネットワークデータ通信で衝突と言う言葉も使われるが、
混同しない様に注意しながら文を書くのが礼儀じゃねーの?


スレ違い失礼。



918 :nobodyさん:2010/05/21(金) 23:36:08 ID:???
「偶然同じ名前を付けられた二つのファイル名の
ハッシュ値が同じ」

919 :902:2010/05/21(金) 23:44:50 ID:???
SHA-1使う必要ないよね?って話なので、おっしゃる通り適当にしらべてました。


920 :nobodyさん:2010/05/22(土) 00:13:35 ID:???
質問者の意図ともズレてると指摘されてるのに。
>>892氏が既に呟いてる事柄を見落したりして、
適当に調べた事を、平気で書く人間の文を真面目に
読む気にはならんよ。


921 :nobodyさん:2010/05/22(土) 19:18:04 ID:VfPIyjHK
1ヶ月前くらいからPerlを勉強し始めた超がつく初心者です。
配布されてるCGIのゲームをホームページにつくり、そのスクリプト改造しながら勉強してます。
最初は改造方法とか書いてあるページでいろいろやってましたが。。
そろそろ基本的なことを着実にやらないとと思い、ちまちまやってます。
学生でお金もあまりないので参考書とかあまり買えないです。ネットで勉強してます。
なので恐ろしく馬鹿馬鹿しい質問するかもしれませんが許してやってください。意欲だけなら底なしです。。

ゲームの内容は普通にプレイヤーがモンスターを倒す(ダメージをあたえる)ようなもんです。
そこでプレイヤーの技に「〜〜という文字が含まれているモンスターには普通より多いダメージを与える」というものを作りたかったんです。
それで
if ($xx =~ /ABC/){  ・・・の文法を使おうとしたんです。
でもABCのところにいざモンスターの名前をいれようと全角カナを使ったらエラーです。
どうにかできないかと""で囲ったりいろいろやってたらどんどん迷いこんでしまいました。
jcodeとかあるなーなんてやってみてもjcode呼び出す文とかがぜんぜん分からなくて・・・
解決方法と解説、よろしければお願いします。m(__)m

※全部半角でいこうかと考えましたが、これのほかに解決方法がなければそうしたいなと思ってます。

922 :nobodyさん:2010/05/22(土) 20:06:15 ID:???
if ($xx =~ /\QABC/){

923 :nobodyさん:2010/05/22(土) 20:14:20 ID:???
技名に特定文字列が入ってたら・・・とかで動作を決めるのはやめておいたほうがいいかと。
とりあえず、技名は全て決め、その技名に対してユニークな (重複の無い) な ID を振る。
その技がどんなタイプなのかを決めておくといいかも。
例えば、スライム系に対して攻撃力何パーセント上乗せみたいな。

my $SPAttack = {
 '00001' => {
  'name' => 'アイスアロー',
  'base_power' => 30,
  'type' => {'magick' => 1, 'physical' => 1}, # 技が魔法、物理かどうか
  'attribute' => 'ice',
  'target_attribute' => {'slime' => 120, 'dragon' => -30, } # base_power に対するパーセンテージ。 存在しない属性は±0
 }
}
みたいな感じはどうでしょ?
参照は $SPAttack{'00001'}->{'name'} で出来る。
敵のパラメータにどんな属性が弱いのかを持たせておけばいいのかなと。
my $monsters = {
 '00001' => {
  'name' => 'スライム',
  'def' => 10,
  'str' => 5,
  'attribute' => 'slime',
  'weak' => ['ice, 'fire'],
  'strong' => ['poison']
 }
};
などなど
とにかく、技名とか武器とか敵とかにはそれぞれで重複しない固有の ID を割り振るのが鉄則かと。 (属性も ID 振っても良いのかなとは思う)

924 :nobodyさん:2010/05/22(土) 20:17:02 ID:???
'weak' => ['ice, 'fire'],

'weak' => {'ice' => 1, 'fire' => 1},
にした方がいいのかな


925 :921:2010/05/23(日) 12:29:26 ID:IxcMBDCu
レスありがとうございます。

IDを振るっていうのがよくわからなかったんですけども
とりあえず技の特定の属性に対してのダメージ増減とモンスターの属性設定だけしてやってみました。
やっぱ文字設定よりこっちのほうが便利ですね。最初は大変ですが。

926 :nobodyさん:2010/05/24(月) 14:15:12 ID:???
IDで判断しないと、
「今のはメラゾーマではない・・・メラだ・・・」
って演出が出来ない。
 id, name, power
 101, メラ, 10
 103, メラゾーマ, 180
 104, メラ, 200 #魔王専用
ってやるのがデータを扱う定石。

927 :nobodyさん:2010/05/25(火) 12:37:02 ID:???
こうすると、ファイル名に空白があると失敗します。
空白有りにも対応するには、どうすれば良いでしょうか。

system "soft.exe $file";

928 :nobodyさん:2010/05/25(火) 13:33:10 ID:???
system 'soft.exe', $file;

929 :nobodyさん:2010/05/25(火) 14:20:58 ID:???
すみません、soft.exeに$fileを渡したいのです。

930 :nobodyさん:2010/05/25(火) 15:35:08 ID:???
それPerlの話じゃなくてOSの話では

Windowsなら system "soft.exe \"$file\""; か system qq(soft.exe "$file");  でどうか
他のOSは知らん

931 :nobodyさん:2010/05/25(火) 17:07:23 ID:???
>>930
"を二重に囲うような方法が分からなくて。
教えて頂いた方法でエラーなく動作しました。
ありがとうございました。

932 :nobodyさん:2010/05/25(火) 19:44:20 ID:???
みんな qq()は使わないのけ?

933 :nobodyさん:2010/05/25(火) 20:40:06 ID:???
たまに使うけどあんまり使わねえな
エスケープすることが多い

934 :nobodyさん:2010/05/25(火) 20:46:05 ID:???
,でつないだほうが早いよと聞いてからそうしてて、それが癖になってる
print 'Hello, ', $name, " san!\n"; とかw

>>931
なるほどエスケープの方法が訊きたかったわけね

935 :nobodyさん:2010/05/25(火) 22:22:42 ID:???
qq//はwindowsのコマンドプロンプトでワンライナーやるときぐらいしか使わないなあ
qw//とかqr//は普通に使うんだけど

936 :nobodyさん:2010/05/26(水) 01:36:17 ID:???
> ,でつないだほうが早いよと聞いて
なにー、マジで? ちょっと今度ベンチとって見よう。

いや、最近php絡みの案件でHTMLやJavascriptを出力する時なんか、
 ' と " が多重に出現するのでヒアドキュメントとかを使うんだが、
そんな時Perlのqq() が使えればなー、ってよく思う。

937 :nobodyさん:2010/05/26(水) 13:16:36 ID:???
直感的には、.でつなぐほうが速そうではあるけど
読みづらくなるからなぁ

>いや、最近php絡みの案件でHTMLやJavascriptを出力する時なんか、

うちの場合JavaScriptやcssは全部外部に置いてるから打ち出すのはイベントで関数を呼ぶ部分ぐらい
HTMLはヒアかSmarty


938 :nobodyさん:2010/05/26(水) 18:52:28 ID:???
. だと結合した文字列を一旦メモリに格納しなきゃいけないから、
リストを頭から出力していくだけの , 区切りに比べて遅いんじゃないの?
どっちにしても相当長い文字列で何千万、何億回とか回してみてやっと差が出るぐらいだろうけど

939 :nobodyさん:2010/05/26(水) 21:09:03 ID:???
my $results = timethese(10000000, {
  'comma1' => sub { print 'πは ', $num, ' だもにゅ', "\r" },
  'comma2' => sub { print "πは ", $num, " だもにゅ\r" },
  'dot1' => sub { print 'πは ' . $num . ' だもにゅ' . "\r" },
  'dot2' => sub { print "πは " . $num . " だもにゅ\r" },
  'merge' => sub { print "πは $num だもにゅ\r" },
  }, 'none',);
cmpthese($results);

print;
           Rate   dot1   dot2 comma2  merge comma1
dot1   323719/s     --    -4%    -6%    -7%   -11%
dot2   337029/s     4%     --    -2%    -3%    -7%
comma2 342618/s     6%     2%     --    -2%    -5%
merge  348578/s     8%     3%     2%     --    -4%
comma1 362188/s    12%     7%     6%     4%     --


940 :nobodyさん:2010/05/26(水) 21:09:16 ID:???
sprintf('πは ', $num, ' だもにゅ', "\r"); の様に sprintf() に置き換えた場合
            Rate   dot1  merge   dot2 comma1 comma2
dot1   1488538/s     --   -13%   -15%   -46%   -51%
merge  1720578/s    16%     --    -1%   -38%   -44%
dot2   1743679/s    17%     1%     --   -37%   -43%
comma1 2770851/s    86%    61%    59%     --   -10%
comma2 3061849/s   106%    78%    76%    11%     --



941 :nobodyさん:2010/05/26(水) 21:20:16 ID:???
IO のコストに比べれば print の出力の仕方によるコストなんか微々たる物
ってことかな?

ってことで sprintf でメモリ内の処理でベンチ
(そもそも sprintf の使い方を間違えてけどwww)

" " で囲むより ' ' で囲ったほうが高速
変数展開を無視する分、それだ早い?

カンマで区切った方が遅いのは、カンマで区切る分だけ print が発生してるのでは? と思った

ちなみに perl 5.10 で計測しました

使用されたメモリ含めてのベンチって取れないのかしら?

942 :nobodyさん:2010/05/26(水) 21:37:06 ID:???
Memchmark?

943 :nobodyさん:2010/05/26(水) 22:23:39 ID:???
>>938
ぶっちゃけ、環境依存。俺の環境だと以下。
% cat hoge.pl
use Getopt::Long ;
use Benchmark qw( timethese cmpthese ) ;
GetOptions( 'c=i' => \my $cnt ) ;
die if ! $cnt ;
my @arr = (q{a} x $cnt ) x 10 ;
cmpthese timethese ( undef, {
'concat' => sub {
print STDERR $arr[0] . $arr[1] . $arr[2] . $arr[3] . $arr[4] . $arr[5] . $arr[6] . $arr[7] . $arr[8] . $arr[9] . qq{\n} ;
},
'list' => sub {
print STDERR $arr[0] , $arr[1] , $arr[2] , $arr[3] , $arr[4] , $arr[5] , $arr[6] , $arr[7] , $arr[8] , $arr[9] , qq{\n} ;
},
'quote' => sub {
print STDERR qq{$arr[0]$arr[1]$arr[2]$arr[3]$arr[4]$arr[5]$arr[6]$arr[7]$arr[8]$arr[9]\n};
},
});
% perl hoge.pl -c 10 2> /dev/null
(略)
list 67414/s -- -83% -83%
concat 385602/s 472% -- -1%
quote 389251/s 477% 1% --
% perl hoge.pl -c 1000000 2> /dev/null
(略)
concat 95.0/s -- -0% -50%
quote 95.3/s 0% -- -50%
list 189/s 99% 98% --

944 :nobodyさん:2010/05/26(水) 22:24:37 ID:???
ああ、先にベンチしてる人がいた。
失礼。

945 :nobodyさん:2010/05/26(水) 22:49:18 ID:???
こんなんもある。
http://d.hatena.ne.jp/dayflower/20060603/1149311938
これのサンプルちょっといじったけど、
test_1_の方は、シングルクォート最強他は糞状態。
test_2_の方は、qrだけアウト。クォート有/無、シングル/ダブル、qqでほぼ一緒。
リテラルでの比較は危険ってことか?とにかくシングルクォートが一番安定かも。

946 :945:2010/05/26(水) 23:02:10 ID:???
リテラルとか関係なかったわ。
とにかく上記test_1_は、シングルクォート以外糞遅い。

環境:XP home SP3, ActivePerl-v5.10.1 built for MSWin32-x86-multi-thread

947 :nobodyさん:2010/05/27(木) 12:45:24 ID:4E5NJ/2P

よろしくお願いします。
Windows2000 + ActivePerl です。

CPANで初めてモジュールをインストールしました。

cpan> install Net::Twitter したところ、

各種ファイルが  C:\Perl\cpan\build  以下に配置され、
Net::Twitter は  C:\Perl\cpan\build\Net-Twitter-3.13003-Pu89O8\lib\Net\Twitter

にインストールされました。

当然、そのままでは

Can't locate Net/Twitter.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib
. C:\Perl\cpan\build) at test.cgi line 48.

と怒られてしまい、使えません。

普通に@INC 以下のディレクトリに配置されると思っていたのですが、
インストール時に何か指定を間違えましたでしょうか?

また、この後どうしたらよいか教えていただけると助かります。



948 :nobodyさん:2010/05/27(木) 17:00:17 ID:???
正しく入ってるかperldoc Net::Twitterで確認して、cpanからi /Net::Twitter/で確認。
入ってなかったら、ppm install Net::Twitterでppmからインストール。
いじょ。

949 :947:2010/05/27(木) 17:56:53 ID:rbfUMQUI
ありがとうございましたー できました^^ 感謝感謝

950 :nobodyさん:2010/05/31(月) 13:14:59 ID:jC7AE+TD
ActivePerl で GD::Graphを使ってグラフ書こうと思ってるのですが、
ドキュメント通り

my $graph = GD::Graph::chart->new(400, 300);

と書くと、

Can't locate object method "new" via package "GD::Graph::chart" (perhaps you for
got to load "GD::Graph::chart"?) at test.cgi line 42.

と怒られます。

GD::Graph::chartは確かに入って無さそうなのでinstallしようとして
ppmとCPANで調べると、 GD::Graph::chartそのものがなさそうなのですが

どうしたら良いでしょう。

use Chart; の方がいいんでしょうか。

951 :nobodyさん:2010/05/31(月) 13:28:06 ID:???
>>950
chart is bars, hbars, lines, points, linespoints, mixed or pie

952 :nobodyさん:2010/05/31(月) 16:08:22 ID:???
>>951
「linesとかbarsとかのチャート機能をnewして・・・」ってつもりで書いてあるんだなw
紛らわしいドキュメントだ

>>950
こういうときは「Perl モジュール名」で検索して、ひとまず動作する実例を探すって手もあるよ
2004年の記事だけどここなんかどうかな

GD::Graphを使ったPerlグラフ生成 - SourceForge.JP Magazine : オープンソースの話題満載
ttp://sourceforge.jp/magazine/04/04/15/0110216

953 :950:2010/05/31(月) 16:28:31 ID:jC7AE+TD

>>951さん
>>952さん

ありがとうございました。
できました^O^

954 :951:2010/05/31(月) 16:49:18 ID:???
>>952
うむ。

# CHART is bars, hbars, lines, points, linespoints, mixed or pie.
my $graph = GD::Graph::CHART->new(400, 300);

こう書いてくれたら、だいぶ分かりやすくなるのになぁ。

955 :nobodyさん:2010/05/31(月) 17:08:15 ID:GblyjBgz
在日朝鮮人の生活保護の実態 〜働かず年600万円で優雅な生活〜

在日の40%の生活保護者所帯への援助は年間平均一所帯600万円。
年計2兆3千億円が「在日朝鮮人の生活保護費」になっている。

≪都市部の30代母親と小学生子供2人の生活保護費の内訳≫

生活費として月に『15万円』
母子家庭なら母子加算と呼ばれる追加支給が月に『2万3千円』
教育費として給食費・教材費など『7千円』
住宅費は上限が決まっているが『5万円』全額支給される。
これだけで合計月に『23万円』 

国民年金全額免除。上下水道基本料金免除。NHK受信料全額免除。
医療費は保険診療内なら全額免除。通院費も認められれば全額支給。
都営交通無料乗車券。JRの定期券割引。

年金は支払い免除のうえ“掛け金無しで”年金受給が可能である。
他にも名目を変え様々な給付や免除がある。

民潭の統計では在日朝鮮人約64万人中、約46万人が『無職』という。
つまり4分の3が無職である。 在日は「特権は存在しない」というが、
民潭が自ら「46万人が無職」と公言しているのである。
無職がどのように飯を食っているか考えればそんな嘘は通じない。

http://www.koreanantijapan.comze.com/index.html


956 :950:2010/06/01(火) 15:43:22 ID:0JV8JwVp

引き続き申し訳ないのですが、ActivePerl GD::Graphで質問です。

GD::Graphの文字がデフォルトの文字がカクカクで読みにくいので

use GD::Text;
GD::Text->font_path('C:/WINNT/Fonts');
$graph->set_title_font('arial.ttl','40');

など、arial.ttfをカレントディレクトリに移動したり色々変更してやってみてるのですが、
文字に全く変化ありません。

アドバイスいただけると助かります。m(_)m

957 :nobodyさん:2010/06/01(火) 19:50:00 ID:???
ファイル名ぐらい見直そうぜよ

958 :950:2010/06/02(水) 13:52:42 ID:VCaPMnRA
失礼しました。
$graph->set_title_font('arial.ttf,'40');
修正して、以前状況かわりませんが、
自分でももう少し頑張ってみています。

959 :nobodyさん:2010/06/02(水) 15:11:11 ID:???
>>958
志村、シングルクォート!

960 :950:2010/06/02(水) 15:21:58 ID:VCaPMnRA
>>959さん
途中で気が付き直しました。スミマセン。

フォントをカレントディレクトリに移して
GD::Text->font_path('./');
$graph->set_title_font('ARIAL' , 16)
$graph->set_title_font('ARIAL.TTF' , 16)

や、
$graph->set_title_font('C:\WINNT\Fonts\ARIAL.TTF' , 16);
も試したのですが、上手く行かないので

$graph->set_title_font(gdGiantFont);

としたら、フォントは見づらいのですが文字が大きくなって若干マシになりました orz


961 :nobodyさん:2010/06/02(水) 21:25:05 ID:???
$graph->set_title_font(略) or die $graph->error; してみれば
libgd was not built with FreeType font support と出るんじゃないの

962 :nobodyさん:2010/06/02(水) 22:32:28 ID:???
undef $ENV{HTTP_USER_AGENT};

このような使い方はできるのでしょうか。
どうか教えてください。

963 :nobodyさん:2010/06/02(水) 22:54:03 ID:???
>>962
http://perldoc.perl.org/functions/undef.html

964 :nobodyさん:2010/06/02(水) 23:39:55 ID:???
>>963
えーと、使えるという認識で宜しいでしょうか。
すみません。。

965 :nobodyさん:2010/06/02(水) 23:54:43 ID:???
必要なのはundefの意味じゃなくて環境変数の意味だな。

966 :nobodyさん:2010/06/03(木) 09:40:00 ID:???
LWPかなんかのUserAgentを隠蔽したいと予想してみる

967 :nobodyさん:2010/06/03(木) 16:49:28 ID:???
杜甫々さんの全文検索WwwSearchを改造しようとしています。
http://www.tohoho-web.com/soft/wsrch.htm
英数字の全角半角を同一視する素人発想のルーチンを入れると極端に遅くなってしまいます。

★まず、入力フォームのルーチン内で、キーワード$wordに英数字が含まれているかどうか、
(ここを通る前に、入力されたキーワードの全角英数字は半角英数字に変換済です。)
if ($word =~ /[0-9A-Za-z]/) {
$wordeisu = 1; #英数字あり(検索時に全角→半角に統一)
} else {
$wordeisu = 0; #英数字なし(検索時の全角→半角をせず、スピードアップ)
}

★そして、検索ルーチン内で以下の処理を追加...  $lineは、全文を一行づづ取り出したものです。
if ( $wordeisu eq "1") { #検索語に英数字が含まれる場合、すべて半角英数字に統一
&jcode'tr(\$line,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0-9A-Za-z');
         #ここはeucではないので、&jcode'tr(\$line,'0-9A-Za-z', '0-9A-Za-z');だと上手くいきません。
}

これで、入力された$wordも全文の一行$lineも半角英数字に統一され、
検索結果としては正しく出来るのですが、時間が10倍以上かかってしまいます。
(もちろん、この改造をしても英数字を含まない場合は時間がかかりません。)
なにか良い方法がありますでしょうか?

968 :nobodyさん:2010/06/03(木) 17:30:16 ID:???
jcode.plとかいつの時代だよ。今のperlならutf8文字列にすれば
日本語でもtrできるから書きなおすのお勧め。

969 :nobodyさん:2010/06/03(木) 17:43:34 ID:???
gethostbyaddr関数が使用できないレンタルサーバを使ってるんですが
この関数を使う以外にIPアドレスからホスト名を取得する方法ってありませんか

970 :nobodyさん:2010/06/03(木) 17:46:44 ID:???
無い

それを防ぐ理由は名前を引くコストを削減したいから。


IP からホスト名を返す仕組みを他に用意するか、自分でゴリゴリ書くか。

971 :nobodyさん:2010/06/03(木) 17:54:09 ID:???
うんその方法がちょっと分からなかったんですが、
↑の関数が使えなくてもWHOIS?とかいうのを使えばどうにかなるのかな?

972 :nobodyさん:2010/06/03(木) 18:20:16 ID:???
dns引けばいんじゃね

973 :nobodyさん:2010/06/03(木) 19:10:30 ID:???
DNS への問い合わせの仕方を学べば良いかと

ただ、タイムアウトが厳しいサーバーだとやらないほうがいいのでは?
とは思う


ログの活用なら、ローカルに落として活用するとかとか

974 :nobodyさん:2010/06/03(木) 19:43:21 ID:???
Net::DNS もないのかな。

975 :nobodyさん:2010/06/03(木) 21:38:54 ID:???
nslookupも入ってないのかな

976 :nobodyさん:2010/06/03(木) 22:24:04 ID:???
ちょっと分からない用語が増えたのでその辺から調べればいいでしょうか
DNS 問い合わせ辺りでぐぐれば分かりますか

977 :nobodyさん:2010/06/03(木) 22:40:53 ID:???
DNS 逆引き
がいいとおもいます。

978 :nobodyさん:2010/06/03(木) 22:46:09 ID:???
というかその用途のためにゴリゴリ書いたことがあるんだけど、書いたところで力尽きたw
なんかUDPも通らないという制限もあったし。

979 :950:2010/06/03(木) 22:57:17 ID:oT6XV7cd
>>961 さん

$graph->set_title_font(略) or die $graph->error; すると、
何もエラー文字吐かずにdie してしまうので
原因が判らなかったんですよね。

Fontが対応していないということでしょうかね。
ちょっと探してみます。
ありがとうございます。

980 :nobodyさん:2010/06/04(金) 09:06:06 ID:???
>>979
フォントが日本語対応じゃないとかいうオチないよな?

981 :921:2010/06/04(金) 18:54:41 ID:jTzgRcFe
また行き詰ってしまったので質問させてください。m(__)m


sub send_item2 {
my($kind, $no) = @_;
$send_id = unpack 'H*', $m{guild};

if (-f "$guilddir/$send_id/depot_g.cgi") {
open my $fh, ">> $guilddir/$send_id/depot_g.cgi";
print $fh "$kind<>$no<>\n";
close $fh;
}
}

長すぎエラーなので続きます。

982 :921:2010/06/04(金) 18:56:26 ID:jTzgRcFe
sub hokan {
my $target = shift;

if ($m{is_full_g}) {
$mes = "$max_depot_g個までしか保管することはできません";
return; }
if ($weas[$m{wea}][1] eq $target) {
$npc_com = "$weas[$m{wea}][1]を倉庫にいれました";
&send_item2($m,1, $m{wea});
$m{wea} = 0; }
elsif ($arms[$m{arm}][1] eq $target) {
$npc_com = "$arms[$m{arm}][1]を倉庫にいれました";
&send_item2($m,2, $m{arm});
$m{arm} = 0; }
elsif ($ites[$m{ite}][1] eq $target) {
$npc_com = "$items[$m{ite}][1]を倉庫にいれました\n";
&send_item2(3, $m{ite});
$m{ite} = 0; }
if ($npc_com) {
&get_depot_cg;
return; }
$mes = qq|どれを倉庫にいれますか?<br />|;
$mes .= qq|<span onclick="text_set('@ほかん>$weas[$m{wea}][1] ')">$weas[$m{wea}][1]</span> / | if $m{wea};
$mes .= qq|<span onclick="text_set('@ほかん>$arms[$m{arm}][1] ')">$arms[$m{arm}][1]</span> / | if $m{arm};
$mes .= qq|<span onclick="text_set('@ほかん>$ites[$m{ite}][1] ')">$ites[$m{ite}][1]</span> / | if $m{ite};
$act_time = 0;
}

983 :921:2010/06/04(金) 18:57:38 ID:jTzgRcFe
今回もゲーム製作(というか改造)です。
$kindはアイテムの種類(武器か防具か道具か)、$noはアイテムのナンバーです。$mは自分(プレイヤー)
アイテムを倉庫にいれるスクリプトを作ってみたのですが
どうもうまくいきません。
文法上のミスはないのですが暗転エラーが起きます。
$max_depot_gとか&get_depot_cgとかはこれより前に指定しています。
エラーの具合からsub send_item2で何か呼び出せないのかなと思い
いろいろ書き方も変えてみたのですけどもやっぱりエラーが起きます。
どこをどういう風に変えたほうがいいのでしょうか?

説明下手ですみません

984 :976:2010/06/04(金) 19:10:22 ID:???
http://sugutsukaeru.jp/support/84/
これでサーバを調べてみたんですがNet::DNSモジュールは使えないみたいです
逆引きについては諦めた方がいいんでしょうか

985 :nobodyさん:2010/06/04(金) 19:31:58 ID:???
>>983
>&send_item2(3, $m{ite});

とりあえず、斜め見ただけでもここは
&send_item2($m, 3, $m{ite});
じゃねーのか?

それにしても、すっげー、気持ち悪いコード。
元コードがそれなら、悪癖が付くだけだから今すぐ止めるのをお勧めする。
勉強の為なら、1から rewrite すれば良いかも知れん。


986 :nobodyさん:2010/06/04(金) 20:39:03 ID:???
そもそも
>sub send_item2 {
> my($kind, $no) = @_;
これはどういう事だよ。

987 :nobodyさん:2010/06/04(金) 21:09:36 ID:???
>>985
確か&つけたら、引数が呼び出した関数にも引き継がれるんじゃなかったかな……
まあ可読性が著しく落ちるので安全なコードじゃないと思うが

988 :nobodyさん:2010/06/04(金) 21:16:30 ID:???
あと、use strict;は付けろよ
グローバル変数使いすぎ

989 :nobodyさん:2010/06/04(金) 21:22:36 ID:???
>>987
何でオレにレスするか知らんが。
% perl -le 'sub foo{ print $foo ; } $foo = 42 ; &foo( $foo) '
42
% perl -le 'sub foo{ print $foo ; } my $foo = 42 ; &foo( $foo) '
(何も無し)


990 :nobodyさん:2010/06/04(金) 21:28:33 ID:???
>>989
すまん勘違い
単に&関数名で呼んだ場合だったと思う

991 :nobodyさん:2010/06/04(金) 21:40:17 ID:???
>>990
うろ覚えなら書くなよ。確かめてから書け。
% perl -le 'sub foo{ print $foo ; } my $foo = 42 ; &foo '
(何も無し)

サブルーチンに & を付けて引数省略した時には、その
スコープの「 @_ 」が自動的に引数にセットされる。
% perl -le 'sub foo{ print $_[0] ; } {local @_ = (42) ; foo ; }'
(何も無し)
% perl -le 'sub foo{ print $_[0] ; } {local @_ = (42) ; &foo ; }'
42


結論から言うと %m がグローバル。986氏の突っ込み通り、
引数に与える必要すらない。
俺の985はケースバイケースで、
my($kind, $no) = @_;
に期待される引数がセットされないのを指摘しただけだ。


992 :nobodyさん:2010/06/05(土) 04:54:25 ID:???
>>983
暗転エラーってなんだ?
解析するのはいいことだが、それは大抵自分でがんばるもんだ。
というか、解析、改造したいという欲求でモチベーションを保てないのなら未来はないよ。

993 :nobodyさん:2010/06/05(土) 16:00:29 ID:???
>>983
この場合、$m はリファレンスで渡すか、現状 &send_item2() の第2引数を最初に渡すかしないと、
やりたいことは出来ないのでは?

&send_item2() の第1引数で $m を渡してるのに、第3引数で $m の中身の一部分を送ること自体が無駄。


アイテム名を取り出すところ、アイテムデータを普通の配列で管理するなら、定数を使った方がいいかと思います。
use Readonly;
Readonly my $ITEMNAME => 1;
こんな感じ。
※ 定数は全部大文字で!
[1] とか書いてると、数ヵ月後に保守しようとすると、とてつもなく見づらいかと。

994 :nobodyさん:2010/06/05(土) 18:39:58 ID:k+mTvgx/
perl のリファレンスにぶちあたってる。
なんなんだコレ。全くわからない。
誰か分かり易く解説できる方、

995 :nobodyさん:2010/06/05(土) 20:42:26 ID:???
小難しい使い方は自分も出来ないけど、呼び出した関数で渡した変数を直接変更したり、
配列とか連想配列を関数の引数に渡したいときとかにリファレンスで渡してる。

あと、扱うデータ (スカラにせよ配列にせよ) が大きいときはリファレンスで渡す場合も。

996 :nobodyさん:2010/06/05(土) 21:02:44 ID:1P81rnLs
>>995
うーむ・・・(;´∀`)

997 :nobodyさん:2010/06/05(土) 21:04:55 ID:1P81rnLs
自作ショッピングカートCGIにクレジットカード決済機能をつけようとしているんですが、
まだちょっとPerl CGI 知識が足りないようで勉強しています。
リファレンスのところで壁にあたっています。

上記作業の経験者いませんか?
クレジットカード決済にはepsilonを使用予定です。

998 :nobodyさん:2010/06/05(土) 21:07:53 ID:???
自分の場合は perlreftut や perlref(と SEE ALSO に挙がってるの) に載ってる
説明を読んで、例を実際に動かしたりいろいろ試したりしてるうちになんとなく。
実際に手を動かすのが一番わかりやすいと思うよ。

初めはこんなシンプルなのでも「えっ、こんなことできるの?」って感じだった。

my $aref = ['hoge', ['fuga', 'piyo']];
print $aref->[0], "\n", $aref->[1][1], "\n";

というか、次スレ立ててくる。

999 :921:2010/06/05(土) 21:11:43 ID:???
※消失しているわけではありません。
 理解しようと苦しんでいるところなのでもうちょっと待ってあげてください。
 いや待たなくてもいいけど。

1000 :nobodyさん:2010/06/05(土) 21:12:09 ID:Hs2b1+tP
次スレです
Perlコーディング初心者質問スレ Part 61
http://pc11.2ch.net/test/read.cgi/php/1275739870/

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

327 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)