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:???
- 再現する最小コードさらせや
199 KB
[ 2ちゃんねる 3億PV/日をささえる レンタルサーバー \877/2TB/100Mbps]
取りに行ったけどなかった。次は一時間後に取りに行くです。新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 05.0.7.8 2008/11/13 アクチョン仮面 ★
FOX ★ DSO(Dynamic Shared Object)