Perlコーディング初心者質問スレ Part 60
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
2009/09/03(木) 23:51:12ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/
0002nobodyさん
2009/09/03(木) 23:52:22ID:???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
0003nobodyさん
2009/09/04(金) 05:49:19ID:???0004nobodyさん
2009/09/04(金) 13:17:39ID:???0005nobodyさん
2009/09/04(金) 15:10:46ID:???【Perl,CGI】参考書籍 第四版
http://pc11.2ch.net/test/read.cgi/php/1250989562/
0006nobodyさん
2009/09/10(木) 01:26:11ID: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ファイルを作りたいのです。
下のコードのどこが問題なのか教えてください。
0007nobodyさん
2009/09/10(木) 01:28:19ID:tlO5UesGuse 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>";
}
続きは次に書きます。
0008nobodyさん
2009/09/10(木) 01:29:56ID:tlO5UesGprint 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";
もう一度次です。長くなって申し訳ないです
0009nobodyさん
2009/09/10(木) 01:32:15ID:tlO5UesGprint 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);
長文申し訳ありませんでした
0010nobodyさん
2009/09/10(木) 02:41:05ID:???今回はエラーとして出んかもしらんが、今後のためにも面倒でも use strict してくれ
それから文字列を比較するときは == じゃなくて eq な
特に空文字かどうかの比較は
$hoge eq '';
$hoge ne '';
みたいに書く癖をつけたほうがいい
0011nobodyさん
2009/09/10(木) 03:07:22ID:???0012nobodyさん
2009/09/10(木) 07:34:56ID:xEU2hsmOありがとうございます。今はちょっとPCを開く時間がないので無理ですが、学校で修正したいと思います。
こんな初歩のミスだとは…
もっと頑張らなきゃいけませんね
本当にありがとうございました。
001312
2009/09/11(金) 00:27:02ID:j5Qgkl9cwhileあたりに何か問題があるみたいなんですが、わからないです。
0014nobodyさん
2009/09/11(金) 00:39:31ID:???今後全てにおいて。
001512
2009/09/11(金) 00:48:46ID: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部分の問題だと思ったのですが、何がおかしいのでしょうか?
001612
2009/09/11(金) 00:50:24ID:j5Qgkl9cです。
0017nobodyさん
2009/09/11(金) 10:04:31ID:???0018nobodyさん
2009/09/11(金) 10:55:18ID:???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ループは実行されていないことになる。
001912
2009/09/12(土) 02:32:58ID:83ZTZfsAそういえば、splitってデミリタがその対象になる文字列内になかったらどうなるんですか?
002012
2009/09/12(土) 02:36:32ID:83ZTZfsAすいません。
パスも、書き込みもあってて、openできてて、コードチェックも問題なく通るのに出来ないんです。
while($ln = <FILE>)
という記述が問題になる可能性はありますか?
002112
2009/09/12(土) 03:10:26ID:83ZTZfsAやっと解決しました。
全部処理は上手くいっていたのですが、openの後ろが>だったために、書くたびに内容を上書きしてしまい、
最後の行の\nだけが書き込まれるという形になっていたみたいです。
助言してくださった皆さん、本当にありがとうございました。
いつか自分ももっと精進して皆様のように初心者に優しく教えられるようになりたいと思います。
0023nobodyさん
2009/09/12(土) 09:20:58ID:???ROM 期間中に死を迎えることになりそうなので、軽減してもらえませんか
0025nobodyさん
2009/09/14(月) 11:59:40ID: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;
}
よろしくお願いします。
0026nobodyさん
2009/09/14(月) 12:28:27ID:???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 オプションが抜けてる気がするけどね
0027nobodyさん
2009/09/14(月) 13:03:07ID:???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;
}
やってみたいことと違うかもしれないけど
0028nobodyさん
2009/09/14(月) 13:58:11ID:???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;
}
0029nobodyさん
2009/09/14(月) 14:27:32ID:t5y5v7j/ありがとうございます。
バックアップいらないから、と思いきや、上書自体-iが必要だったのですね・・・・確認不足でした。
>>26を参考に、上書ができない状態で90分ほど彷徨っていますが、これから>>27-28を試してみます。
お礼ついでに経過報告まで・・・
0030nobodyさん
2009/09/14(月) 14:45:14ID:t5y5v7j/出来ました!
しっかり噛み砕いて、自分の物に致します。
ありがとうございました。
0031nobodyさん
2009/09/14(月) 18:22:59ID:???ワンライナーが本来どう解釈されるかを見るには、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
そのまま必要部分をコピペしたらスクリプトの出来上り。
0032nobodyさん
2009/09/14(月) 20:02:28ID:???php埋め込んで稼働出来るようにならないでつか?
html templateで完成された奴をphpでコーティングしたいんだけど・・
0033nobodyさん
2009/09/15(火) 01:00:11ID:???phpからsystem関数っぽい何かでHTML::Templateで生成された文字列を返すPerlスクリプト動かせばいけんじゃないの?
phpよく知らんけど
つーかそこまでやるなら最後までPerlで組めよって思う
0034nobodyさん
2009/09/15(火) 12:51:30ID:???application/x-httpd-php返せばphpがパースしてくれないかな?
text/x-server-parsed-html返すとSSI動くからいけそうな気がする。
0035nobodyさん
2009/09/15(火) 18:36:40ID:???httpdの設定によるが、普通.phpファイルをパースするようになってるんじゃないか?
print $headers;
open(FH, '| /usr/bin/php');
print FH $php_code;
とかでいーじゃん。結果が欲しいならopen3で。
PHP::Interpreter
つー手もあるぞ。
0036nobodyさん
2009/09/15(火) 18:55:27ID:???AddType application/x-httpd-php .php
ってして拡張子.phpのコンテントタイプはapplication/x-httpd-phpだよ
って設定してるからで
実際モジュールはコンテントタイプみてパースするか無視するか決めてる
0037nobodyさん
2009/09/15(火) 19:21:35ID:???だからそれはサーバーアプリケーション依存だろ?
断言すんな断言を。世の中全部Apacheとか思ってそうだな。
最近はスケールとかの問題で事情が変わりつつあるぞ。
0038nobodyさん
2009/09/15(火) 22:21:14ID:???0039nobodyさん
2009/09/15(火) 22:46:47ID:???皆様助言ありがとうございます。
application/x-httpd-php を付加してやっても駄目でした。
ソースをみるとそのままコードが出てました。
PHP::Interpreter 試してみます。
0040nobodyさん
2009/09/15(火) 23:34:35ID:???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番目の訪問者です。」と表示されてしまいます。 どうすればいいでしょうか?
0041nobodyさん
2009/09/16(水) 00:43:06ID:???Ctrl+F5(俗に言うスーパーリロード)でも駄目なら
書き込み部分を
open(OUT, ">./_count.dat");
に変更して _count.dat がどこに作られるか確認したらどうかな。
0042nobodyさん
2009/09/16(水) 00:59:33ID:???読んでなくても「1番目の訪問者です」になるけどね。
004340
2009/09/16(水) 01:00:39ID:???レスありがとうございます
open(OUT, ">./_count.dat");
に変更してみて、実行した後、検索をかけてファイルを探したりしましたが見つけることができませんでした。
もしファイルが無かったら新しく生成されるべきなんですよね?
あと参考書がwindows版apacheを使っているのですが、そのせいでしょうか?
ちなみに読み取り専用のチェックははずしてあります。
0045nobodyさん
2009/09/16(水) 04:28:29ID:???CGI置いてるってーことは所有者はあなただよね?
CGIスクリプトは別の所有者で実行されるから、パーミッションの
可能性が高いね。生成されるはずのディレクトリに移動して
chmod . 777
してみ。マニュアルみてこのコマンドが何するものか理解してな。
普通はセキュリティとか考えて別のディレクトリ掘る性質のものだから。
0046nobodyさん
2009/09/16(水) 04:29:36ID:???chmod count.dat 666
だな。こっちの方が安全だし。
004740
2009/09/16(水) 04:37:30ID:???書き忘れました。自分もwindows版apacheを使っています。
0048nobodyさん
2009/09/16(水) 04:58:27ID:???だったら単に"count.dat"か".\count.dat"じゃないの?知らんけど。Perlが面倒みてくれるのかな。
それにWindowsのパーミッションがどうなってるのか知らんけどその辺くさい。
0049nobodyさん
2009/09/16(水) 05:16:30ID:???Apacheやlighttpdで試したが動くサーバーなんてなかったぞ。
知ったか君乙。つか迷惑だからレスすんな。
005140
2009/09/16(水) 10:42:38ID:???コマンドプロンプトだと動きました。
各種ブラウザ(Opera, Firefox, Google Chrome, IE)で試したんですがだめでした。
何ででしょうか?
0052nobodyさん
2009/09/16(水) 11:56:01ID:???複数のプロセスが一度にアクセスして、ファイルが壊れてるとかなら考えられるけど。
まー、情報が少なすぎて、分からん。
0053nobodyさん
2009/09/16(水) 12:03:46ID:???ランダムに変わる長さの文字列を表示させるようにしてみるか
IE なら CTRL+リロード、Firefox なら Shift+リロードしてみて
005440
2009/09/16(水) 12:36:56ID:???ランダムのヤツはもうやってあって、ちゃんとランダムに毎回変わりました。
windowsでactiveperl+apacheなんですが
activeperlとapacheはCDから本と同じバージョンだし、
httpd.confもCDからまんまコピーだし
もう何がなんだか
0055nobodyさん
2009/09/16(水) 12:54:14ID:???こうやって、ちゃんとファイルを開けてるかみるとか
0056nobodyさん
2009/09/16(水) 13:02:45ID:???複数提案があったら出来る限り全部試せよ
005740
2009/09/16(水) 13:02:53ID:???読み込みとして開くのはできてるようなんですけど
書き込みのときうまくいっていないようです
なぜかというとcount.datの中身を
11
にしとくと
ファイルを開いて値を読み込む
↓
インクリメント
↓
「あなたは……11番目の訪問者です。」
と表示されるからです。
ホント、なんででしょう。
0059nobodyさん
2009/09/16(水) 13:08:15ID:???もうなんの情報もなしにこれでは辛い
006040
2009/09/16(水) 13:12:53ID:???apacheのerror.logのでいいんでしょうか?それともほかのperlとかのログでしょうか?
ごめんなさい 知識が少ないもので、わからないんです。
0061nobodyさん
2009/09/16(水) 13:16:05ID:???0062nobodyさん
2009/09/16(水) 13:19:59ID:???[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は引っかかりませんでした。
アンチウイルスソフトは止めてあるし、再起動は何度もしました。
0063nobodyさん
2009/09/16(水) 13:24:08ID:???use warnings;
use strict;
を2行目に追記してみて
006440
2009/09/16(水) 13:26:06ID:???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.
0065nobodyさん
2009/09/16(水) 13:34:24ID:???006640
2009/09/16(水) 13:39:00ID:???0067nobodyさん
2009/09/16(水) 13:42:03ID:???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";
}
006840
2009/09/16(水) 14:07:10ID:???は
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\
次に続く
0069nobodyさん
2009/09/16(水) 14:07:53ID:???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
でした。
0070nobodyさん
2009/09/16(水) 15:10:05ID:???やっぱり出力ファイルがopen出来てないな。
しかしそれが何故かというと、他のアプリにファイルハンドルを独占されているか、
書き込み禁止属性になっているとしか考えられないんだが。うーん・・・。
環境変数には問題は見当たらないね。
0071nobodyさん
2009/09/16(水) 15:26:41ID:???ファイルが書込み禁止になっているわけじゃないんだよな。
あとはApacheの設定くらいか。
0072nobodyさん
2009/09/16(水) 15:29:08ID:???open(OUT, ">./count.dat") or die $!;
としてみて、失敗した原因を捕捉するのは鉄則。
openは失敗しても致命的エラーにならない(そのまま処理が進んでしまう)。
CD-ROMのファイルをコピーして使っているなら、read-only属性が付いているとしか考えられん。
読めもしないならパスの問題もあったかも知れんが。
0073nobodyさん
2009/09/16(水) 21:51:49ID:???attrib -s -h -r count.dat
ってやって、データファイルの属性変更してみて
007440
2009/09/16(水) 22:47:43ID:???apache2.0系の最新版を入れたら直りました。
いろいろとご迷惑をおかけし、またたくさんの返答ありがとうございました。
0075nobodyさん
2009/09/16(水) 22:57:57ID:???真相は闇の中だが
0076nobodyさん
2009/09/18(金) 13:08:12ID:???もし一時ファイルに保存されているなら、その場所の調べ方と変更の仕方って提供されてるんでしょうか?
10分ぐらいググってみたけど見つかりませんでした
0080nobodyさん
2009/09/19(土) 13:40:04ID:???arr = [0, 1, 2, 3, 4]
p arr[2..-1] #=> [2, 3, 4]
0081nobodyさん
2009/09/19(土) 14:16:15ID:weAFKNKDttp://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
0082nobodyさん
2009/09/19(土) 14:40:29ID:???http://0xcc.net/blog/archives/000043.html
0083nobodyさん
2009/09/19(土) 14:47:11ID:???> 解凍した中身に「Makefile.PL」がありません。
「Linux版」の意味が不明だが、いずれにせよ、Makefile.PLはある。
また後ろに続く[LIBS='-L/where/to/find/libsuggest.a -lsuggest']もよく意味が分かりません。
"/where/to/find/"をlibsuggest.aをインストールしたディレクトリに置き換える。
0085nobodyさん
2009/09/19(土) 16:52:19ID:???my @arr = (0, 1, 2, 3, 4);
print @arr[2..$#arr];
または
my $arr = [0, 1, 2, 3, 4];
print @{$arr}[2..$#{$arr}];
008881
2009/09/19(土) 17:32:49ID:02Qx22rDレスありがとうございます。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」は、通常何処にあるのでしょうか?よろしくお願いします。
0089nobodyさん
2009/09/19(土) 20:01:27ID:???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']
こーだろ。
0090nobodyさん
2009/09/20(日) 09:40:10ID:WC9uameU現在、初心者ながら、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回程…)
〜長文のため、私のソースは↓に書きます〜
009290
2009/09/20(日) 09:45:53ID:WC9uameUopen (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);
0093nobodyさん
2009/09/20(日) 10:11:43ID:???それ、DBD::CSVでできるから。CSVファイルに対して
SELECT * FROM table WHERE id > 1 ORDER BY id
とかできちゃうから。なんでそんなもの作ってるのか謎すぎる。
0094nobodyさん
2009/09/20(日) 10:36:14ID:???009590
2009/09/20(日) 10:49:27ID:WC9uameU理由があり、DBD::CSVは使えませんでした。
今後はそれも視野に入れ行っていきたいと思いますが、
まずはDBD::CSVを使わない場合での解決を目指しております。
>>94
実行時に修正前データ、修正後データ、書き込みデータの表示を行い
データ内容の確認を行っておりますが、その時点では問題はありません。
(CSVファイルとして書き出され、それをエディタ等で見た場合にデータがおかしくなっております)
上記に加え、確認する方法もご指摘頂けると幸いです。
0096nobodyさん
2009/09/20(日) 11:16:04ID:???>まずはDBD::CSVを使わない場合での解決を目指しております。
間違った判断だな。
理由って大した理由じゃないだろ。言ってみろ。自分でやってみたいとかそんなんだろ。
絶対これ直すよりDBI::CSVの方が早い。
このままじゃ無理。全面書き直し。
コードに定数が入れるな。機能をモジュールに分けろ。Test::Moreでテストを書きまくれ。
0097nobodyさん
2009/09/20(日) 12:09:18ID:???> 絶対これ直すよりDBI::CSVの方が早い。
自分でやることの大切さは早いとか遅いとか関係ない、分かってないな。
0098nobodyさん
2009/09/20(日) 13:11:31ID:???----------------------------------------------------------------------
0099nobodyさん
2009/09/20(日) 13:15:31ID:???一度検討したくらいだから早さが大事なんだろ。
まあ確かに最近の風潮として、大したコードでもないのに
useが10〜20行くらい並んでるの見ると萎えるな。
0100nobodyさん
2009/09/20(日) 13:19:29ID:???挿入しようとしても挿入にはなりません
上書きされるのが正常動作です
意味不明な文字が現れるのは、日本語
2バイトのうち1バイト分が上書き
されてしまうので
0101nobodyさん
2009/09/20(日) 17:35:24ID:???しかし、%FORMが謎。
とりあえず、Text::CSV_XSを使ってみて。
0102nobodyさん
2009/09/20(日) 18:40:24ID:???0103nobodyさん
2009/09/20(日) 23:49:07ID:???ていうか、わざわざ"+<"でopenしているのに書き込む前にcloseしたら意味ないし!
seek FH,0,0;をcloseの直前に書いても無駄だし!
以前のデータを置き換えるなら、書き込むときのopenは">"で開く。さもなくば、closeせず、truncateする。
でないと、書き込んだ@write_dataの各要素のバイト長の合計が、書き込む前の
db.csvのファイルサイズより少ないとき、その差のバイト長だけ、以前のデータの末尾が残る!
不具合ってそのせいじゃないの?
0104nobodyさん
2009/09/21(月) 00:29:33ID:???0105nobodyさん
2009/09/21(月) 00:43:00ID:???モジュールで済ませられるところはモジュールを使うと。
秘密が多すぎて、ダメかも分からんが。
で、釣りなの?
0106nobodyさん
2009/09/21(月) 00:47:23ID:???質問スレでそんなの気にするな。
0107nobodyさん
2009/09/21(月) 16:03:31ID:???以下の様に、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";
0110nobodyさん
2009/09/25(金) 09:36:36ID:wSkBdlIWperl+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;
よろしくお願いします。
0111nobodyさん
2009/09/26(土) 11:16:39ID:???って何なの? &err となっている部分を
$dbh->errstr;
に変更して、エラーの中身をはれ。
> $sth = $dbh->prepare( qq{ SELECT code FROM client WHERE so = "$so" });
プレースホルダ使いな。
SQLインジェクションするよw
0112nobodyさん
2009/09/28(月) 04:42:47ID:???最新版のリファレンス的なものが置いてあるサイトとかブログないかな
0113nobodyさん
2009/09/28(月) 11:00:48ID:???0114nobodyさん
2009/09/28(月) 19:26:50ID:MFzb2dw4メールフォームを作ろうとしています。
form部品の、checkboxとradioとselectは、
textとかtextareaと違って、未選択の場合にキーを送信しないのですが、
これを未選択時にも、値が空のキー送信するようにすることはできますか?
cgi.pmのparam()メソッドでキーと値を受け取っているのですが、
上記が未選択時に受け取れないために、メールフォームの確認画面で、
つじつまが合わなくなってます(配列を使って自動的に生成しているため)。
どうかよろしくお願いします。
0115nobodyさん
2009/09/28(月) 19:51:52ID:???0116nobodyさん
2009/09/28(月) 20:04:40ID:???早速のレスありがとうございます。
キーは分かってるんですが、それを毎回(メールフォームの項目が変わるたびに)Perlに記述していくのは面倒なので、
自動的にできないかと思って、メールフォームを作り直してます。
しかし、未選択のradioとかcheckboxのキーが送信されないという、
思わぬところでつまづいてしまいました。
0117nobodyさん
2009/09/28(月) 20:16:08ID:???0118nobodyさん
2009/09/28(月) 20:42:32ID:???Perlとは直接関係ないけどさ、そうゆう場合はフォームのHTMLで、
全てのradioとかcheckboxにデフォルトの項目作って
checked="checked" とかしとくんじゃないのかな。
ただ、逆の使い方するほうが一般的な気がする。
例えば、必ず入れないといけないcheckやradioをあえて空にしといて、
そこをcheckしないと次のステップに進めないようにするとか、
"規約に同意「する」「しない」"で、「しない」にデフォルトでcheck入れとくとか。
これで、ある程度だけど自動スクリプトやロボットなんかの連投や、
一般ユーザーのボタン連打(いや、ほんとにいるんだって、極たまにだけど)
とかで、不意に高負荷になったりしないで済むし、なによりユーザーに
ちゃんとした入力を促すほうが大事かと思うが・・・。
0119nobodyさん
2009/09/28(月) 20:47:50ID:???どのように設定したらいいのでしょうか? サーバーはlolipopです。
0120114
2009/09/28(月) 20:52:28ID:???>>117
そうかもしれませんね。
>>118
おっしゃられることは分かります。
しかし、デフォルトでcheckedは設定してますが、checkboxやmultipleなselectは、
チェックを外すことができるんです(radioを除く)。
チェックを外すと、キー自体が送信されないので、
(キーをPerlに直接明示しない場合は)Perlでエラーを吐き出すことすらでません(JavaScriptでは可能ですが)。
PerlからメールフォームのHTMLを読み込んで、
nameを上から順に抽出して配列に代入する方法しかないかもしれませんね。
0121114
2009/09/28(月) 21:02:56ID:???HTMLを変えるだけでメールフォームが簡単に作れるものを作りたかったんです。
そのHTML内の項目を読み取って、自動的にエラー画面・確認画面・自動返信メールが生成される感じです。
必須項目とか再入力が必要な項目とかもHTMLのみの変更で完結できるものです。
0122nobodyさん
2009/09/28(月) 21:47:25ID:???普通はデータベースのテーブルからフォームを起こすと思うけど。
0123nobodyさん
2009/09/28(月) 22:09:35ID:Abs+b0wT海外からの書き込みを拒否にしたいです
多分このファイルがアクセスチェックのファイルだと思うのですが…
↓のプログラムで国内のみを通すにはどういじったら良いのでしょうか?
まだまだ勉強中なので指導していただけないでしょうか
よろしくお願いいたします
次レスにプログラムです
0124nobodyさん
2009/09/28(月) 22:11:47ID:???0125nobodyさん
2009/09/28(月) 22:13:49ID:Abs+b0wTttp://www1.axfc.net/uploader/File/so/31637
0126nobodyさん
2009/09/29(火) 00:16:08ID:???スレちの希ガス。
毎回記述が面倒といっても、毎回記述するしかないのでは。
条件設定をするファイルを外部txtデータに書いておくとか。コード本体は変えないで済むように。
HTML::Parserなどを使って、htmlを丸ごと読み込んで、どんな入力項目があるかを解析するプログラムを外部で作ったらいかが。
htmlの中に条件指定をすると、いくらでも改ざんできてしまう。PCに保存してソースを書き替えて送信するとかできる。HTTP_REFERRERで確認しようにもクライアント側でどうとでも名乗れる。
>>119
envelopeアドレスを指定したらよろしい。
sendmailコマンドなら-fアドレス、Net::SMTPなら$smtp->mail(アドレス);
Mail::Sendmailならsendmail(Sender=>アドレス)のキーを渡すとセットされるみたい。
0127nobodyさん
2009/09/29(火) 01:44:13ID:l3KIzeZ6>>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";'
とかで充分じゃね?
渡された値のキーに依存するのは気持ち悪いというのは同意。
0128nobodyさん
2009/09/29(火) 01:47:48ID:???0129nobodyさん
2009/09/29(火) 01:50:43ID:???0130nobodyさん
2009/09/29(火) 02:05:25ID:???perl -ln074e '/(?:input|select|textarea) [^>]*?\s+name=([^ >]+)/i; $_=$1 ;tr/'\''"//d;print if $1' foo.html
0131nobodyさん
2009/09/29(火) 04:08:59ID:???0132nobodyさん
2009/09/29(火) 12:39:33ID:???$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
0133nobodyさん
2009/09/29(火) 19:44:30ID: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)のようにしてから、その後の正規表現をどうすればいいのか分からないんです。
どうかお願いします。
0134nobodyさん
2009/09/29(火) 20:00:59ID:AG6/8zJVwhile ($form =~ /<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/s) {
$value = $q->param($1);
$form =~ s/<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/$value/s;
}
0135nobodyさん
2009/09/29(火) 20:09:10ID:???$hoge =~ s|(<input.*?type=\"text.*?name=\")(.*?)(\".*?/>)|$1.$q->param($2).$3|egs;
- e (Eval) 修飾子 (modifier) を付けると、その中が「式」として解釈されます。
- g (Global) 修飾子 を付けると、何度でもマッチを繰り返します。
0136nobodyさん
2009/09/30(水) 04:32:12ID:???0138nobodyさん
2009/09/30(水) 16:57:25ID:???$qがCGI.pmのオブジェクトだったら、XSS脆弱性に気をつけようってこと。
ただのお節介かも知れないけどさ。
0139nobodyさん
2009/09/30(水) 19:03:47ID:???-環境
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表示出来ないんでしょうか?
0140nobodyさん
2009/09/30(水) 19:11:04ID:???IE のせいにすれば解決すると思ってる?
0141nobodyさん
2009/10/01(木) 04:28:26ID:???0142nobodyさん
2009/10/01(木) 09:22:24ID:???CoLinux立てて環境作れ。サービス&自動起動にしてしまえば遠くにLinuxマシンが
あるのと全く区別がつかん。パフォーマンスもそっちのがずっと高い。
そろそろいい加減にしないと時代に取り残されるぞ。
ちなみに>>139のようなことで騒いでるやつが居たから見てやったら
Content-Type: text/plane
になってた。飛ぶ気か。
0143nobodyさん
2009/10/01(木) 09:50:29ID:???0144nobodyさん
2009/10/01(木) 10:58:18ID:???ダウンロードしようとするのはIEの昔からの挙動だね。
確か512バイト未満はダウンロードするんじゃなかったかな。
リクエストするアドレスの最後にスラッシュをつければ回避できる。
IEは昔から問題を抱えてるブラウザだから、テストに使わない方がいい。
AN HTTPDも昔と変わってなければ問題を抱えてると思う。
設定が面倒だと思うだろうけど、Apache等で信頼性の高い環境を構築した方が
トータルで考えると楽だよ。
0145nobodyさん
2009/10/01(木) 12:25:45ID:???アドレスの最後にスラッシュ付けたら表示されました。
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入れようと思います。
ありがとうございました。
0146nobodyさん
2009/10/01(木) 12:28:42ID:???バグがなかったっけか。あれの亜種かな?
0147nobodyさん
2009/10/01(木) 12:44:02ID:???で解決出来たりねw
0148nobodyさん
2009/10/01(木) 13:14:47ID:???$|=1;
my $str = 'テスト';
print "Content-type: text/plain\n\n";
print $str;
$|=0;
これで使い方合ってますか?
これでもIEのエラーは変わりません。
Firefoxだと問題なく表示されます。
0149nobodyさん
2009/10/01(木) 13:34:45ID:???0150nobodyさん
2009/10/01(木) 16:54:23ID:???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周りがおかしいだけなんでしょうか?
0151nobodyさん
2009/10/01(木) 18:10:20ID:???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に関わると不幸になるから。
0152nobodyさん
2009/10/01(木) 18:27:00ID:???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
0153nobodyさん
2009/10/01(木) 19:30:54ID:???これで普通に表示出来ました。
ちょっとスレ違いになってしまって申し訳ないです。
皆さん、ありがとうございました。
0154nobodyさん
2009/10/02(金) 00:57:54ID:???>>123>>124はここではスレチなのでしょうか?
もしそうなら該当スレを教えていただけますでしょうか…
0155nobodyさん
2009/10/02(金) 01:08:41ID:???0157nobodyさん
2009/10/07(水) 14:00:07ID:???フォルダ内のファイルの、連番が最大のものを別フォルダにコピーしようと思っています。
ファイル名は「@」で各要素が区切られているので、
foreach my $file(@files){
my @fact = split /\@/,$file;
という風にして、連番=$fact[3]が最大のファイルを取得しようとしたのですが、
現在のコードはforeach{ max($fact[3]) }となっているので全く意味を為さず、
どこかで$fact[3]を配列に入れてやらないといけない事までは気付いたのですが、
その書き方がわかりません。
尚、$fact[0]と$fact[1]はキーボードからの入力で絞込み、$fact[2]に入る固有名詞は無視(というか、全て取得対象)でこの辺は上手く動いています。
よろしくお願いします。
0158nobodyさん
2009/10/07(水) 14:33:21ID:???有名なシュワルツ変換を使ってみてはどうでしょうか?
my @sorted_files =
map $_->[0],
sort { $b->[1] <=> $a->[1] }
map [$_, (split /@/, $_)[3]], @files;
my $target_file = $sorted_files[0];
0159nobodyさん
2009/10/07(水) 14:48:08ID:???別解
my $max=0;my $max_file;
foreach my $file(@files){
$file=~/\@(\d+)$/;
if($1>$max){$max_file=$file;$max=$1;}
}
0161nobodyさん
2009/10/09(金) 20:37:40ID:QHm3Fnkr0162nobodyさん
2009/10/09(金) 21:51:14ID:???0163nobodyさん
2009/10/09(金) 22:59:18ID:???Feed::Findモジュールをついさっきインストールして試しに
http://www.geekpage.jp/programming/perl-network/feed-find.php
のコードをコピペして実行してみたら
[error] [client 127.0.0.1] Premature end of script headers
が…
どなたか原因が思い当たる方いらっしゃいませんか?
0164nobodyさん
2009/10/10(土) 00:05:42ID:???コマンドラインからやってみ。
0165nobodyさん
2009/10/10(土) 07:05:07ID:???こういった URL で、最後のファイルは CGI であったり HTML だったりするなかで
最後のスラッシュ以降の文字列を取得したいのですが、正規表現でどう書けば
いいのでしょう?
どう書いても最初の / から行末にしかマッチするものしか書けず、
Split で対応してるとこです
0167nobodyさん
2009/10/10(土) 11:35:43ID:???/.*\/(.*)/
最長マッチ使って .*/ と書くといちばん最後の / までにマッチするからそれ以降全部を取得すればいい
0169nobodyさん
2009/10/10(土) 12:07:50ID:???Rate >>165 >>166 >>167
>>165 119048/s -- -53% -69%
>>166 253165/s 113% -- -35%
>>167 389105/s 227% 54% --
というわけで、167が偉いという結論になりました。
0170169
2009/10/10(土) 12:09:42ID:???僕も166のように書いてしまいがちです。
へぼコーダーです。
修行が足りない。
0171nobodyさん
2009/10/10(土) 12:12:10ID:???#!/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行が長くてごめんなさい。
0172161
2009/10/10(土) 13:58:31ID:viNfW09Kありがとうござます。
もう1つ聞きたいのですが、全部カタカナである文字列のマッチはどう書くのでしょうか?(文字コード:utf8)
0173nobodyさん
2009/10/10(土) 14:26:26ID:???追試。
#!/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% --
0174nobodyさん
2009/10/10(土) 14:28:02ID:???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% --
0178165
2009/10/10(土) 17:18:28ID:ia/oAbqC>>167
>>176→(訂正っす) m{\z\/(.*)} ですよね?
ありがとうございます。
# 最長でマッチさせたあとに取得
$url =~ /.*\/(.*)/;
# / 以外が続く行末まで
$url =~ m{([^/]+$)};
# 最後に見つかった / より後ろ
# \z 文字列の最後にマッチする。(Perl5.005以降)
$url =~ m{\z\/(.*)};
/.*\/(.*)/ を使わせていただきます。
今思えば、正規表現が今より苦手なころは
「めんどくせーから、行頭から欲しい部分の直前までマッチさせて、その残りをマッチさせて得てた」
と思い出しましたw
個人的には \z もなかなかいい感じなので、\z の存在を覚えていきたいとこ・・・
0180nobodyさん
2009/10/10(土) 18:23:47ID:???ここ↓を見て本人が好きな範囲を選べばいいよね
http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_3000-3FFF
0181nobodyさん
2009/10/10(土) 20:45:28ID:???0182nobodyさん
2009/10/10(土) 21:21:15ID:???0184nobodyさん
2009/10/11(日) 03:03:33ID:SfXKxhooまとめ乙。
勉強になりました。
いまちょっと試せないけど、これはどうかな?
m|/(.*?)$|
ハテナは最短一致の修飾子だから、
たぶん動くと思うんだけど。
0185nobodyさん
2009/10/11(日) 14:51:42ID:???しかし、単純な".*"が最速になるようにチューニングされてるのか、
>>167を超えられない。
文字クラスマンセーだったけど、考え直さないとだめかもダメだね。
0186nobodyさん
2009/10/13(火) 19:54:24ID:???それはそうと、URL末尾に/が来ないことは考えなくていいの?
read.cgi/とかco.jp/とか、サニタイズされてないhoge.html/.././とか。
他にも、用途によるけど、拡張子jpgのGIFでしたとか偽装したのは弾かなくていいの?
0188nobodyさん
2009/10/13(火) 20:22:13ID:???メールアドレスの@の前のピリオドが付いているアドレスは、
正しくありませんとエラーが出るのですが、
正規表現?のエラーだと思うのですが、対処法がわかりません。
ネットで色々調べたのですが、文字列を追加するとか…
$mail_regexの後の文字列のどこに追加すればいいのでしょうか?
初歩的な質問で申し訳ないです。。環境はwindowsXPです。
0189nobodyさん
2009/10/13(火) 20:45:03ID:???0190nobodyさん
2009/10/13(火) 21:40:42ID:???当方、エスパー度かなり高いほうですが、一つだけ質問させてください。
$mail_regexにどのような文字列が代入されているのか教えてください。
0191nobodyさん
2009/10/13(火) 21:44:18ID:pHeszieI$mail_regex = quotemeta($mail_regex);
0193nobodyさん
2009/10/13(火) 22:31:50ID:???これでどうだ?
$mail_regex = 〜〜 . '|^[\w.-]+@(?:[\w-]+\.)+[\w-]+$';
0194nobodyさん
2009/10/13(火) 23:40:03ID:???だからエラーとして弾く処理は正しい。
しかしDoCoMoとauがこの規格外のメールアドレスを正しいものとして扱ってしまっているので話がややこしい。
ぶっちゃけDoCoMoとauは氏ね。
という前提知識が必要な話ですね。
0195nobodyさん
2009/10/14(水) 00:25:09ID:???まあ、今までに取ってるアドレスは有効なんだけどね
0196nobodyさん
2009/10/14(水) 00:29:50ID:???正規の規格はともかく、はじかなくていいピリオドをはじいちゃっているわけで、
$mail_regexに文字列を追加するんじゃなくて、文字列を変更する必要があると思われます。
ので、ここにその$mail_regex後の文字列を書いた方がいい。
0197nobodyさん
2009/10/14(水) 01:29:31ID:???皆様レスありがとうございます。
そうですよね。$mail_regexにどのような文字列が入っているかわからないと
答えようがないですよね…。
いま自宅なので書けないんです。なんせめちゃくちゃ長かったので…
申し訳ないです。
>>193さんが書いている文字列. '|^[\w.-]+@(?:[\w-]+\.)+[\w-]+$';を追加すると解決しますか?
管理システム側でのエラーなので、変更して解決しないと、恐ろしい事になる可能性があるんです 汗
0198nobodyさん
2009/10/14(水) 02:14:04ID:???"foo."@example.net
みたいにダブルクォートすれば解決すると思う。
0199nobodyさん
2009/10/14(水) 09:51:32ID:???文字列を書いたのですが、本文が長すぎて書き込めなかったので、分けて書かせていただきます。
$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]*
0200188
2009/10/14(水) 09:56:21ID:???長すぎてくじけました 汗
かなりのスレ汚しになってしまうので、やめておきます。
ありがとうございました。
0201nobodyさん
2009/10/14(水) 10:44:33ID:???0202nobodyさん
2009/10/14(水) 22:18:23ID:???0203nobodyさん
2009/10/15(木) 18:04:11ID:YQ/YK35Jマジレスするとヶとヵはカタカナじゃない。箇の略字(个・ケ)が回りまわってそうなった。
一箇所→一ヶ所
ヶなのに「カ」と読むので、不思議に思った人が「ヵ」を使い出してそれも普及した。
ヶやヵを使う日本語のカタカナ語って存在しないだろ。
んで、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]
に変更してみ。ものすごいクイックハックだが@の前に\.?を挿入してある。
0204nobodyさん
2009/10/15(木) 18:09:09ID:???あ、最後の行に対応する括弧がないな。まだ続きあるだろそれ。まあ多分>>203で間に合うからいいけど。
さらにInKatakanaの中にはしっかりヶとヵが入ってるんだな。まあ昔からマの間ではカタカナ扱いされてたけど。
0205183
2009/10/15(木) 18:59:55ID:???マジレスすると、unicodeではカタカナ分類なんだ。
30F5 KATAKANA LETTER SMALL KA
30F6 KATAKANA LETTER SMALL KE
http://www.unicode.org/charts/PDF/U30A0.pdf
0206nobodyさん
2009/10/16(金) 18:38:09ID:???0207nobodyさん
2009/10/20(火) 12:41:02ID:???何故ですか?keys関数を使うとちゃんと値が返ってくるので中身がないことはないはずです。
0208nobodyさん
2009/10/20(火) 12:57:20ID:kwSavA/j0210nobodyさん
2009/10/20(火) 20:18:27ID:???0211nobodyさん
2009/10/20(火) 21:38:06ID:kwSavA/j0212nobodyさん
2009/10/20(火) 22:24:14ID:???0213nobodyさん
2009/10/22(木) 06:34:07ID:???できるかどうかが知りたいだけなのですが、質問です
とあるCGIゲームでマクロというものを使うと楽という話を聞き、やってみようと思ったわけです
ですがどうも既存のツール等では上手くいかず、それならプログラムを自作してみようと思い立ったのですが
範囲内の色に反応して数をカウントしていくようにしたいのですが、こういうことは可能なのでしょうか?
0214nobodyさん
2009/10/22(木) 07:51:32ID:???CGIゲームを提供する方なのか、それとも解く方なのか。
後者だとして、「CGIゲーム」といいつつ実はJavaアプレットだったりFlashだったりしそうな予感。
単純にHTMLを対象にどうこうするだけならJavaScriptが最適っぽい気がするが…たぶん関係ないな。
0215nobodyさん
2009/10/22(木) 08:44:03ID:???具体的に何をしたいのかは
画面内から特定の色を検出して、その出現回数をカウントしたあとに結果を表示するものなのですが・・・
特定の色の検出が調べてもわからなかったので質問してみたのですが・・・
0216nobodyさん
2009/10/22(木) 09:06:31ID:???0217nobodyさん
2009/10/22(木) 11:24:40ID:???0218nobodyさん
2009/10/22(木) 16:12:06ID:???その「画面内の特定の色」がどうやって表示されているのかがわからなければ
そもそも解決できるかどうかすら答えようがないんでないかい。
どんなゲームなのか、CGIゲームってんだから具体的にURLを示した方が手っ取り早そうだが。
それ以前に「マクロ」から「Perl」へのつながりがすげえ謎。何故Perl。
0219nobodyさん
2009/10/22(木) 16:52:20ID:???まあ、板違いだわな。
0220nobodyさん
2009/10/22(木) 23:09:23ID:???後は画像解析だからPerlに限った話ではないな
0221nobodyさん
2009/10/23(金) 11:34:54ID: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は正常に取れてます。
0222nobodyさん
2009/10/23(金) 12:35:26ID:fdJYCoLf0223221
2009/10/23(金) 19:33:11ID:Y/3I6hzwなさそうです。googleアドセンスのjavascriptはあるけど・・・
0224221
2009/10/23(金) 20:02:16ID:Y/3I6hzwなぜか出来ました・・・一人でお騒がせしました。
0225nobodyさん
2009/11/08(日) 11:49:33ID:???<!--include virtual="〜">のタグを埋め込んでおき、
index.shtmlに携帯からアクセスしてきた際に
携帯用トップページにジャンプさせるCGIを作成しています。
index.shtmlファイルから(text/html)でヘッダ出力した後に
CGIから、Location:http://〜ヘッダを送信すると
うまくジャンプしません。
知りたいのは、
先にサーバーから出力された*.shtmlのヘッダを中止し、
新たに出力しなおす方法があれば知りたいのですが、
なにか良い方法はありませんでしょうか?
<meta>タグのURL転送での解決方法は一部の携帯キャリアが対応してないため使えません。
何か良い方法があればご教授願います。
0226nobodyさん
2009/11/08(日) 12:31:27ID:???0227nobodyさん
2009/11/08(日) 12:41:39ID:???0228225
2009/11/08(日) 14:26:09ID:???配布されているものでなくて自作で作ってます。
>>227
index.shtmlをやめてindex.cgiを自作にすると
socket関数が使わないといけないことになるため、
面倒なことになるので避けたい感じです
あと、.htaccessでリダイレクトさせる方法も検討しましたが
.htaccessは、MIME設定とBASIC認証のみにしか利用できない
設定になっています
最後に、12万ファイルあるコンテンツなので
鯖の移転もちょっと。。ってな感じです(><)
0229225
2009/11/08(日) 14:52:59ID:???こんな感じです
#!/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;
0230nobodyさん
2009/11/08(日) 15:52:38ID:???> 鯖の移転もちょっと。。ってな感じです(><)
そんな大切なコンテンツの運命を、こんな低俗な掲示板に求めていいのか?
0231225
2009/11/08(日) 21:01:31ID:???そのうち11万8000ファイルはBBSから8年間かけて書き出された
ログファイルなので
そこまで、たいしたコンテンツでもありません。
2ch以外のフォーラム(4ヶ所ほど)でも聞いたのですが、
なかなか解決策が出てこなくて、こちらにも書込みしました。
0232nobodyさん
2009/11/09(月) 09:27:28ID:???そんなことはないのでCGIでやれ。
0233225
2009/11/09(月) 13:23:21ID:???「socket使う」=「面倒」 と書いた理由を述べます
index.shtmlに
�@<!--include virtual="ナントカ.inc"> の記述が4ヶ所
�A<!--include virtual="ナントカ.cgi"> の記述が9ヶ所
�@は参照先がテキストなどので、open関数でクリアできる
�Aを�@の方法でやるとperlソースが流れ込んでくるので、socket関数で対応するか
または、参照先のCGIをテキストファイル書き出しにする。
ってな感じです。(><)
0236nobodyさん
2009/11/09(月) 14:11:03ID:a1ezikgd0237nobodyさん
2009/11/09(月) 15:37:29ID:???なら死ね。
ブラウザ側には実行(待機)中であることを示して、STDOUTを開放する。
その際SIDかPIDか何かから一意なIDを作っておく。
外部プログラムはforkかcronでバックグラウンド動作させる。
外部プログラムの実行状態はAjaxでもしくは普通にcgiで得られるようにする。シグナルを送れば何%処理中か返すように外部プログラムを作っておくと吉。
妄想だけど多分こんなもんだろ。
0238nobodyさん
2009/11/10(火) 06:22:57ID:???ジョブキューを使うか、デーモン化した方がいいと思うけどな。
0239nobodyさん
2009/11/12(木) 21:37:51ID:???0240nobodyさん
2009/11/16(月) 11:02:56ID:D4PXiJWR0241nobodyさん
2009/11/16(月) 20:59:19ID:???http://spicky.net/vipper/uploads/spicky/9/5/8/1859_zeL8gI2.png
http://spicky.net/vipper/image/1859/
0242nobodyさん
2009/11/17(火) 15:14:45ID:???をPerlで書きたいのですが、どう記述したらいいものでしょうか?
0243nobodyさん
2009/11/17(火) 16:15:15ID:???だいたいこんな感じかね?
use CGI;
use LWP::Simple;
my $q = CGI->new;
my $url = $q->param('url');
if (defined $url) {
get($url);
}
0244nobodyさん
2009/11/18(水) 00:14:38ID:???0246nobodyさん
2009/11/18(水) 23:48:59ID:???ソケット通信ができません。
同じプログラムでapatheで動かすとソケット通信できます。
tomcatで何か設定が必要なのでしょうか
0247nobodyさん
2009/11/19(木) 05:28:08ID:ZQXO+cvVアクセスできるディレクトリやパーミッションに制約があるのでは?
匿名ソケットを使ってるなら知らんけど。
0248nobodyさん
2009/11/19(木) 05:31:23ID:ZQXO+cvV> earch(%{$chanko})
訂正しときますね。
each %$chanko
0249nobodyさん
2009/11/19(木) 05:52:42ID:ZQXO+cvVどう見たいかによる。
数十分かかってもライブで表示したいなら、サーバ(アパッチー?)のタイムアウト設定を十分長くする。
途中経過も見たいなら、ダブルフォークかなにかでバックグランドへ落としたあと
NPHかリダイレクトを使って、チェックした状態を表示。
ユーザが自由にアクセスできるようにするなら、確認用IDを発行するか、クッキーを食わせとく。
一番簡単な解決は、実行終了後に結果をメールで送りつけること。
もしくは結果表示用スクリプトのアドレスを送る。
0250nobodyさん
2009/11/19(木) 15:05:03ID:pgc2wImKeval "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]だけ失敗してるいまいち理由がわからないんですが、
どういう状況か見当つきますか?
0251nobodyさん
2009/11/19(木) 15:09:31ID:???何をしてるのかわからん。
0252250
2009/11/19(木) 15:17:07ID:pgc2wImKpackage 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の警告が出る状況です。
違いがわからないのと、メッセージの意味がじゅうぶん理解できなくて・・・
0253250
2009/11/19(木) 16:26:33ID:???細かい違いがいろいろあるみたいです。
例えばモジュールでget_nameというサブルーチンをエクスポートしているとき、
通常のuseですと
my $name = get_name;
でOKですが、evalではエラーになったりするみたいです。
my $name = get_name(); #カッコがないとエラー
質問させてもらった件も、今ひとつつかみどころがない感じなので、
当面は安定を確認しているBEGINブロック内に記述する方法をとることにして、
尚、ドキュメントをあたってみたいと思います。
>>251さん、ありがとうございました。
0254nobodyさん
2009/11/19(木) 16:40:34ID:???[1]とか[2]とか言ってる読み込み側のプログラムもきっちり
さらしてもらわないとわからんな。
BEGINブロックをつかわないでuseをeval "use 〜" に置き換えると
読み込まれるにタイミングが変わるのでuse strictのコンパイル時
チェックに間に合わないというのはよくある話なんだが、全く同じで
片方だけおかしいとかいうことはないはずだしなんか違いがあるん
だろう。
0255nobodyさん
2009/11/20(金) 16:12:32ID:???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形式で受けとりたいのですが
どのように記述したらよいでしょうか?
0258nobodyさん
2009/11/20(金) 18:50:54ID:???フォーム側で
<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"の場合は別の変数になるのでしょうか?
0259nobodyさん
2009/11/20(金) 19:46:05ID:???こうすると、うまくいきます?
print SAVE $tempfile;
↓ ↓
print SAVE <$tempfile>;
0260nobodyさん
2009/11/20(金) 21:19:20ID:???0262258
2009/11/20(金) 21:51:20ID:???調べてみたら、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);
0263nobodyさん
2009/11/23(月) 03:37:20ID:???させるとき、ifとelsifで書いていくのはなんか非効率的
のような。なんか方法あるのでしょうか?
0264nobodyさん
2009/11/23(月) 05:58:26ID:???あと、サンプルでも$a,$bは使わぬが吉
0265nobodyさん
2009/11/23(月) 06:40:31ID:???switchが欲しいってことだろ
Perlのバージョンが5.10以上なら
use feature qw/:5.10/;
given($a){
when(x){…}
when(y){…}
…
}
と書ける
0266nobodyさん
2009/11/23(月) 07:58:49ID:???$a =(条件1) ? 'x'
:(条件2) ? 'y'
: 'z'
;
0267nobodyさん
2009/11/23(月) 09:00:29ID:???長い式になると優先順位がわかりづらくて使いづらい。。。
0268nobodyさん
2009/11/23(月) 09:19:12ID:???5.10未満ならSwitchモジュールを
switch文
http://www2u.biglobe.ne.jp/~MAS/perl/waza/switch.html
0269nobodyさん
2009/11/23(月) 09:35:35ID:XYWla5BPただこれをやると関数への引数は連想配列へのリファレンスにならざるを得ないから、あまりやらないけど・・・
0270nobodyさん
2009/11/23(月) 10:26:54ID:???こんな感じ?
my %func = ( foo => \&foo, bar => \&bar );
$func{foo}(1, 2); #=> 1 2 in foo
sub foo {
print "@_ in foo";
}
sub bar {
print "@_ in bar";
}
>関数への引数は連想配列へのリファレンスにならざるを得ない
これはどういう意味ですか?
0271nobodyさん
2009/11/27(金) 23:39:39ID:???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と定義したりすることはどうすればいいんですか?
0272nobodyさん
2009/11/28(土) 00:15:26ID:???0273nobodyさん
2009/11/28(土) 00:25:39ID:???=== 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
0274nobodyさん
2009/11/28(土) 00:41:49ID:BdimRB/2解説だけでどういう問題化わからん。リンクもないし
0275nobodyさん
2009/11/28(土) 00:46:47ID:???0276nobodyさん
2009/11/28(土) 01:55:55ID:BdimRB/2その問題を解くように変えようとするとなると>>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の前にアルゴリズムも勉強しないといけない気がするな
0277nobodyさん
2009/11/28(土) 02:14:34ID:???0278nobodyさん
2009/11/28(土) 04:02:22ID:BdimRB/20279nobodyさん
2009/11/28(土) 13:14:18ID:???文脈から分かるとはいえ、一見だと$thresholdや$throttleかも?と思うだろ。
0280nobodyさん
2009/11/28(土) 14:37:12ID:???>>275さんの問題の通りこのような入力例が与えられて、出力しないといけないのですが、
my($a, $b, $c, $d, $e, $f)
= (36, 20, 38, 54, 42, 25);
のように自分で打たずに、txtファイルから読み込む方法を教えていただけないでしょうか。
0281nobodyさん
2009/11/28(土) 14:41:24ID:???#一行ずつ$numに代入する。
}
こんな感じかな?
0282nobodyさん
2009/11/28(土) 14:55:14ID:???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になってしまったのですが
0283nobodyさん
2009/11/28(土) 15:30:00ID:???0287nobodyさん
2009/11/28(土) 15:41:19ID:BdimRB/2>>271
初心者スレとはいえ、最低限の文法をググるか本読んだ方がいい
サンプルコードたくさん落ちてるじゃん
ファイルへの書き込みがopen my $wfh, ">", "a.txt"ってのと同じように
読み込みはopen my $rfh, "<", "b.txt"だよ
0288nobodyさん
2009/11/28(土) 15:45:27ID:???open FH, "<hoge.txt";
foreach(my $line = <FH>){ … }
close FH;
入門書読んだ?
0289nobodyさん
2009/11/28(土) 15:47:29ID:???foreach → while
@hoge = <FH>;
でも入力は取れる
0290nobodyさん
2009/11/28(土) 16:18:26ID:???あとレファレンスとか見てもどこに載っているのかわからないので…
0291281
2009/11/28(土) 18:03:02ID:???ファイルハンドルはファイルの名前の事だよ
普通はファイルの入出力のところに載ってると思うけど
0292291
2009/11/28(土) 18:04:34ID:???ファイルハンドルはファイルを識別するための任意の文字列の事だよ
でした
0294nobodyさん
2009/11/28(土) 18:15:00ID:???0295293
2009/11/28(土) 18:16:33ID:???0296nobodyさん
2009/11/28(土) 21:24:20ID:???こういうことではないんですか?
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";
0297296
2009/11/28(土) 21:38:36ID:???追加 -> close FH;
0298296
2009/11/28(土) 22:12:32ID:???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
のような場合はどうやって読み込むのでしょう
0299nobodyさん
2009/11/28(土) 22:25:29ID:???0300296
2009/11/28(土) 22:32:47ID:???いえ、別にそういうわけではありません。
とりあえず、読み込み方は自分には見つからなかったので、教わりたいなと思ったので…
すいません
0301nobodyさん
2009/11/28(土) 22:34:31ID:???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
> のような場合はどうやって読み込むのでしょう
結局何もかも分からないわけですね。
いくら初心者スレとはいっても、少しはわかるようになるまで学習してから取り組んだらいかが。
0302301
2009/11/28(土) 22:42:45ID:???>>298
のコードだと、2つの大学全体の上位3つの合計になってしまうよ。問題の要件を満たしていない。
あと、普通こういうので入力/出力といったら標準入力/標準出力ではないかと思います。
その点でも>>273は満たしてくれている。
0303nobodyさん
2009/11/29(日) 00:50:13ID:???新鮮だなぁ
0304nobodyさん
2009/11/29(日) 01:42:21ID:1LHj/rCz学校で習ってすぐの覚えたてで何か問題解こうとここに聞きにくるのとかポジティブだよねw
最近の書き方だと下のが結構まとまってると思う。
ttp://d.hatena.ne.jp/perlcodesample/20091120/1246679588
あと、標準入力とかダイヤモンド演算子の話はもっと簡単なサンプルコードを書くところから始めた方が理解できると思う
0305nobodyさん
2009/11/29(日) 10:19:40ID:???こういう処理したいんだけど、読んだ本だといまいちわかりません」
というレベルじゃないのか?
文法すら知らないのは初心者ではなく教えてちゃんだ。
0306nobodyさん
2009/11/29(日) 10:40:54ID:???「最近の書き方」じゃねーよ、単なる個人の趣味じゃねえか
悪くは無いが。
で、ここの最近のレスも合せてどうしても突っ込みたくなったから書くが、
× while( my $line = <FH> ){}
◯ while( defined ( my $line = <FH>) ){}
perldoc perlsyn にも書かれてる。
0307nobodyさん
2009/11/29(日) 11:07:16ID:???「リンク先の内容が、リンク先の書いた奴の」って意味ね。
0308296
2009/11/29(日) 11:57:19ID:???で、朝
http://books.yahoo.co.jp/book_detail/AAY78372/
この本を買って今読んでいるのですが、read関数の使い方がよく分かりません
どなたか教えていただけないでしょうか
0309nobodyさん
2009/11/29(日) 12:28:14ID:???0310nobodyさん
2009/11/29(日) 12:30:07ID:???「聞きに来る」時点で全然ポジティブでも何でもないです。
所謂「クレクレ」でしかないです。
例え「車輪の再発明」と云われても自分で調べ、自分で考えてその結果をここに書き連ねてこそポジティブっていうもんです。
世知辛いこの世の中、ただただ「速さ」だけを求められて、こういった「クレクレ君」が憚っているのが現状だと思うと悲しいんだけれどもね。。。
0314nobodyさん
2009/11/29(日) 16:11:18ID:???バイトがなんなのか理解してないの?
ここで聞く前にもっと勉強した方がいいと思うよ
検索すれば出る内容なんだから
0316nobodyさん
2009/11/29(日) 21:02:25ID:???#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]";
}
}
#よろしくおねがいします。
0317nobodyさん
2009/11/29(日) 21:16:37ID:???0318nobodyさん
2009/11/29(日) 21:38:42ID:???input number 1
18
input number 2
32
G.C.D is 18%
0319nobodyさん
2009/11/29(日) 21:48:48ID:aDLivjg20321nobodyさん
2009/11/29(日) 21:55:47ID:???0322nobodyさん
2009/11/29(日) 21:57:26ID:???これはひどい
0323316
2009/11/29(日) 22:02:31ID:???これも引数にしないとだめだったんですか?
$cをメインルーチンに追加して試してみましたがだめでした・・・
>>318
サブルーチンは呼び出せているのですが、ifの中身がうまく処理できずにelseの処理にうつってしまいます
GCDのアルゴリズムは
_[0]と_[1]を割って余りを$cに代入
$cが0でなければ_[1]を_[0]に、$cを_[1]に代入
$cが0になるまでこれを繰り返す
$cが0なら[0]を出力
間違ってましたかね
0325nobodyさん
2009/11/29(日) 22:11:31ID:???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文が割り算の前に出てくるのもおかしいよね
0326nobodyさん
2009/11/29(日) 22:15:22ID:???それ、ユークリッドの互除法になって無いぞ。
$_[0], $_[1] を使い回す方が、 $a, $b を my するよか千倍マシだ。
0327nobodyさん
2009/11/29(日) 22:21:39ID:???あれ?ちがうんだっけ。昔の記憶のまんま書いてみて答えあってたからいいかと思った
つか、普通$_[0]とか使い回すもん?
実際、何の値入ってるかわかんなくなって>>316みたいなコード書く元になるから使い回すなら置き換えた方がいいと思うんだけど。
0328nobodyさん
2009/11/29(日) 22:33:53ID:???される特殊変数だ。
それを他の場所で使うくらいなら、 @_ を使う方がましだと言っている。
my $. = 'hoge' ;
↑これをするのと同じくらい変態行為。
>>325
>if ($b != 0) {
これ常に真だが?
0329nobodyさん
2009/11/29(日) 22:40:51ID:???あぁ、なるほど。$a,$bは特殊変数で使われるんだっけ。
普段$aとか$bは使わないけど>>316のコードをなるべく生かそうと思って失敗したわ。
>>if ($b != 0) {
>これ常に真だが?
最終的に余りゼロになるでしょ?
0330nobodyさん
2009/11/29(日) 22:47:49ID:???ここまで説明しなきゃ解らんのか?
0331326
2009/11/29(日) 22:55:42ID:???0332316
2009/11/29(日) 23:06:02ID:???この程度もわからなかっただなんてしにたい
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]";
}
}
0333nobodyさん
2009/11/29(日) 23:23:23ID:???えっと、そう書くことになるから「$_[0]と$_[1]に何が入るかわからなくなるので、使う初めに置き換えた方がいいよ」って話ね
例えば、今回とは別の例としてそのsubが30行くらいあったとして、君が1週間後にメンテナンスするとするでしょ?
ぱっと一番下のprintを見た時に「あぁ、$_[0]だから引数の一番目の値を出力してるな」とか思っちゃうわけだけど、
その前に入れ替えやってるからそうとは限らない。
そうするとメンテする時に変数の代入をしている所を確認する作業が増えて面倒。
少なくとも「$_[番号]は引数の順番通りに入ってる」って思ってる人は多いから入れ替えとかしない方がいいよ
0334nobodyさん
2009/11/29(日) 23:28:53ID:???use strict;
をスクリプトの2行目に書くのをオススメする
変数のスコープを理解すべし
死ぬのはそれからだ
0335nobodyさん
2009/11/30(月) 00:16:25ID:???0336332
2009/11/30(月) 00:49:26ID:???サブルーチンの外で入れ替える、ということですね。気をつけます。。
>>334
わかりました。
perlは今までやってきたCやJavaと比べて書きやすいのですが、
やっぱりある程度の制約を強要したほうがエラーが起こりにくいということがよくわかりました。
0337nobodyさん
2009/11/30(月) 01:26:09ID:???> サブルーチンの外で入れ替える
まあそれでも動くっちゃあ動くが違うだろ
普通に考えれば関数の先頭で
my($num1, $num2) = @_;
($num1, $num2) = ($num2, $num1) if $num2 > $num1;
などとして、以後$_[X]の代わりに$numXを使うという意味だ
0338nobodyさん
2009/11/30(月) 02:19:08ID:HMASs2oDこのクラスのオブジェクトを使用して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
0339nobodyさん
2009/11/30(月) 03:57:11ID:???0340nobodyさん
2009/11/30(月) 04:00:49ID:???0341nobodyさん
2009/11/30(月) 04:53:13ID:???気持ち悪いならこういう風に書き換えることができたはず
if (my $ref = $self->dbh->can($method_name)) {
return $ref->(@args);
}
0343338
2009/11/30(月) 07:20:28ID:HMASs2oDなるほど!ありがたいヒントをいただきました。
canはメソッドの参照を返しているんですね。こちらは納得です!
自分のケースでは次のコードで結果を得ることができました。
if (my $method_ref = $self->dbh->can($method_name)) {
my $sth = $self->dbh->$method_ref(@args);
return $sth;
}
この際>>338の疑問はなかったことにしようと思いますw
0344nobodyさん
2009/11/30(月) 09:31:48ID:???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;
}
0346nobodyさん
2009/11/30(月) 18:34:17ID:???自由すぎる
0347338
2009/11/30(月) 18:49:13ID:???ありがとうございます。
自分が事前に得ていたのも>>344のようなコードでした。
$AUTOLOADに渡ってきた名前のメソッドを、型グロブを使って現在のパッケージに動的に追加し
そのメソッドに処理を転送、という意味だと思うのですが、
自分もちょっと大げさだなと思って・・・
(ちなみに今、手元にオライリー本を数冊置いてるのですが、いずれも類した手法を紹介してるんです)
しかし「AUTOLOAD呼び出しを減らす」メリットには気がつきませんでした。
以降は新しいメソッドが呼ばれるから逐次AUTOLOADが呼ばれるコストが削減できるということなんですね。
(AUTOLOADはクラス階層を全部探した最後に呼ばれるから高コスト)
自分の場合はCGIなので、アクセスごとにメソッド生成がおこなわれてしまうこともあるのですが、
複数のクエリを発行する状況ではメリットあるかもしれないです。
クラスの使用状況を見ながら適宜判断してみようと思います。
CGIなら普通に、使う分だけラップしたメソッド書いとけって話もあると思いますが^^;
たいへん参考になりました!
0348nobodyさん
2009/12/02(水) 03:41:18ID:0CcBOFc0Warning が出た時点でスクリプトの実行を一時停止させるには、怪しいところを eval でトラップさせるしかないのでしょうか?
それともデバッグに役立つようなモジュールとかあるのでしょうか?
0349nobodyさん
2009/12/02(水) 06:42:16ID:???% perl -d hoge.pl
ここに色々書いてあるから見てみるといい
http://www.ibm.com/developerworks/jp/linux/library/l-pl-deb/
0351nobodyさん
2009/12/02(水) 12:21:29ID:???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みたいにバイナリ指定する方法もないようで、どうしてよいか分かりません。
このコードの何処が間違っているのでしょうか?
ご指摘お願いします。
0352nobodyさん
2009/12/02(水) 12:32:46ID:???> my @contents = get($url) =~ m{<a.*?href="(http://[^"]+\.jpg)"}gi;
これは……
0353nobodyさん
2009/12/02(水) 13:53:24ID:???Windowsのブラウザ上でコピーしたURL(my $url = $clip->Get(); )に対して
LWPのgeでコンテンツを取得しています。
・・・と書き込みながらあれこれやって1時間、自己解決致しました。
誤) mirror($url, basename($jpg));
正) mirror($jpg, basename($jpg));
jpgじゃなくてURLのhtmlを落としてました・・・orz
0354nobodyさん
2009/12/03(木) 01:29:27ID:???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
種類:不明なファイル
発信元:
これはアパッチの環境設定面でヘマをしてしまったのでしょうか?情報少なくてすみません。
0355nobodyさん
2009/12/03(木) 02:11:50ID:???全て書け
0357nobodyさん
2009/12/03(木) 09:13:01ID:???cgiだと思われてないよ。
0358nobodyさん
2009/12/03(木) 11:50:21ID:???0359354
2009/12/03(木) 23:52:45ID:aPQfU5cAありがとうございました。
やはりApacheの設定だったようです。
詳細の原因はわかりませんでしたが、
confファイルの色々直したら表示できるようになりました。
ありがとうございました。
0360nobodyさん
2009/12/05(土) 16:36:46ID:???1 2 3
4 5 6
7 8 9
-------------------
---------------output.txt-
6
15
24
---------------
input.txt->output.txt(行ごとに三つずつある数字の和を一行ずつ表示させるプログラム)の書き方を教えてください
0361nobodyさん
2009/12/05(土) 16:51:05ID:???こんな感じかな。違ったら誰か突っ込んでくれると思う。わからないところどこ?
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;
0362nobodyさん
2009/12/05(土) 17:16:59ID:???perl -alpe'$_=$F[0]+$F[1]+$F[2]' input.txt>output.txt
perl -MList::Util=sum -alpe'$_=sum@F' input.txt>output.txt
0363nobodyさん
2009/12/06(日) 04:07:59ID:gPKy+f2T4つ目が合ったら・・・
>>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);
0364nobodyさん
2009/12/06(日) 07:36:02ID:???いつも思うのですがこのwhile文の中のdefinedって必要なんですかね?
空文字が来るこってあるのでしょうか?
0366nobodyさん
2009/12/06(日) 11:00:15ID:???0が来たらどうすんだって話じゃないか?
この場面に限らず0の評価を回避するためにdefined書かなきゃいけないことが多すぎる
0367nobodyさん
2009/12/06(日) 12:45:01ID:???Perlクックブックに、以下3つの文で、下の2つには、Perlコンパイラが、definedを挿入する
ので、一番上のように丁寧に書かなくてもOKと書いてあります。
while (defined ($line = <DATAFILE>) { ・・・ }
while ($line = <DATAFILE) { ・・・ }
while (<DATAFILE>) { ・・・ }
このdefinedの挿入は、whileループでreadline、readdir、readlink呼び出しの結果を
スカラー変数に代入する場合のみに行われる。
とも書いてあります。
0368nobodyさん
2009/12/06(日) 13:30:40ID:???�d
確かに0の場合も偽でしたね。
勝手にdefinedを挿入してくれるのかー
ただベストプラクティス的には省略に頼らず、きちんと書いたほうがいいのかな。
0369nobodyさん
2009/12/06(日) 17:16:48ID:???use Data::Dumper;
print Dumper $a;
$VAR1 = [
{
'aaaaaa' => [
'1',
'2',
],
'bbbbbb' => [
'1',
'2',
]
}
];
Dumper してこのように表示されるのですが、参照がうまくできません。
0370369
2009/12/06(日) 17:19:20ID:???foreach my $key (keys %{$a}) {
print $key."¥n";
foreach my $name (@{$$a{$key}}) {
print $name."¥n";
}
}
print $key."¥n"; までは出来ていますが、そこから先が動きません。
この参照の仕方は間違っていますか?
0372nobodyさん
2009/12/06(日) 17:37:42ID:???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 の内容を表示するコード
0373369
2009/12/06(日) 17:46:07ID:???$a->[0]
->[0] だったのか('A`)
リファレンスがまだよく分からない。
>>372
データの集計をしようとしてたのですが、いきなり詰まってました。
有難うございました。
0375nobodyさん
2009/12/07(月) 05:08:40ID:B0UFMTWM@{$a->[0]->{'aaaaaa'}} で配列取得でける
0376nobodyさん
2009/12/12(土) 16:38:26ID:???ありがとうございます
my @nums = split /\s+/, $line; # 空白で分割
この部分が分かりませんでした
0377nobodyさん
2009/12/12(土) 18:06:22ID:aQyC+qGS\s で分割した結果を @nums に入れてるだけ。
基本中の基本なので、これぐらいは見て分からないと・・・
0378nobodyさん
2009/12/12(土) 21:38:30ID:???続いて質問で申し訳ないのですが、
----------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といった変数にしてしまいたいのですが
0379nobodyさん
2009/12/12(土) 22:10:49ID:???perl -aln0e "print qq{$_の数字は$F[$i++]です}for qw(左上 中上 右上 中段左 真ん中 中段右 左下 中下 右下)" input.txt>output.txt
0381nobodyさん
2009/12/13(日) 06:32:28ID:tGb7lH/N0382nobodyさん
2009/12/13(日) 06:52:19ID:???大きなお世話なのはわかっているが言わせてくれ。
君はどうしてその学部に進もうと思ったんだい?
そういうことを勉強したくて行ったんじゃないのかい?
その宿題の解を提出して「よし、じゃあなぜそのアプローチを取ったのか説明してくれ」
と教授に求められたら「2chで出来る人達が勧めてくれました」と答えるのかい?
答えを貰うならば次に、同じような問題を目の前で10分以内に解け、
と言われてもまったく出来ないままだぞ。
君自身はいいのか、それで?
夏休みの読書感想文をコピペサイトからコピーして提出する小学生と同じだぞ。
そして変数名をデータに依存するのは間違ったアプローチだ。
他の入力データを持ってこられたらもう動かなくなる可能性がある。
0383nobodyさん
2009/12/13(日) 07:26:08ID:???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}) {...
0386nobodyさん
2009/12/13(日) 16:26:55ID:???初心者を免罪符にして甘えるより、いっぱい見本がWEBが転がっているんだから、
そのソース見て学んだ方がいいよ。自分の為に。
0387nobodyさん
2009/12/13(日) 17:13:31ID:???KENT 時代の見本とか要らないです><
0388nobodyさん
2009/12/13(日) 17:33:29ID:???0389nobodyさん
2009/12/13(日) 17:40:38ID:???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;
0390nobodyさん
2009/12/13(日) 20:13:53ID:tGb7lH/N0391nobodyさん
2009/12/14(月) 06:14:02ID:???4桁目がきたときには日本語でどうやって表現すんの?
「もっと右」?
4行目がきたときには日本語でどうやって表現すんの?
「もっと下」?
問題文も読めないの?バカなの?
0392nobodyさん
2009/12/14(月) 08:15:42ID:???0393nobodyさん
2009/12/14(月) 16:20:18ID:???[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;
素直に書く。
0394nobodyさん
2009/12/23(水) 12:34:01ID:???あるファイルの容量を表示するのに、現在はこのように書いてます
my $size = -s('data.dat');
$size = sprintf('%.1fKB', $size / 1024);
これをもう少しスマートに書きたいと思っているんですが、どのような
書き方がありますか?
一応以下のようにしてみたんですが、use warningsさんに怒られて
しまいました
my $size = sprintf('%.1fKB', -s('data.dat') / 1024);
0395361
2009/12/23(水) 13:25:55ID:???-sの外側に括弧付けても怒られる?何てメッセージ出るの?
use strict;
use warnings;
warn sprintf('%.1fKB', (-s 'data.dat') / 1024);
これでメッセージでなかったけど。
0398nobodyさん
2009/12/24(木) 10:25:12ID:???標準偏差を出す計算が、自分で書いた方がモジュール使う倍くらい速かったので、
モジュールは呼び出す分遅いのか、自分は計算に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 );
0401nobodyさん
2009/12/24(木) 15:08:02ID:Kh9UPbn8こんな式じゃなかったっけ?
foreach my $i(@data) {
$sum1 += $i;
$sum2 += ($i)**2;
}
my $stddev = sqrt( ($sum2-$number*$sum**2)/ $number );
0402nobodyさん
2009/12/24(木) 18:32:09ID:???そりゃ遅いわ…。って呟くだけなのもなんなので。
見栄えが良いってんなら、
use List::Util qw( sum ) ;
my @ddata = ... ;
my $avg = ( sum @data ) / @data ;
my $stddev = sqrt ( ( sum map{ ( $_ - $avg )**2 } @data ) / @data ) ;
0403nobodyさん
2009/12/24(木) 19:27:27ID:???遅くないんじゃないかなぁ。
0404nobodyさん
2009/12/24(木) 19:41:39ID:???の
*{"$pkg\::oh"}
なんですけど、
1. グロブを使う理由(右辺が関数リファレンスだから$でいいんじゃ。。。)
2. ここの中括弧の意味(ハッシュでもブロックでもないような。。。)
3. なんで:の前にバックスラッシュが必要?
この三点を教えてもらえないでしょうか?
0405nobodyさん
2009/12/24(木) 20:47:12ID:pZAKTGQQ等差数列{a_n}は公差が正であり、その全ての項がSの要素である。
{a_n}の初項でないある項が2010のとき、{a_n}の個数の最大値が存在するならばそれを求めよ
この問題を解くために次のようなprogramを考えました
何がいけないのでしょうか
http://www1.axfc.net/uploader/Sc/so/66961
拡張子は適当に変更をお願いします
0406nobodyさん
2009/12/24(木) 21:56:51ID:???0407nobodyさん
2009/12/24(木) 22:11:33ID:???お前に指導するまえに言っておきたいことがある
かなり厳しい話もするが、俺の本音を聞いておけ
俺より先に投げてはいけない
俺より後に曲げてもいけない
バグはうまくとっぱらえ、いつもきれいに書け
できる範囲で構わないから
忘れてくれるな、デバッグもできない男に
このスレを守ることなどできないことを
お前にはお前にしかできないこともあるから
それ以外は口出しせず、黙って俺についてこい
お前の技術と俺の技術、どちらも同じだ大切にしろ
小技、大技、賢くこなせ
たやすいはずだ愛すればいい
人の陰口は言うな聞くな
それからつまらぬ嫉妬はするな
その方法はある
たぶんあると思う
あるんじゃないかな
ま、ちょっと覚悟はしておけ
スクリプトはみんなで育てるもので
誰かが苦労して
つくろうものではないはず
お前はこのスレへ、恥を忍んでくるのだから
帰る場所などないと思え
これからこのスレがお前の家
0408nobodyさん
2009/12/24(木) 22:16:57ID:???1. 実行時に名前空間$pkgに関数ohを作るためにグロブを使う。この関数ohはlocalしてるのでrunを抜けた時点で破棄される。
2. runはプロトタイプrun(&)で宣言されてるので、これは関数のリファレンスを渡したものとして扱われる。
すなわちrun(sub { oh() })
3. $pkg::ohだとpkg名前空間の$ohという変数になってしまう。*{$pkg . '::oh'}と等価。
0409nobodyさん
2009/12/24(木) 22:53:34ID:???御回答ありがとうございます。
1.については自分がグロブをよく分かっていないことが分かりましたので勉強します。
2.については自分の質問の仕方がまずかったのかよく分かりません。
もう少し自分で考えてみます。
3.についてはすっきりしました。こんなテクがあるんですね。。。
0410nobodyさん
2009/12/24(木) 23:23:20ID:???*{"$pkg\::oh"}の中括弧はこの括弧でくくった範囲が識別子ですよ、ってこと。
0411nobodyさん
2009/12/25(金) 12:15:55ID:???中括弧にはそういう使い方もあるのですね。
perlは文法項目がたくさんあって覚えるのが大変ですが、
がんばって勉強したいと思います。
御回答ありがとうございました。
0412nobodyさん
2009/12/25(金) 12:53:54ID:???パッケージ変数(グローバル変数)には色々な型がありますが(スカラー$、配列@、ハッシュ%等)、
それらはグロブを経由して格納されています。
例えば、以下のように様々な型の同名変数が宣言されたとします。
$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" }
┃ └────┘.┃
┗━━━━━━━━━┛
0413412
2009/12/25(金) 12:54:42ID:???*foo{SCALAR}
*foo{ARRAY}
*foo{HASH}
*foo{CODE}
と型を中括弧で囲んでアクセスできます。
スロットには各変数のリファレンスが格納されているので、実体にアクセスするにはデリファレンス
(リファレンス先の実体を見ること)する必要があります。
例えば、$fooの実体にアクセスするには、
print ${ *foo{SCALAR} }; #=> hoge
とします。
デリファレンスは、リファレンスを中括弧で囲み、適切な型識別子(この場合$)を前に付けます。
このように、実際のアドレス値が格納されているリファレンス(ポインタ)をハードリファレンスと
もいいます。
これに対して、文字列を変数名として認識するシンボリックリファレンス(ソフトリファレンス)
というのもあります。
print ${ "foo" }; #=> hoge
同じく中括弧で囲みデリファレンスします。
0414412
2009/12/25(金) 12:55:31ID:???>1. グロブを使う理由(右辺が関数リファレンスだから$でいいんじゃ。。。)
先述しましたように、関数を登録する場合、グロブのCODEスロットに関数リファレンスを代入する
必要があります
前置きで話した、*fooで説明しますと、*foo{CODE}に関数リファレンスを登録すればいいのです。
*foo = sub { print "fuga" };
この式の右辺が、関数リファレンスなので、Perlはこれを察して、CODEスロットにこの関数リフ
ァレンスを代入してくれます(*foo{CODE}に代入される)。
>2. ここの中括弧の意味(ハッシュでもブロックでもないような。。。)
前置きで話したシンボリックリファレンスのデリファレンスです。
デリファレンスは中括弧で囲みます。
え〜と、ここまで回答しておいてなんですが、私もまだPerl初心者です^^;
色々ググって調べました。
間違いがあれば詳しい人が訂正してくれるでしょう。
0415nobodyさん
2009/12/25(金) 15:55:02ID:???詳しい説明ありがとうございました。
グロブと中括弧によるデリファレンスの考え方が肝であり、
その肝が全く分かっていなかったようです。
まだ完全に理解出来たわけではありませんが、
じっくり考えれば首尾一貫した説明が自分の中で出来そうです。
ところで、
"&foo"は関数の実体である一方、
他方"sub { print "hoge" }"というエクスプレッションは関数へのリファレンスなので、
"sub { print "hoge" }"を"sub { print "hoge" }の実体"とするとより厳密になる気がします。
0416nobodyさん
2009/12/25(金) 17:31:14ID:???確かにコードだけは実体ではないですね。
この辺りの詳しい内容は実用Perlプログラミングに載っているそうです。
0417nobodyさん
2009/12/25(金) 17:55:48ID:???後、デリファレンスにはかぎかっこを使わない方法もある(つか、普通はそっちを使うな)
0418nobodyさん
2009/12/26(土) 12:21:31ID:???とりあえず作ってみた。
答えがあってるかどうかはわからないけど。
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}";
0419nobodyさん
2009/12/26(土) 12:22:18ID:???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;
}
0420nobodyさん
2009/12/26(土) 15:04:14ID:???遅レスなんかすんなよ。
0421nobodyさん
2009/12/26(土) 17:55:21ID:???としたのですがこの行でエラーが起きています。
XML::DOMを使う場合には別途インストールしないといけないのでしょうか?
0422nobodyさん
2009/12/26(土) 17:57:34ID:???0423nobodyさん
2009/12/27(日) 16:45:54ID:???また、xmlがある場合はそれに追加していく形で処理したいのですが
参考になるコードなどはあるでしょうか?
0425nobodyさん
2009/12/28(月) 13:39:29ID: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すべてにマッチしますが、"ググる"にもマッチしてしまう
なにかとっかかりがあれば、お願いします
0426nobodyさん
2009/12/28(月) 13:55:13ID:???どちらかに変換してマッチさせたほうがスマートな気がする
0427425
2009/12/28(月) 13:56:20ID:???×$word =~ /(\N{katakana}|\N{hiragana})+/
○$word =~ /(\p{InKatakana}|\p{InHiragana})+/
0428nobodyさん
2009/12/28(月) 14:25:43ID:???おかしくて、
use charnames qw(katakana hiragana);
と2つ書いても検索の順番を決めてるだけ。
同じ名前があれば先に見つけた方になる。
うまいこと文字クラスにしてくれるような便利な
ものではない。
[へヘ][しシ]でいいんじゃねーの?
0429nobodyさん
2009/12/28(月) 14:37:42ID:???0430425
2009/12/28(月) 14:42:33ID:???正規表現の方ですが、次の記述で対応できそうでした。
(>>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
0431nobodyさん
2009/12/29(火) 07:27:32ID:???case sensitiveでない検索エンジンを作ったときはその対策でいったな。
インデックス作る時に全部一旦大文字に変換して流し込んだ。
ちなみにヶ、ヵは本来漢字やその誤用だからひらがなにすべきではないし、
ヴは本来外来語の表現専用だからひらがなにすべきではないと俺は思う。
だからやるんだったら平仮名->片仮名変換。
0432○~* ◆q7u/null4U
2010/01/01(金) 04:02:13ID:PXOfMB4Rことよろ.
0433今日からperl
2010/01/02(土) 20:11:44ID:jeXHm8zZ2:5_10.dbがないと言われたので勝手に空のファイル作ったら
3:ダウンロードできたみたいな雰囲気になったけど、ダウンロードされてない。
宜しくお願いします。
0434nobodyさん
2010/01/03(日) 08:10:22ID:???sudo cpan -i XML::RSS
これで質問に適当に答えればインストールされるはずだが。
2: は何でのエラー?cpanコマンド?
0435今日からperl
2010/01/03(日) 13:03:19ID:6EQQX2jnsudoは内部コマンドまた外部コマンド、操作可能なプログラムまたはバッチファイル
として認識されていません。と出ます。
cpanと打つと動いて
cpan>
の画面になります。そこでinstall XML::RSSと打つと
長々と動きますが、途中でさっきの「内部コマンドまたは外部〜」
のエラーが出たり、makefile NOと最後のあたりに出たりします。
0436nobodyさん
2010/01/03(日) 13:25:56ID:???windowsのactiveperlならcpanじゃなくてppm使え
0437今日からperl
2010/01/03(日) 14:47:50ID:6EQQX2jnactiveperlをインストールしました。
必要な情報がわかりませんのですいません。
0438今日からperl
2010/01/03(日) 14:51:40ID:6EQQX2jn〜5_10.dbが
unable to open database file
と帰ってきます。
0439nobodyさん
2010/01/03(日) 17:38:27ID:???0440nobodyさん
2010/01/03(日) 17:41:26ID:???0441nobodyさん
2010/01/04(月) 01:50:08ID:???エラーの原因を人に聞くときは、
> 〜5_10.dbが
などと勝手に省略しないで、丸ごとコピペするのが鉄則。余りに長い場合を除くが。
>>440
DOS時代からPC使っていると本能的に避けてる問題だから、ユーザー名に漢字を使っていてエラーになったPCをチェックしたとき、それが原因だと気づくまではまったことがある。
0442nobodyさん
2010/01/04(月) 11:09:43ID:???と思って入力したら、実は全角が入ってて泣いた。
0443nobodyさん
2010/01/04(月) 14:11:57ID:N9GeTuHkいい感じのフリースクリプトのページを見つけたのですが、
改造したいのにどこを変えればいいのか、全然意味がわかりません!
http://homepage1.nifty.com/kkuri/computer/ExAuction.html
ここに載ってるスクリプトをどなたか解説していただけませんか??(涙)
0444nobodyさん
2010/01/04(月) 17:13:05ID:???授業料払ってくれるならな・・・。
ついでに言えば一体何年前のスクリプトなんだといいたくなる位
ひどい代物だから学ぶことなんか何もないぞ。
0445nobodyさん
2010/01/04(月) 19:24:02ID:???0446nobodyさん
2010/01/04(月) 19:34:23ID:N9GeTuHk古いものなんですか、初心者過ぎてわかりませんでした。
フリーマーケットの出来るプログラムを書きたかったんですけど、独学じゃ無理っぽくて。
エクセルも使えないし(涙)
0447nobodyさん
2010/01/04(月) 19:43:17ID:N9GeTuHk愚痴すいません。
0448nobodyさん
2010/01/05(火) 07:28:10ID:???そういう時のためにサポート付きのプロダクトがあるわけだが。
まあ普通それなりの値段はするから覚悟しとけよ、と。
結局必死で勉強するか金払うかの二択。
0449nobodyさん
2010/01/05(火) 09:53:32ID:???0452nobodyさん
2010/01/05(火) 16:51:16ID:???とりあえず一定規模以上の開発にCGIスクリプトはありえん。WAF使えと。
WAF: Catalyst
DB: DBIC / CDBI
Tmpl: TT / CS
Moose Catalyst使うならMooseも覚えとけ。
サンプルはそれぞれのマニュアル参照。
フリマのサンプル?知るか。有償で作ってやってもいいが。
0454nobodyさん
2010/01/05(火) 17:15:38ID:???0455nobodyさん
2010/01/05(火) 17:18:20ID:???Plackはレイヤーが違う。
Plack::Apache2とCatalyst::Engine::Plack入れときゃいい話で
WAF使うならPSGIは意識しなくていい。
モジュール名はうろ覚えだから間違ってたらスマソ。
0456nobodyさん
2010/01/05(火) 17:27:13ID:???それとPerlバインディングは妙な使いづらさがある
速いのはいいんだけど
0457nobodyさん
2010/01/05(火) 17:32:59ID:???俺はふつーCSだろとか思ってるんだが、そういうツッコミがあると
思ってTTも併記しといた。TTはXSじゃないよな多分。
0458nobodyさん
2010/01/05(火) 20:58:54ID:???入り口としては簡単な部類に入ると思う
0459nobodyさん
2010/01/05(火) 21:26:39ID:???どんだけアクセス捌く予定だよ
0460450
2010/01/05(火) 23:34:33ID:???色々とthxです。
ちなみに>>450 = >>398で、>>443とは別人です・・・。
モジュールの中身を初めて読んでちょっと死にそうだったので、
もう少し身の丈にあったものがあるかなと・・・
0461nobodyさん
2010/01/06(水) 00:47:37ID:???0462nobodyさん
2010/01/06(水) 08:59:56ID:UNfDPcgPWindows XP Professional SP2で、apache2.2を動かしていて、
perl v5.10.0でプログラムを書いていますがうまく動きません。
具体的には、
http://www.stackasterisk.jp/tech/program/perl04_02.jsp
に書いてある★Dにsleep 10;を書くと、すぐにブラウザが開放されず、
10秒ほど読み込み中の状態になります。すぐにブラウザが開放されて、
バッファされてる出力も書き出されるのが希望なのですが、
Windowsを使っているのが悪いのでしょうか?
0463nobodyさん
2010/01/06(水) 09:12:27ID:???よく知らんがWindowsはperforkでのエミュレーションだからだろうな。
sleepはシステムコールだからプロセス潰すし。
0464nobodyさん
2010/01/06(水) 09:55:50ID:???お返事ありがとうございます。forkにこだわるつもりは無いのですが、
Windowsをサーバーにして、出力を全て出しつつ裏で時間のかかる処理を
続けるということは、可能なのでしょうか? $|=1とかも試したのですが、
ダメでした。
0465nobodyさん
2010/01/06(水) 11:20:05ID:???forkせずに、単にclose(STDOUT);してsleepするだけだとどうなる?
0466nobodyさん
2010/01/06(水) 12:12:42ID:???STDERRも閉じてみたらどうだろ。
0467nobodyさん
2010/01/06(水) 12:50:51ID:???今やってみたのですが、10秒程度読み込み中が続きました。
>>466
こちらはうまく行きました!ありがとうございます。
今本当に動かしたいプログラムを書き換えています。
また何か聞くかもしれませんがそのときはよろしくお願いします。
0468467
2010/01/06(水) 15:56:39ID:g9KuWVT/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 と書きましたが
いちおうこれで動いているようなのですが、大丈夫でしょうか?
ちょっとスレ違いになってしまいますが、よろしくお願いします。
0469nobodyさん
2010/01/06(水) 16:17:40ID:???462で出力を閉じた時点でApacheの処理は完了していて、タイムアウトとか関係なくなるように思うが
0470nobodyさん
2010/01/06(水) 17:16:19ID:???0471nobodyさん
2010/01/06(水) 17:21:16ID:???0472nobodyさん
2010/01/06(水) 17:28:11ID:U4hPtr/3で、処理完了時に適当なファイルを作るようにすれば、そのファイルの有無で
処理の完了がわかる。
0473467
2010/01/07(木) 11:53:58ID:???Apacheのhttpd.confの書き方はまずかったようで、元に戻しました。
で、STDERRを閉じただけでは、なぜか時間のかかる処理部分は実行されない
という結果になりました(ブラウザは開放されます)。
で結局forkを使って子プロセスに処理させるようにして
とりあえずの目標は達成されたようです。いろいろとありがとうございました。
0474467
2010/01/07(木) 22:52:52ID:???秘密にする意味も無いので、お教えしますと、こんなページを作っています。
freesoft板@Virtua ch
http://virtua-ch.ddo.jp/cgi-bin/read.cgi?freesoft
興味があればご覧下さい。
0475nobodyさん
2010/01/07(木) 22:58:16ID:???書き出したファイルの内容と新しく吐いたソースの比較はどうすればできますか?
宜しくおねがいします。
0476nobodyさん
2010/01/08(金) 00:33:17ID:???そのURLだけじゃまったく分からないがエスパーすると
普通、ログの収集にはcronなりその類のスケジューラを使うと思う
>>475
>phpの吐いたソースを書き出して
ここが意味不明
phpの吐いたソースとは何のソース?
そしてそのソースを書き出すのはいったい誰?phpのように思うんだが
0477nobodyさん
2010/01/08(金) 06:01:19ID:???diffってコマンドは知ってるよね?Macには標準で入ってるし、
Winもdiffで検索すれば比較ソフトは出てくる。
俺がお勧めなのはvimdiffだがな。
0478475
2010/01/08(金) 19:43:24ID:???ごめんなさい。
0479nobodyさん
2010/01/10(日) 01:28:27ID:???Perlで組んでいるらしいのだが
負荷に耐えられないと嘆いてる。誰か助けてやってくれ
0480nobodyさん
2010/01/10(日) 02:34:52ID:???それはさておき、どんなに頑張ってもコードだけじゃ解決できない問題のような気がするぞ
サーバを増やすなどしてスケールアウトするのが一番なんじゃね
0481nobodyさん
2010/01/10(日) 19:02:07ID:???0482nobodyさん
2010/01/11(月) 09:59:05ID:???Twitterタイプのサービスか?
Twitterがどれだけ設計とスケールに苦労して今の状態を維持してるのか
1000回くらいググってから出直せ。
0483nobodyさん
2010/01/12(火) 23:50:01ID:???0484nobodyさん
2010/01/13(水) 07:23:08ID:???最新のtweet、ちょっと古いtweet、もっと古いtweetとサーバーを分けて
それぞれ必要なだけスケールする手法を取ってた気がする。
また変えたかも知れんが。
0485nobodyさん
2010/01/17(日) 17:46:44ID:???これ(a)を数える方法を教えてください。
0486nobodyさん
2010/01/17(日) 17:49:09ID:???もしくは
$hoge = s/(a)/$1/ig;
0487nobodyさん
2010/01/17(日) 17:50:17ID:???0488485
2010/01/17(日) 17:55:30ID:???0489nobodyさん
2010/01/17(日) 18:17:50ID:Ido2Vdjf0491nobodyさん
2010/01/18(月) 15:49:13ID:???以下のようなハッシュがあります。
$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'} の 開始日付でソートしたいのですがどうすればよろしいでしょうか?
0492nobodyさん
2010/01/18(月) 16:12:12ID:r5bEwLM5だけでいいような気がする
0493nobodyさん
2010/01/18(月) 16:15:20ID:???0494nobodyさん
2010/01/18(月) 16:32:26ID:r5bEwLM50495nobodyさん
2010/01/18(月) 16:34:05ID:???@keys = map{s/\///g} @keys;
@sort_keys = sort {$a <=> $b} @keys;
何がやりたいのか分からんけどこれでいいか?
0496nobodyさん
2010/01/18(月) 16:36:10ID:???$SERIAL->{$a}->{day_start} cmp $SERIAL->{$b}->{day_start}
# 文字列比較だから時刻に24時とか0時が混在してると変なことになるので、
# それが嫌ならstrptimeとかtimelocalでエポックに戻して数値比較するなりなんなり。
} keys %$SERIAL;
for my $id (@ids) {
# やりたい処理
print $SERIAL->{$id}->{ほげほげ}, $/;
}
ソート後のを元の$SERIALと同じ形式で格納するのはハッシュリファレンスじゃ無理。
0497nobodyさん
2010/01/18(月) 16:36:21ID:r5bEwLM5かな?
携帯からソース書くのって面倒臭いね
0498nobodyさん
2010/01/18(月) 16:37:11ID:???@keys = map {$SERIAL->{$_}->{day_start}} keys %$SERIAL;
@keys = map {s/\///g} @keys;
@sort_keys = sort {$a <=> $b} @keys;
こうだったわ
0499nobodyさん
2010/01/18(月) 16:46:12ID:???@keys = map {$SERIAL->{$_}->{day_start}} keys %$SERIAL;
@keys = map {s/[/:\s]//g} @keys;
@sort_keys = sort {$a <=> $b} @keys;
0500nobodyさん
2010/01/18(月) 17:03:19ID:???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;
0502nobodyさん
2010/01/19(火) 15:02:27ID:???最後の行あたりでよくわからないエラーをはいてしまい、実行すらできません。。
#円周率の近似値を求めるプログラム
$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;
0503nobodyさん
2010/01/19(火) 15:06:31ID:???0504nobodyさん
2010/01/19(火) 15:09:10ID:???0505nobodyさん
2010/01/19(火) 15:09:51ID:???Missing right curly or square bracket at ...
0506nobodyさん
2010/01/19(火) 15:28:07ID:???0507nobodyさん
2010/01/19(火) 18:54:30ID:???以下の処理で文字コードの関係により困ってます。
クライアント側の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;
0509507
2010/01/19(火) 19:27:54ID:???Content-Type: text/html; charset=☆☆☆\n\n
☆☆☆の部分がミスってただけでした orz
UTF-8で出力したりいろいろパターンがあってミスってました
0510nobodyさん
2010/01/21(木) 00:41:21ID:???mod_perlのように、グローバル変数を使うと同じプロセス内の別スレッドから見えてしまうということはあるのでしょうか。
また、1リクエスト1プロセスを前提にした time . $$ の値は、同時に複数のリクエストで同じ値を持ちうるのでしょうか。
同一プロセスでもスレッドを識別するための情報を識別する環境変数はありますか?
thread-safeなPerlプログラミングの記事やドキュメントなどをご存知でしたらどなたか教えてください。
0511nobodyさん
2010/01/21(木) 17:39:33ID:???・print "Content-Type: text/html\n\n";以降の行にコメントを書く → 500エラー
・HTML::Templateのサンプルそのままコピって、my $tmpl_out = $template->output; → 500エラー
my $out = $template->output;
print "$out";ならセーフ。
ちょっと厳格すぎる気がするのですが、こんなモンでしょうか?
0512nobodyさん
2010/01/21(木) 18:24:54ID:rPXIzyqapremature end of script headers を食らうようなコードを書いてるだけだと思うんだけど。
perl -Tc script.cgi
これでずらずらとお知らせが出て来ない?
0513nobodyさん
2010/01/21(木) 18:39:16ID:???全角空白を入れてたり改行コードが実行環境に合ってなかったりってのがありがち
>>512
-W や -w でなく -T なのか
0515nobodyさん
2010/01/22(金) 11:47:37ID:???%hash = qw(
1 foo
2 hoge
3 bar
);
という書き方がとてもラクで気に入っているのですが、
これで二次ハッシュを書くにはどうしたら良いのでしょうか?
以下のようにするとダメでした。
my %hash = qw(
Friend {
hoge Perl
foo Perl
}
Enemy {
fuga Ruby
}
);
qw使っては無理でしょうか?
0516nobodyさん
2010/01/22(金) 12:16:25ID:???こういう風になら書けるが見づらいだけなのでおすすめはしない
my %hash = ( Friend => { qw/hoge Perl foo Perl/ }, Enemy => { qw/fuga Ruby/ } );
0517nobodyさん
2010/01/22(金) 13:01:13ID:???そのままじゃ無理だね。
( 'Friend', '{', 'hoge', 'Perl', 'foo', 'Perl', '}', 'Enemy', '{', 'fuga', 'Ruby', '}' )
というリストをパラメータでもらい、'{', '}'を解釈して
( 'Friend', { 'hoge', 'Perl', 'foo', 'Perl' }, 'Enemy', { 'fuga', 'Ruby' } )
というふうに組み替えてくれるサブルーチンqwhashを作って
my @hash = qwhash qw(...);
とすればいいんじゃね?
0518nobodyさん
2010/01/22(金) 13:01:56ID:???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;
}
0519nobodyさん
2010/01/22(金) 14:18:53ID:BvoGYaqcindex.htmlにした方がいいと気づきました。この場合
open(STDOUT, ">c:/xampp/htdocs/ほげほげ/index.html") || die "cannot open index.html";
とやってしまっていいものでしょうか?
実際にやってみた結果は、openは失敗せず、index.htmlも作られないという感じでした。
いまからprint 文を全部書き換えるのは面倒だなと思っているのですが、いい方法無いでしょうか?
0520nobodyさん
2010/01/22(金) 14:40:44ID:???既存のファイルハンドルを指定していきなりopenした場合は、自動的にcloseしてから
openしてくれるので、それでもいいはずだけどな。何か思い違いをしてないかよく
調べた方が良い。
別の方法としては、select FILEHANDLEでデフォルトのファイルハンドルを切り替える、
ってのもあるよ。
0521nobodyさん
2010/01/22(金) 15:37:55ID:???ありがとうございます。
自分でハッシュテーブル書くのにも空白使えないし、
変数引っ張ってくるのも危ないから、やっぱりqwは使わないようにします。
0522nobodyさん
2010/01/22(金) 15:39:36ID:???STDOUTをただ閉じるとApacheとのつながりが切れるのではないかと思いこうしました。
良くは調べてないのですが、教わった方法をやってみました。こちらはうまく
index.htmlが生成されました。ただ画面自体はエラーなんですね…
これをどうしようか悩んでいます。
0523nobodyさん
2010/01/22(金) 17:25:23ID:???こういう事をしたいの?
#!/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__
0524nobodyさん
2010/01/23(土) 08:32:36ID:???それだとあちこちを書き直さなければいけないので、それ以外の方法を模索していました。
結局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>
と出力するようにしました。
0525nobodyさん
2010/01/24(日) 12:30:42ID:h+yaOkgWif($picture) {
# print <<END_OF_MESSAGE;
# <center>
# <img src="$picture" alt="">
# </center>
# END_OF_MESSAGE
}
という部分がCGIにあるのですが、コメントをはずすとファイル終端でエラーがでます。
ヒアドキュメントは見よう見まねで他でも使っているのに、なぜここだけエラーになるのか
ヒアドキュメントについて詳しく書いた本を持っていないのでよく分かりません。
理由分かる方いましたら教えてください。
0526nobodyさん
2010/01/24(日) 12:42:27ID:???if($picture) {
# print <<END_OF_MESSAGE;
# <center>
# <img src="$picture" alt="">
# </center>
# END_OF_MESSAGE
}
END_OF_MESSAGE
きっとこうなってるのさ
0527nobodyさん
2010/01/24(日) 12:47:04ID:???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が見つからないということになるんでしょうか。
0528nobodyさん
2010/01/24(日) 12:55:26ID:???本がなければ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 ブロック内の最後の文なので省略可能。
0529nobodyさん
2010/01/24(日) 13:06:22ID:h+yaOkgWperldocの最初の方だけ見て
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.
と出るのはかわりません。なぜでしょうか?
0530nobodyさん
2010/01/24(日) 13:13:42ID:???0531nobodyさん
2010/01/24(日) 13:15:23ID:???だからじゃね
0532nobodyさん
2010/01/24(日) 13:17:58ID:U2dkcd6K恐らくは改行コード・・・
0533nobodyさん
2010/01/24(日) 13:19:28ID:???お騒がせしました。Meadowの blank-mode は
常にオンにしておこうかな…
0534nobodyさん
2010/01/24(日) 14:33:19ID:???難しいこと全部やってくれるからオススメ。
初心者スレだから書いてみた。
0535nobodyさん
2010/01/24(日) 16:59:34ID:U2dkcd6K0536nobodyさん
2010/01/28(木) 23:57:36ID:MprgKrS4Net::FTPを使ってファイルのアップロードを行おうと考えております。
今まではFreeBSDサーバーへのアップロードであったため
$ftp->cwd
$ftp->put
$ftp->ls
などのコマンドが使用出来ましたが、Windows系サーバー(2008R2)
の場合はこれらのコマンドは使用出来るのでしょうか?
どなたかご存知の方いらっしゃいましたらお願い致します。
0537nobodyさん
2010/01/29(金) 00:21:05ID:???それくらいは大丈夫だよ
0538nobodyさん
2010/01/29(金) 00:26:29ID:kJRAFybz0539nobodyさん
2010/01/29(金) 00:49:32ID:XeE9xFHb>>538
接続先OSがwindowsの場合、lsコマンドなどは無いので、FTPのコマンドも
独自のものかと思い質問致しました。
素早いご返答ありがとうございました。
0540nobodyさん
2010/01/29(金) 09:51:16ID:???「キッチンの方の」にマッチさせたくない場合は
どう書けば良いですか?
後ろに「方」が付くかどうかの違いです。
0541nobodyさん
2010/01/29(金) 09:58:46ID:kJRAFybz0542nobodyさん
2010/01/29(金) 10:00:47ID:???否定後読み
正規表現単体の質問ならプログラム板の正規表現スレでやれよ
0543540
2010/01/29(金) 10:09:27ID:???0544nobodyさん
2010/01/30(土) 00:13:34ID:???0545nobodyさん
2010/01/30(土) 00:28:03ID:+AHy4UTdのような感じで、1行に1つの多角形の座標を記述したファイルがあるとして、
任意の XY 座標が、上記ファイルの各行に記述された多角形内に
収まってるかを検索する方法として、なにか検索の定石みたいのはありますか?
GPS 座標からどこに居るのかを地名付きで表示したいと思っています
自治体の面積データは国が配ってるデータを使用します
0546nobodyさん
2010/01/30(土) 00:46:09ID:9jHLZuCt0547nobodyさん
2010/01/30(土) 00:51:18ID:9jHLZuCt0548nobodyさん
2010/01/30(土) 00:55:19ID:???定石かどうかは知らないけど、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/
0549nobodyさん
2010/01/30(土) 02:32:59ID:+AHy4UTdありがとうございます m(_ _)m
0550nobodyさん
2010/01/30(土) 02:44:24ID:0KWCr7Sg開発環境: 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の質問じゃなくてすみません。
0551550
2010/01/30(土) 04:52:59ID:???よく考えるとヘッダのあとの改行は二つでした。
こんなことを3時間以上も考えるなんて恐ろしい。
1のほうはまだ未解決頭痛続行中です。お願いします。
0552nobodyさん
2010/01/30(土) 05:04:21ID:???> Can't find string terminator "]" anywhere before EOF at - line 211.
> (このエラーメッセージ通りの記述ミスはない) ←これが気のせい
line 211に何かがあるわけじゃなくてもっと手前で閉じるべきもんを閉じてないと
パーサさんが EOF まで探したところで挫折する。
0553550
2010/01/30(土) 05:13:12ID:???そうではなくて今不思議なのは、なぜhttpdから記述を引き渡すとコンパイルされない物がコンパイルされ、
その上エラーメッセージすら吐かずに稼動するのか?と言う所にあります。
0555550
2010/01/30(土) 06:23:33ID:???秀丸から直接コマンド打ってたのですが、UTF8のファイルを開いててもsjisとして扱ってくれてるくさい?です。
秀丸で打ったコマンド → perl -wc <con >con
#↑今開いてる秀丸タブの内容を引数とし、出力結果を新規タブに出力しろと言うコマンド
UTF8として認識させた ー (伸ばす棒)を、
q[ー]; で、UTF8ファイルでもエラーになります。
もちろん 'ー' だとコンパイルされます。
ー はsjisで815b、 ] は5b なので、たぶん断定です。
ただの偶然で違うかもしれませんが、もうめんどいのでこれ以上調べません。
UTF8ファイルからまさかsjisの文字コード問題でハマるとはね。
秀丸死ね。
0556nobodyさん
2010/01/30(土) 06:27:31ID:???んな後出しをするから「内部処理がCP932なんじゃね?」と書いてもらえない
0558nobodyさん
2010/01/30(土) 09:25:08ID:???ここのAPI使う
http://www.geocoding.jp/
0559nobodyさん
2010/02/01(月) 13:06:09ID:???何故WindowsからはNGなのでしょうか?
Winが触ったファイルを回復させる方法は、nkfしか知らないのですが・・・
0560nobodyさん
2010/02/01(月) 13:23:02ID:???いいんじゃないかなぁ
0561nobodyさん
2010/02/01(月) 13:41:59ID:???よく考えたらレンタルサーバにFTPとかでUPする場合、
Win側のテキストエディタで文字コードと改行コード指定するしかないから、
サーバ側の設定の問題かと思ったのですが。
> IIS+VBかなんかに乗り換えた方が
Perl → PHPに乗り換える方が現実的なような。
まぁPerlが何となく好きなんで、もうちょいPuTTY+vimで頑張りますよ。。。
0562nobodyさん
2010/02/01(月) 14:44:14ID:???0563nobodyさん
2010/02/01(月) 19:10:33ID:???0564nobodyさん
2010/02/01(月) 23:00:00ID:???Winのエディタで作成してFTPでうp → Winのエディタで動くってサーバどーなってんの?
鯖のシステムの文字コードをcp932にしたらおk^^
って話ならお断りしますが。
0565nobodyさん
2010/02/02(火) 10:41:56ID:???LINUXの共有フォルダをドライブでLドラとかにマウントして
タスクスケジュール使って定期的にCドラからLドラにファイルをcpしたら?
あと、windowsにCygwinとかのVM使ってLINUXとして動かす方法もある。
0566nobodyさん
2010/02/02(火) 10:46:28ID:???あと、改行コードがwinだと<CR><LF>
Linuxだと<LF>つーのは当然知ってるよね?
改行コードが違っててLINUX側では壊れたように認識されるってのも
よくある話なので、WIN側で保存する際は間違っても「メモ帳」とか使わない
0567nobodyさん
2010/02/03(水) 01:38:18ID:???0568nobodyさん
2010/02/05(金) 23:38:04ID:???調べてもなかなかケースが見つからないので質問をさせていただきました。
ページA内のボタンを押すと、ページBに飛ぶようにしたいです。
その際、ページBを表示するサブルーチンに、ページAの引数の値を
渡すにはどのようにすればいいのでしょうか?
0569nobodyさん
2010/02/05(金) 23:39:53ID:???0570nobodyさん
2010/02/06(土) 00:10:45ID:???フォーム+CGIの話だとは思うが・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
0571nobodyさん
2010/02/06(土) 00:15:59ID:???hiddenで仕込んでおけば。
0572nobodyさん
2010/02/06(土) 04:45:05ID:???twitterで叫んでも爆発しませんでした?
0573568
2010/02/06(土) 17:28:41ID:???cgiのお話です。書き忘れてしまいました。
・・ごめんなさい。
>>571
教えていただいてありがとうございました。
つまり
<input type="hidden" name="***" value="ページBに渡したい引数">
を併記すればいいということですよね?
今試せないのですが、月曜日に学校に行ったらさっそく
試してみようと思います。
ありがとうございました。
0574nobodyさん
2010/02/06(土) 22:25:09ID:???0576nobodyさん
2010/02/07(日) 21:02:36ID:???飛んで来たものが @_ に入ってる状態まで持って行かないと shift では取れないよ。
それよりページAもページBも同一スクリプトの出力だったりするのかな。
0577568
2010/02/07(日) 23:15:29ID:???はい。ページはすべて同一スクリプトです。
各ページはそれぞれサブルーチンに記載しています。
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に値をとりだす・・・と考えているのですが、間違ってますか?
全然自信がなくて恥ずかしいのですが
変なことをしてしまっているかもしれません・・・。
0578nobodyさん
2010/02/07(日) 23:19:11ID:???0579nobodyさん
2010/02/07(日) 23:31:29ID:???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('***');
}
こういうことがしたいんだろ?
0580Name_Not_Found
2010/02/08(月) 15:43:35ID:5HRzICqcバージョンは5.8.8です。
0581nobodyさん
2010/02/08(月) 15:47:57ID:???0582nobodyさん
2010/02/08(月) 21:01:31ID:???環境でmakeすれば問題なかったりはしないんだろうか?
0583nobodyさん
2010/02/08(月) 21:34:28ID:???1から10までかいてあるようなサイトありませんか?
0584568
2010/02/08(月) 23:11:36ID:???今日試してみました。
hiddenを使って渡して、paramで受け取ることができました。
shiftは駄目でした。
教えていただいてどうもありがとうございました。
とても助かりました。
値の受け渡しについてだいぶわかってきました。
でもたぶんまだ完全に理解していないと思うので、
これから教わったことをじっくり考えたいと思います。
0585nobodyさん
2010/02/10(水) 11:19:20ID:Vw6vWoQu}がどこを閉じているのかも分かりづらいのですが、
perlで書いている人はどんな風に見やすくしているのですか?
0586nobodyさん
2010/02/10(水) 11:25:13ID:???OUT_HTMLを終わる時に先頭にタブがあるとエラーで出るだけで通常は大丈夫なようでした
この部分だけなら我慢しることにします
0587nobodyさん
2010/02/10(水) 11:57:20ID:???スニペットを置くには便利だけど、言うとおりソースが見づらくなるので
__DATA__なりを使うようになるんじゃないかね
0588nobodyさん
2010/02/10(水) 12:21:59ID:BOSF90jMperlのオブジェクトが、ハッシュに戻ってしまいメソッドが呼べなくなる
というバグに悩まされています。どうも見ているとwebにアクセスする
メソッドを読んだ後に他のメソッドを呼ぶと、ハッシュに戻っている気がします。
このようなバグに悩まされた方いらっしゃらないでしょうか?
全く解決法が分かりません。
0589nobodyさん
2010/02/10(水) 13:26:09ID:???WEBプログラミング板に移動したのでこちらは締め切ります。
お前ら使えねえな。
0590nobodyさん
2010/02/10(水) 13:41:06ID:???まともに回答が欲しければ気がしますじゃなくてコードさらして
呼ぶ前と呼ぶ後でこうなってるって示せよ。
0591nobodyさん
2010/02/10(水) 14:23:14ID:???0592nobodyさん
2010/02/10(水) 18:06:19ID:???状態に戻すなんてできるっけ?
別のハッシュになってるような気がするなぁ。
0593nobodyさん
2010/02/10(水) 22:19:58ID:???たぶん別の値で上書きしてるんだろうな。
その変数に代入している所を全部調べてみたら?
0594nobodyさん
2010/02/11(木) 00:37:03ID:???モジュールでそんなエラーがでてるんなら、まずモジュール名書くべきだろ
自分の書いたやつなら、コードさらさないと答えようがない
0595nobodyさん
2010/02/11(木) 00:56:59ID:???ここはエスパーしかお呼びじゃないスレだ
0596588
2010/02/11(木) 00:57:44ID:???foreach(@tmp) {
$_->wget();
}
@New = sort by_LastUpdated @tmp;
という部分があってby_LastUpdatedでUse of uninitialized value in〜が多発して
その後で@Newのメソッドが呼べないといってプログラムが終了します。
オブジェクトを作るのは
sub new {
my ($url) = @_;
my $bbs;
chomp($url);
my $this = {
"OrgUrl" => $url,
};
bless $this, 'Sure';
# $thisのその他の値の設定
…
return $this;
}
って感じです。あとこんな事いうのも馬鹿馬鹿しいですが>>589は
僕じゃありません。それとどうも新しく追加したところを消すと
バグが消えるようなのでそこを確認しようと思います。
どうもありがとうございました。
0597nobodyさん
2010/02/11(木) 01:24:13ID:???どこを切り取っても突っ込む所しか無い。
勘だけで書いたコードを晒されてもどうしようも無い。
無理して似非オブジェクト指向なコードを書くな。
0598nobodyさん
2010/02/11(木) 08:02:25ID:???こりゃお手上げだな、エスパーさん後は
任せた。
0599nobodyさん
2010/02/11(木) 09:48:23ID:???sub new {
my $pkg= shift;
my ($url) = @_;
my $bbs;
chomp($url);
my $this= bless {"OrgUrl"=>$url}, $pkg;
# $thisのその他の値の設定
…
return $this;
}
やりたいことはだいたいこんな感じなんだろうけど、一体どこを参考にして書いたの?
0600nobodyさん
2010/02/11(木) 10:00:20ID:???例えばlocal化されてない$_に代入してしまっているとか
0601nobodyさん
2010/02/11(木) 10:43:17ID:???オプションを何も指定せずに実行すると、横幅がオリジナルよりも2倍近く引き延ばされた状態で出力されてしまいます
これは何が原因でしょうか?
0603nobodyさん
2010/02/11(木) 17:12:52ID:???サーバー上でperl からphpファイルを実行するのはどうすればいいでしょうか
$ans = `php -f post.php`;
print $ans;
print system("/usr/local/bin/php -f /virtual/user/public_html/post.php");
my $PHP = '/usr/local/bin/php';
my $PHP_FILE='/virtual/user/public_html/post.php';
open FH, "$PHP -f $PHP_FILE|";
while (my $x = <FH>) {
print "$x\n";
}
close FH;
この3つ試したんですがphpのソースが表示されてしまいます
サーバーはcoreserverです
0604nobodyさん
2010/02/11(木) 17:55:06ID:???<? PHPコード ?>みたいな書き方が処理されてないだけでは?
0605nobodyさん
2010/02/11(木) 18:37:07ID:???0606nobodyさん
2010/02/11(木) 19:11:25ID:???core特有のCLI版PHPの呼び出し方の問題だからここの管轄でもなくて
レン鯖板の管轄だと思う。暇だからこれやる。
ttp://www.google.co.jp/custom?domains=sb.xrea.com&q=php+cli&sitesearch=sb.xrea.com&hl=ja
0607nobodyさん
2010/02/11(木) 19:53:29ID:???ありがとうこざいます
教えてもらったリンク先を参考に
/usr/local/bin/php5cli でできました!
皆様ありがとうこざいました。
0608nobodyさん
2010/02/14(日) 07:12:06ID:???上記のように書いてみたのですが、エラーが出ます。
二重にクウォートというのは出来ないんでしょうか?
外部コマンドでクォートを必要とする場合はどう記述すべきでしょうか?
0609nobodyさん
2010/02/14(日) 11:27:31ID:???エスケープしろよ
0610nobodyさん
2010/02/14(日) 11:33:14ID:???0611nobodyさん
2010/02/14(日) 11:43:44ID:???system("/usr/bin/hoge", "fuga fuga");
0612nobodyさん
2010/02/14(日) 12:26:01ID:???この板の人は本当に親切で助かります
ちょっとしたことも検索で見つけるのは難しいですね
0613nobodyさん
2010/02/18(木) 01:04:18ID:???use HTML::TreeBuilder;
my $html = get("http://xxxxx");
my $tree = HTML::TreeBuilder->new;
$tree->parse($html);
$tree->eof();
my $a = "東京";
my $b = "$tree->findとか色々やって最終的に 東京 をセット";
print "A $a B $b<br />\n";
print utf8::is_utf8($a) ? 'UTF-8 Flag' : 'not UTF-8 Flag';
print utf8::is_utf8($b) ? 'UTF-8 Flag' : 'not UTF-8 Flag';
-----------------------------------------
上記をCGI処理するとweb上の表示は
A 東京 B 東京
UTF-8 FlagUTF-8 Flag
となります。
両方utf-8のようなのですが、ソースを見ると下記のように2個目の東京が文字化けしています。
A 東京 B ?x6771;?x4EAC;
if( $a =~ /$b/ )としたいのですが、うまくいきません。
文字化け部分を戻したいのですがどうすればよいでしょうか?
htmlコードの取得先はヘッダがshift-jisでした。
※use Encode qw/ decode /; など色々試しましたがよくわからずうまくいきませんでした。
0614nobodyさん
2010/02/18(木) 03:16:49ID:???use HTML::Entities;
print "same.\n" if '東京' eq decode_entities('東京');
0615613
2010/02/18(木) 09:15:46ID:???できました!!
これができずに半日ずっとぐぐったり試行錯誤して結局できてなかったので助かりました。
自分だけでは数日はEntitiesにたどり着けなかったかもしれません。
ありがとうございました。
0616nobodyさん
2010/02/18(木) 18:04:59ID:???どうすればいいでしょうか?。。。
0617nobodyさん
2010/02/18(木) 18:10:31ID:???CPANに聞けや
0618nobodyさん
2010/02/18(木) 18:53:38ID:???0619nobodyさん
2010/02/20(土) 15:02:55ID:???一番目 %e6%9d%b1%e4%ba%ac
二番目 東京
となります。
�@一番目は『東京』となってほしいのですが、なぜ『%e6%9d%b1%e4%ba%ac』なのでしょうか?
�A『%93%8C%8B%9E』も『%e6%9d%b1%e4%ba%ac』もデコードサイトで変換したらどちらも東京になりました。URLエンコードには2種類あるのでしょうか?
�B二番目は『東京』ではなく『%93%8C%8B%9E』を期待したのですが、なぜエンコードしたのに『東京』なのでしょうか?
以上、3点についてわからないので教えていただけないでしょうか。
最終的に行いたいことは、URLから拾った文字と別から拾った文字をマッチするかの確認です。
#-------------------------------------------
use CGI;
use Encode qw/from_to/;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
my $query = new CGI;
my $item = $query->param('item');
my $encode = guess_encoding($item);
from_to($item, $encode->name, 'utf-8'); #$itemがSHIFTJISだったので変換
$item =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$item =~ tr/ /+/;
printf("<pre>一番目 %s</pre>\n",$item);
my $str = "東京";
$str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$str =~ tr/ /+/;
printf("<pre>二番目 %s</pre>\n",$str);
0620nobodyさん
2010/02/20(土) 15:19:00ID:???二番目はURLデコードじゃなくURLエンコードしないとそりゃ期待どおりにならんやろ
0621nobodyさん
2010/02/20(土) 15:46:06ID:???投稿されたメッセージから、半角英字を禁止したいと思い
if ($in{'message'} =~ /[a-zA-Z]/) {$flg = 1;}
としたのですが、これだと改行の<br>まで弾かれてしまいます。
そこで、bとrをのぞくように、次のようにしました。
if ($in{'message'} =~ /[(a|c-q|s-z)A-Z]/) {$flg = 1;}
これでも、bとrは除けるのですが、<br>だけを除く記述方法はありませんか?
よろしくお願いします。
0622nobodyさん
2010/02/20(土) 15:58:07ID:???0624nobodyさん
2010/02/20(土) 16:14:16ID:???/(?:^|[^a-zA-Z])(?:(?<!<)|(?!br>))[a-zA-Z]/
だった。
0625nobodyさん
2010/02/20(土) 16:21:22ID:???ありがとうございます。
出来ました!
と思ったら、確認画面にはうまくいけたのですが、そこから、投稿処理に入ろうと
すると、<>が<とかになるみたいで、投稿できませんでした。。
brだけ除外するには、
/\b(br)[a-zA-Z]/
とすれば良いのでしょうか。何度も質問してすいません。。
0626nobodyさん
2010/02/20(土) 16:48:32ID:???タグを禁止したいならbr意外も禁止しろ
お前みたいな奴がいると脆弱性付きの糞サイトが出来るんだよ
XSSでググれ
HTML::Entitiesとかで対策しろ
0627nobodyさん
2010/02/20(土) 17:05:45ID:???XSS対策は施されているフリースクリプトです。サニタイズされてます。
それを更に、スパム除けとして、半角英字を禁止したいと思ったまでです。
ただ、ユーザーがテキストエリアで、改行すると、それが改行タグになり、
半角英字として扱われ投稿できなくなるみたいで困ってたわけです。
>>622-623のヒントでなんとかやってみます。ありがとうございました。
0630629
2010/02/20(土) 18:37:42ID:???SPAM対策なら、画像でパスコード生成して入力させればいいさ。
0631nobodyさん
2010/02/21(日) 19:39:13ID:???0632619
2010/02/22(月) 00:59:57ID:???ありがとうございます。
先にURLデコードしましたが結果は同じでした。
下記を実行するとこのような表示になります。↓
(A番などは文字化けしていますが、一つ一つを見ると
93,8C,8B,9EとUTF8コードがきているように見えます)
http://www.rupan.net/uploader/download/1266767521.jpg
C番とD番の間はちゃんと『東京』と表示されるのですが、
同じものを表示したのにD番だと文字化けします。
うまくコード変換が出来ていないようです。
下記スクリプトは無視してもかまいませんので、
URLの引数をperl内のUTF-8にする方法を教えてください。
#-------------------------------------------
#ヘッダ部分は619と同じなので省略
printf("<pre>A番 %s</pre>\n",$item);
$item =~ tr/+/ /;
$item =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
printf("<pre>B番 %s</pre>\n",$item);
$encode = guess_encoding($item);
printf("<pre>C番 %s</pre>\n",$encode->name);
from_to($item, $encode->name, 'utf-8');
printf("%s<br />\n",$item);
printf("D番 %s<br />\n",$item);
printf("<br />\n");
0633nobodyさん
2010/02/22(月) 01:53:28ID:???use strict;
use utf8; # 619の(3)が起きるのはこれのせいなのに隠すな
use Encode;
use URI::Escape;
# print "Content-Type: text/plain; charset=UTF-8\n\n";
my $tokyo = '東京';
my @enc = qw(utf8 euc-jp shiftjis 7bit-jis);
printf "%s: %s\n", $_, uri_escape(encode($_, $tokyo)) for @enc; # これを何か勘違いしてる
print "\n";
$tokyo =~ s/(\W)/'%'.unpack('H2', $1)/eg;
print $tokyo, "\n";
utf8::encode($tokyo); # no utf8;
$tokyo =~ s/(\W)/'%'.unpack('H2', $1)/eg;
print $tokyo, "\n";
0634nobodyさん
2010/02/22(月) 03:50:14ID:???0635619
2010/02/22(月) 13:04:14ID:???ありがとうございます。
use utf8を入れていたのを記入漏れしていましたご指摘ありがとうございます。
書いていただいたコードを参考にすることで変換することができました。
また、参考コードは日本語を扱うときに色々確認できそうなので保存させていただきました。
ありがとうございます。
※最終的に下記のようになりました。
#----------------------------------
use utf8;
use Encode qw/from_to/;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
use URI::Escape;
#----------------------------------
#shiftjisをutf8に変換
my $encode = guess_encoding($item);
from_to($item, $encode->name, 'utf-8');
#----------------------------------
#URLデコード
$item =~ tr/+/ /;
$item =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
utf8::decode($item);
printf("<pre>文字列 %s</pre>\n",$item);
0636nobodyさん
2010/02/22(月) 16:00:00ID:???ローカルファイル2万行の処理時間が、1秒→13秒になりました。
(もし200万行の処理になると、単純計算100→1300秒・・・)
ネットワーク越しの処理とか、他にボトルネックがない場面で使うなって事なんでしょうけど、
ローカルファイル処理の進捗表示をしたい場合、皆様どうしてますか?
0637nobodyさん
2010/02/22(月) 16:08:56ID:???0638nobodyさん
2010/02/22(月) 16:17:37ID:???100かそこらだから、余計な更新をしなければそれ以上遅くなること
はないと思うが。
0639636
2010/02/22(月) 18:18:51ID:???端末上の表示です。
>>638
スクリプトの中身は、キーワードをハッシュキーにしてインクリメント、
最後にキーワードの総出現数を出力してるだけの簡単なものです。
while (<$fh>) {
処理
$hash{$_}++;
$term->update( $term->lastupdate + length $_ );
}
こんなカンジです。
0640nobodyさん
2010/02/22(月) 22:11:22ID:???毎回update呼ぶと効率悪いよ。マニュアルよく嫁。
特にA (much) more efficient updateのあたり。
0642nobodyさん
2010/02/24(水) 17:33:29ID:???・a.txtの中身
1
2
3
・b.txtの中身
1
3
4
上記のような状況で、「4(b.txtにあってa.txtにない行)」を取得したいのですが、
こういった処理でオーソドックスな方法はあるのでしょうか?
今のところwhileかforeachで各ファイルを一行ずつ読み取る事を考えているのですが…
ちなみに各ファイルはせいぜい十数キロバイト程度で、一日にせいぜい数回程度しか実行せず、
実行するマシンの性能も十分に高いのでメモリ消費などは無視出来るレベルです
0643642
2010/02/24(水) 18:04:59ID:???a.txt、b.txtそれぞれ生成時にソート済みで、
どちらもとあるディレクトリのファイルリストなのでファイル内で重複する行は存在しません
0644nobodyさん
2010/02/24(水) 18:33:43ID:???ソート条件があるならperlを持ち出すまでもなく
comm -13 a.txt b.txt
でいいと思うが、どうしても車輪を再発明したければ
1行ずつ読みながら比較でもいいし、a.txtをまとめて
ハッシュに読み込んでb.txtを読み出しながらハッシュに
なければ書き出しでもいい。
0645nobodyさん
2010/02/24(水) 18:56:55ID:???回答ありがとうございます
残念ながら、さしあたり実行環境はWindowsXPを予定しているので、
commコマンドは使えません
また、ゆくゆくは他のバージョンのWindowsやLinuxなどでも動作させる予定なので
可能な限りOSに依存しない方法を採用する必要があるのです
0646nobodyさん
2010/02/24(水) 19:02:38ID:???perl -lne 'BEGIN{ $i = 1 } $h{$_} += $i ; $i = 2 if eof}{ $h{$_} == 2 and print $_ for keys %h ;' a.txt b.txt
# $h{$_} == 1 a.txt のみ
# $h{$_} == 3 a.txt & b.txt
このワンライナー解読して適当にスクリプト化すれば?
0647nobodyさん
2010/02/26(金) 20:23:12ID:???同じスクリプトの挙動をその条件で変えたいんです
ただ、HTML側に細工をするのはちょっと難しいです
環境変数かなんかで分かればいいのですが・・・
0648nobodyさん
2010/02/26(金) 20:50:17ID:???0649nobodyさん
2010/02/26(金) 20:59:18ID:???0650nobodyさん
2010/02/26(金) 21:06:13ID:qFPnonZhそのファイルの中でどうゆう呼ばれ方をされてるのかを
調べればいいかなと
0651nobodyさん
2010/02/27(土) 02:04:01ID:???そうでないならJavaScriptでparentとか見て判定した方がいいな
0652647
2010/02/27(土) 02:37:15ID:???案を考えていただき、ありがとうございます
ただ、後付け条件で申し訳ないですが、呼び出し元は同一ドメインのスクリプト全てが想定され、
また、そのスクリプト群はユーザーがデータベースに保存したテンプレートを加工して出力します
なので、実質どんなHTMLが返ってくるかは分からないです
>>649,651
クエリは変わりますが、アクセス元のURL自体は有限なので
リファラと正規表現でなんとかなるような気がしてきました
ありがとうございます
0653nobodyさん
2010/03/03(水) 02:18:21ID:???主要部分はこんな感じです
================
$msg = new MIME::Lite(
From => (送信元),
To => (送信先),
Subject => 'HOGEHOGE',
Data => ''
Type => 'image/jpeg',);
$msg->attach('Type' => 'applocation/octet-stream',
'Encoding' => 'base64',
'Path' => 添付ファイルのフルパス);
================
これ実行すると、確かに指定したファイルが添付された状態で宛先に届くのですが
何故か0バイトのファイルも余計に一つついてきます
また、上記は空欄になっているDataオプションに任意の文字を入れると
0バイトのファイルが、その文字が書き込まれたテキストファイルに置き換わっています
この余分なファイルが無い状態でファイルを送りたいのですが、原因は何でしょうか?
0655nobodyさん
2010/03/03(水) 10:32:39ID:aprtMKKMwww.samohan.jp/cgi-bin/form.cgi
★買い物カゴシステムのPOST送信先(買物カゴ中身画面のアドレスと同じ)
https://www.jacky.jp/cgi/kago.cgi?user=samohan
とします。
htmlやphpのFORMで買い物カゴシステムへPOSTせずにform.cgiでPOSTデータをkago.cgiへ送信し、送信したらkago.cgiが表示する買物カゴ中身画面へと移動させたいです。
買物カゴシステムを乗り換えるときカンタン移行できるよう、ワンクッションかませたいとおもっているのです。
今はform.cgiでフォームを表示して「送信」ボタンを押してもらい、kago.cgiへPOSTしているのですが、押さずに済ませたいのです。
★form.cgi内のpost送信ソース
my $url = 'https://www.jacky.jp/cgi/kago.cgi?user=samohan';
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
my %formdata = ('user' => 'samohan', 'item' => $item, 'price' => $price, 'kazu' => $kazu);
my $request = POST($url, [%formdata]);
my $ua = LWP::UserAgent->new;
my $res = $ua->request( $request);
print $res->content;
としてみました。
しかし
★結果(www.samohan.jp/cgi-bin/form.cgiの結果表示画面)
Found
The document has moved here.
となります。
'here'はリンクとなっており、リンク内容は'http://www.samohan.jp/cgi-bin/kago.cgi?user=samohan'となっています、どうしていいのかわかりません、アドバイスよろしくお願いいたします・・・。
0656nobodyさん
2010/03/03(水) 11:43:47ID:???書き始めてわかったんですが、書けば書くほどコードがどんどん汚くなっていくような気がします
これはやはり初心者だからでしょうか?
上達してくるときれいなコードが書けるもんでしょうか
0657nobodyさん
2010/03/03(水) 13:20:30ID:???自分で見やすくするための決まりごとを作れば書けるようになる
自分が見やすいかどうかで判断すればいい
自分の見やすいコードは上達の手助けになる
他人のコードをいろいろ見比べてみれば自分の見やすいコードを決める材料になる
これはPerlに限ったことではない
0658nobodyさん
2010/03/03(水) 13:47:53ID:???一朝一夕にはいかないもんですね
0659nobodyさん
2010/03/03(水) 14:14:48ID:???0660nobodyさん
2010/03/03(水) 15:14:27ID:???お勧めの本を買って…って高っ!
図書館巡って探して、なかったら中古買って勉強してみます
0661nobodyさん
2010/03/03(水) 17:43:02ID:???引っ張り出す使いかたをしがちなので
図書館で借りるより古本でいいから常備するほうがいいと思うよ。
4,515円が高いかどうかは人それぞれだけど。
0662nobodyさん
2010/03/09(火) 09:40:49ID:JhJ16iiu自宅Windows(LibXML1.64)ではうまくいきますが、レンタルサーバの1.58では何も返されません。
[xml]
<root xmlns="foo:bar" hoge="fuga">
<name>yesman</name>
</root>
[perl](一部)
my $root = $doc->documentRoot();#=>XML::LibXML::Element
my $root_nodename = $root->nodeName();#=>'root'(正常に取得)
my $namespace = $root->getAttribute('xmlns');#=>'foo:bar'がとれない
my $attr_hoge = $root->getAttribute('hoge');#=>'fuga'(これは正常に取得)
LibXML.pmを見ると、名前空間に関してはそれ用のuseしたメソッドを呼んでいて、
サーバにインストールされているもともとのライブラリ(expat?)の問題なのかなと疑ってるのですが、
なにか情報ありませんか?
関連ですが
my @names = $doc->getElementsByTagName('name');
このコードも1.64では成功しますが1.58では空です。
自分で$namespaceに値を代入して(ハードコードして)
my $namespace = 'foo:bar';
my @names = $doc->getElementsByTagNameNS($namespace, 'name');
とすると取得できます。
0663nobodyさん
2010/03/09(火) 09:51:59ID:???CHANGESぐらい読めよ。
1.61のところに
- get/setAttribute(NS)? implementation made xmlns aware
とあるので、それ以前は対応してないと思われる。
0664662
2010/03/09(火) 10:33:34ID:???そうでしたか〜・・・
ノードをたどっていく分には名前空間の問題はないようなので、
当面その方法で対応してみようと思います。
ありがとうございました!
0665nobodyさん
2010/03/09(火) 13:41:19ID:IYkocy7Wサーバ上のファイル名を決め打ちすれば問題ありませんが、
my @files = $ftps->nlst("./dir");
foreach my $file (@files) {
next if $file =~ /^\.{1,2}$/;
$ftps->get("$file", "$hozondir/$file") or die "get failed ", $ftps->last_message;
}
のようにすると、
(Debug => 1)
>>> RETR readme.txt (←$file)
: No such file or directory
Can't get file: Bad file descriptor at C:\Documents.......
とエラーを返され、ローカルに空ファイル(readme.txt)が作成されて終了します。
決め打ちすれば問題ないので、配列のデータの扱い方?だと思うのですが、
どうしたら良いのでしょうか?
何かご助言お願いします。
0666nobodyさん
2010/03/09(火) 16:30:28ID:???$ftps=>getの行の上に
print $file, "debug print¥n";
してみりゃ、原因わかるんじゃね?
0667665
2010/03/09(火) 16:47:08ID:IYkocy7Wヒントありがとうございます。
Windowsといえば改行コードだと閃いて、以下一行追加したら正常に動きました。
@files = map { s/\r//g; $_ } @files;
0668nobodyさん
2010/03/09(火) 16:51:36ID:???0669665
2010/03/09(火) 23:23:47ID:???試した事を書くのすっかり忘れてました・・・すみません。
ちなみに
○ @files = map { s/\r//g; $_ } @files;
× @files = map { s/\n//g; $_ } @files;
× @files = map { s/\r\n//g; $_ } @files;
でした。なんだかよく分かりません・・・
0670nobodyさん
2010/03/10(水) 02:09:38ID:???0671nobodyさん
2010/03/10(水) 02:13:37ID:???0672665
2010/03/10(水) 12:22:41ID:???○ $file =~ s/\r//g;
○ $file =~ s/\r$//g;
× $file =~ s/\r\n//g;
× $file =~ s/\n//g;
× chomp $file;
$file .= "\n";
× @files = map { s/\r\n/\n/g; $_ } @files;
× @files = map { s/\r\n/\n/g; $_ } @files;
chomp $file;
○ @files = map { s/\r/\n/g; $_ } @files;
chomp $file;
どうやら配列には、\rだけが入ってるようです。(\r\nでも\nでもなく)
で、chompは\rを処理しないということでしょうか。
ちなみにNet::FTPでmy @files = $ftp->ls()した場合は、こういう改行コードの問題は起きません。
推測ですが、$ftp->ls()は改行処理してるけど$ftps->nlst()はしてなくて、
ActivePerlの改行自動変換で\n→\rになって配列に入れられるのかなと思いました。
0673nobodyさん
2010/03/12(金) 23:39:43ID:???[]の中を()で一まとめになるかと思ったのですが、やはり[]内は一文字に対してしかきかないのでしょうか?
解決できる正規表現はどのように書けばよいでしょうか?
@hoge = ("a---b---c","w---x---y---z");
foreach(@hoge){
if( /^[^(---)]+---[^(---)]+$/ ){
printf "typeA %s %s\n",$1,$2;
}elsif( /^[^(---)]+---[^(---)]+---[^(---)]+$/ ){
printf "typeB %s %s %s\n",$1,$2,$3;
}
}
と
0674673
2010/03/12(金) 23:48:42ID:???foreach(@hoge){
if( /^[^(---)]+---[^(---)]+---[^(---)]+$/ ){
printf "typeA %s %s\n",$1,$2;
}elsif( /^[^(---)]+---[^(---)]+---[^(---)]+---[^(---)]+$/ ){
printf "typeB %s %s %s\n",$1,$2,$3;
}
}
0675nobodyさん
2010/03/13(土) 00:26:20ID:???my @hoge = ("a---b---c","w---x---y---z");
for (@hoge) {
my @match= split(/---/);
if (@match == 3) { printf("typeA %s %s %s\n", @match); }
elsif (@match == 4) { printf("typeA %s %s %s %s\n", @match); }
}
0676nobodyさん
2010/03/13(土) 01:17:06ID:???[] は「マッチする文字を指定できる . 」であって、
文字列のグループ化ではない
http://perldoc.jp/docs/perl/5.10.0/perlretut.pod
http://perldoc.jp/docs/perl/5.10.0/perlreref.pod
そしてそういう処理は、フツーはこうする
my @hoge = ('a---b---c', 'w---x---y---z', '', '1', '2---3');
my @type = ('!', 'A', 'B', '?');
for my $hoge (@hoge) {
my @item = split /---/, $hoge;
pop @item;
print "type$type[$#item] @item\n"; # $" = ' ' の場合
}
for my $hoge (@hoge) {
my @item = split /---/, $hoge;
if (@item == 3) { printf "typeA %s %s\n", @item[0,1] }
elsif (@item == 4) { printf "typeB %s %s %s\n", @item[0..2] }
}
0677nobodyさん
2010/03/13(土) 03:25:52ID:???>>674
× /^[^(---)]+---[^(---)]+---[^(---)]+$/
◯/^([^-])---([^-])---([^-])$/
キャプチャしたい文字が各々単独一文字で無いなら、([^-]) を
([^-]+) とかに変えりゃいい。
typeB の正規表現も同じ事なので略。
ちなみに[^(---)] は、
・"(--" => "(" から "-" までの文字列(アスキーコード10進で、40 から 45 まで)
・次の "-" => "-" 。# => だけど上で既に含まれてる
・ ")" => ")" 。# => だけど既に含まれてる
上記の条件に合わないものにヒット
って意味。
perl -e ' ( chr $_ ) !~ /[^(---)]/ and printf "%s\t%s\n", $_, chr $_ for 0 .. 255 ;'
perl -e ' ( chr $_ ) !~ /[^a-c-e]/ and printf "%s\t%s\n", $_, chr $_ for 0 .. 255 ;'
とかやってみりゃ納得出来るかな。
0678nobodyさん
2010/03/13(土) 16:12:28ID:moD4aVFUどのライブラリを使用すべきでしょうか。
現状、LWP::UserAgentのファイル指定で単独ページの取得は成功してるのですが、
ディレクトリ指定ではインデックスページがとれるだけです。
0679nobodyさん
2010/03/13(土) 16:22:26ID:???0681678
2010/03/14(日) 14:52:56ID:???>>680のいうブラウザの場合は、ディレクトリへのアクセス時に一覧を作成してくれるから
こういうファイルがあるなということがわかって選択(取得)できると思うんですが・・・
0682nobodyさん
2010/03/14(日) 19:11:57ID:???こういうファイルがあるなということがわかれば
こういうファイルを配列に入れて
ループで回してLWP::UserAgentのファイル指定でこういうファイルの単独ページを取得する
0683678
2010/03/14(日) 21:06:20ID:???ループでというのはLWP::UserAgentのコードで多く見ました。
ですがいずれも、取得すべきURLが分っている前提のコードでした。
あるディレクトリ下に"こういうファイルがある"というのは
どのように知るのでしょうか。
0684nobodyさん
2010/03/14(日) 21:17:37ID:???0685nobodyさん
2010/03/14(日) 22:04:33ID:???それとも(人間様から見ても)不明なファイルの在り処を探りたいのか
どっちの問題なのかが分からんのう
前者ならHTML解析してURLを得ればいいって話だし
0686678
2010/03/14(日) 22:27:12ID:???なんとなく、うまく説明できていないでしょうか・・・
おそらく後者に近いのかもしれませんが、
ファイル名や構成がわからないディレクトリにアクセスして
中を検索の上、必要なファイル(あるいは全部)をとりたいだけなのですが・・・
0687nobodyさん
2010/03/14(日) 22:28:11ID:???0688nobodyさん
2010/03/14(日) 22:33:40ID:???0689nobodyさん
2010/03/15(月) 00:27:31ID:???スレ違いだけど、このままだと何回も質問しそうな気がするので説明をすると、
>>>680のいうブラウザの場合は、ディレクトリへのアクセス時に一覧を作成してくれるから
>こういうファイルがあるなということがわかって選択(取得)できると思うんですが・・・
これは、
1.ブラウザが/とかにindex ofページを置いているサイトからHTMLを取得する
(webサーバの設定でそういう表示設定をしているサイトがある)
2.そうすると帰って来たHTMLに<a>のリンクが並んでる
3.それをブラウザが表示する(ブラウザはそれぞれのファイルを取得してるわけじゃない。リンクを表示してるだけ)
(4.リンクをクリックすればファイルが取得できる)
ってことをやってる。
LWPができるのは1番で、「(2番の)HTMLが返って来たんならそのリンクをループで回して取ればいい」
って言ってるのが>>682
で、ブラウザの動きも2番のHTMLがあるからファイル一覧を表示できるのであって、
そういうサイトじゃなかったら(index ofを設定してないサイトだったら)表示できないよって話。
リンクもないのにサーバ上のファイルの場所がわかっちゃったらそのサイトは攻撃されるでしょ?
0690678
2010/03/15(月) 10:36:57ID:???おかげさまでどう取得すべきなのかわかりました。
初歩的な問いのつもりでいたのですが、こちらの知識不足により
突飛な発想になってしまっていたのですね。
その後、リンクを辿っていく(本来の)方法で解決できました。
ありがとうございました。
0691nobodyさん
2010/03/15(月) 12:42:45ID:???0692nobodyさん
2010/03/15(月) 23:14:53ID:???でどうなる
0693nobodyさん
2010/03/17(水) 16:12:18ID:???登録フォームからCGIでパラメータを取ってやってたのですが、上手く行かないので
最終的にMySQLターミナル上で有効なINSERT文を、そのままリテラルにprepareし、
ターミナルから"perl insert.pl"を実行したのですが、どうしてもレコードが追加されません。
# insert.pl
use strict;
use warnings;
use DBI;
my $data_source = "DBI:mysql:mydatabase:localhost:3306";
my $user = "user";
my $pass = "pass";
my $dbh = DBI->connect($data_source, $user, $pass,
{ RaiseError => 1, AutoCommit => 0 });
my $sth = $dbh->prepare("insert into table1 (名前) values ('ほげ')");
$sth->execute;
$sth->finish;
$dbh->disconnect;
[環境]
Fedora12(2.6.31.12-174.2.3.fc12.i686)
MySQL-5.1.42-2
Perl-5.10.1
DBI-1.609
getenforce -> Permissive
何かヒントをお願いします・・・
0694nobodyさん
2010/03/17(水) 16:42:17ID:???じゃない?
0696nobodyさん
2010/03/18(木) 00:26:44ID:???my @testArray;
my $testHash= { value=>0, name=>'テスト0' };
push (@testArray, $testHash);
my $testHash= { value=>1, name=>'テスト1' };
push (@testArray, $testHash);
これをdeepcopyしたいのですが、
my @testArray2 = @testArray;
だとshallowcopyになってしまうようです。
有識者の方、deepcopyの方法をご教授願います。
0697nobodyさん
2010/03/18(木) 00:36:33ID:w0JRv+Cl0698696
2010/03/18(木) 00:46:07ID:???ありがとうございます!試してみます。
後学のため、cpanモジュールに依存しないようなコーディングもご教授頂けたら幸いです。
0699nobodyさん
2010/03/18(木) 09:24:09ID:???はどうだろうか
0700nobodyさん
2010/03/18(木) 09:24:24ID:???Cloneはxsだからperlでどう書くかの参考にはしにくいけど、
Clone::PPはpure perlなので読んでみるといい。
0701nobodyさん
2010/03/18(木) 16:13:26ID:???Host: 192.16
Connection: close
User-Agent:
x-ModelName: pp-pppp
x-SDKVersion: 1.1.1
リクエストヘッダが上のようにあり、この中で特殊な、x-ModelName
の pp-pppp を取得したいと考えています。(クライアントからリクエストを受けた、
サーバー側で)
しかし、
ttp://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0#HTTP.E7.92.B0.E5.A2.83.E5.A4.89.E6.95.B0
をみますと、これに該当する環境変数がありません。
この場合、どうやって、pp-pppp を取得できますでしょうか?
0702nobodyさん
2010/03/18(木) 16:47:58ID:???環境変数の例なんかじゃなくてCGIの仕様を読むべきだな。
でもperlでCGI使うんならCGIモジュール使った方がいいんじゃ
ないか。headerメソッドってのが用意されてる。
0703nobodyさん
2010/03/18(木) 18:53:46ID:???ハッシュの要素にはスカラーしか存在しないと考えていいなら
@testArray2 = map{ { %$_ } } @testArray;
とか?
0704nobodyさん
2010/03/19(金) 02:13:52ID:???x-SDKVersionはとれてx-ModelNameだけがとれないのか、
環境変数の取得の仕方自体が分からないのか、どっち?
リクエストヘッダの内容は%ENVに入るんだから、普通に$ENV{x-ModelName}で取れるはずだけどね。
0705nobodyさん
2010/03/19(金) 15:01:50ID:???0706nobodyさん
2010/03/19(金) 16:49:50ID:???fetchrow_hashrefだと、カラム名の順番がバラバラになってしまいます。
カラム順をテーブル通りにする良い方法はないでしょうか?
0707nobodyさん
2010/03/19(金) 16:59:18ID:+1gTM2xb0710nobodyさん
2010/03/19(金) 22:07:21ID:???response.setHeader("Refresh", "15");
レスポンスヘッダを作成する方法は
Perl
ではどうやればいいでしょうか?
0712nobodyさん
2010/03/20(土) 02:35:36ID:???emacs?
eclipse?
0713nobodyさん
2010/03/20(土) 03:28:56ID:???0714nobodyさん
2010/03/20(土) 11:51:52ID:???最終的にファイル化するためにメモ帳使うぐらいかな
0715nobodyさん
2010/03/20(土) 12:20:32ID:???0716nobodyさん
2010/03/20(土) 13:53:37ID:???Perl書くのにどんなエディタ使ってる?
http://pc11.2ch.net/test/read.cgi/php/1014357485/
0717nobodyさん
2010/03/20(土) 15:56:20ID:???文字コードと改行コードは最低選べるエディタじゃないと
0718nobodyさん
2010/03/20(土) 15:59:35ID:???0719nobodyさん
2010/03/20(土) 16:25:03ID:???はあ?
FFFTPでアップすればなんか勝手にそういうのよくしてくれるだろ?
Linuxのサーバー使ったことない初心者ですか?w
0720nobodyさん
2010/03/20(土) 18:03:56ID:???これならメモ帳でも充分だな。
0721nobodyさん
2010/03/20(土) 18:33:08ID:???0722nobodyさん
2010/03/20(土) 20:13:06ID:VJC6JTjm0723nobodyさん
2010/03/20(土) 22:19:00ID:???Linux鯖使ったことない初心者じゃなければ
SSH+vimか、Samba or rsync, and so on+エディタでしょ。
0724nobodyさん
2010/03/20(土) 22:28:51ID:VJC6JTjm0725nobodyさん
2010/03/20(土) 22:30:19ID:???0726nobodyさん
2010/03/21(日) 10:16:56ID:???特定のサーバーの画像ファイルを定期的にコピーして取ってきているのですが一度 画像が壊れていることがありました。
画像の下半分がグレーになっていました。
is_successでチェックをしていたのですが、画像ファイルが完全に取得できたかは判断出来ないでしょうか?
codeを見て200だったらと改造しようかと思っていますが、この方法でエラーチェック出来るのか不安で
ほとんどの場合コピーに成功しているので再現が出来ていないです。
0727nobodyさん
2010/03/21(日) 11:05:05ID:???ステータス見てもその続きで届く画像が壊れてるかどうかはわからないよ。
0728726
2010/03/21(日) 11:45:10ID:???LWP mirror というのがあるようですがこちらはcontents-lengthなども比較してくれるようなので
ファイルが壊れてファイルサイズが違う場合のエラーはとれると考えてよいのでしょうか
0729726
2010/03/21(日) 12:05:21ID:???ダウンロードの処理自体は getstoreと同じという考えてあっていますか?
0730nobodyさん
2010/03/21(日) 18:55:46ID:???特定のメールアドレス宛にのみ、メールが送信できない状況ですが、
my $ret = $smtp->dataend();
で1が返ってきます。
これは正常に送信できているということで良いのでしょうか?
受信側の問題でしょうか?
0731nobodyさん
2010/03/21(日) 20:24:00ID:???たぶん550 mailboxが無いとかそんなエラーが書かれてるんじゃないかな
0732nobodyさん
2010/03/22(月) 14:13:32ID:???0733nobodyさん
2010/03/22(月) 15:53:22ID:???$string=~ s/((hoge))//;
にすればあら不思議、$2も使える
0734nobodyさん
2010/03/22(月) 17:06:11ID:2ZzVyfyyでどう?
0735nobodyさん
2010/03/23(火) 17:33:46ID:E0uSL26KRTF::Writerを使い、日本語を出力しています。
このモジュールに%sで出力すると、何故か「く」という文字が「,」に置き換えられてしまいます。
この不具合の解消法をご存じの方いましたら教えていただけませんか?
0736nobodyさん
2010/03/23(火) 21:42:53ID:22je5/ssあるファイルの一行が以下のようになっています。
[SA_Pre]perl[SA_BORY]hoge[SA_2323BO]
これをパターンマッチで「perlhoge」を抽出するようにしたい。[]で囲んだキーワードを取り除く
s/\[SA.*?\]//eで[]で囲んだキーワードを削除できません。
サクラエディタの置換機能なら、検索キーワードを「\[SA.*?\]」とすることでうまくいくようですが…
0737167
2010/03/23(火) 21:48:12ID:???0738nobodyさん
2010/03/23(火) 21:56:31ID:22je5/ssありがとう。感動しました
0740nobodyさん
2010/03/23(火) 23:24:25ID:LM1mmRsSじゃぁこれで
0741nobodyさん
2010/03/23(火) 23:32:04ID:???my @data;
$string =~ s/(hoge)/push @data, $1; ""/ge;
とか
0743nobodyさん
2010/03/24(水) 17:37:14ID:gXJd/117おぉ、やっと返信が!
環境はwindows vista、active perl version 5.10.1をソースコードに使ってます。
以下ソースコード(TestRTFWriter.pl)
--
&useRTFWriter();
sub useRTFWriter(){
use RTF::Writer;
my $rtf = RTF::Writer->new_to_file("RTFsample.rtf");
$rtf->prolog('fonts' => ["MS Pゴシック"]);
$testStr = "くが表示できません。";
$rtf->printf(\'{\fs40 %s}',$testStr);
$rtf->print("\n\n");
$rtf->close;
}
--
そんでRTFSample.rtfの内容
?¬が侮ヲできません。
--
他の文字も化けてるね。。
0744nobodyさん
2010/03/24(水) 17:55:26ID:JL5BpxOEhttp://douseidoumei.com/perlman2/
0745nobodyさん
2010/03/24(水) 19:02:04ID:???use utf8;
を先頭につけて文字コードをutf8にして保存するのが無難な気がするなぁ
use Encode;
$testStr = decode('sjis', "くが表示できません。");
でやってみたんだけどダメだった。
これはこれで誰か知ってたら教えて欲しい
==== utf8版Dump
PV = 0xa74bdc "\343\201\217\343\201\214\350\241\250\347\244\272\343\201\247\343
\201\215\343\201\276\343\201\233\343\202\223\343\200\202"\0
[UTF8 "\x{304f}\x{304c}\x{8868}\x{793a}\x{3067}\x{304d}\x{307e}\x{305b}\x{3093}\x{3002}"]
==== Encode版Dump
PV = 0xb3a2ec "\343\201\217\343\201\214\344\276\256\357\275\246\343\201\247\343
\201\215\343\201\276\343\201\233\343\202\223\343\200\202"\0
[UTF8 "\x{304f}\x{304c}\x{4fae}\x{ff66}\x{3067}\x{304d}\x{307e}\x{305b}\x{3093}\x{3002}"]
0746743
2010/03/24(水) 21:28:05ID:???utf8にしたら上手く行きました。
ありがとう。
自分の環境でもencode版はだめでした。
後学のためになぜUTF-8だと上手く行くのか(UTF8と他の文字列の違い)を教えてくれませんか?
UTF-8は2バイト文字っていう認識しかないんだけど。
0747nobodyさん
2010/03/25(木) 00:26:57ID:2wRnf0pFファイルを処理する際、ファイルの先頭から一行ずつ処理していくのが一般的ですが
これを2〜3行ずつ読み込んで処理することは可能でしょうか。
たとえば以下のようなプログラムを処理した場合
---------------------------
#include <stdio.h>
int main(void)
{
return 0;
}
-------------------------
// int main(void)
// {
// return 0;
// }
-------------------------
といったように特定の関数をコメントアウト化したいです。
0748nobodyさん
2010/03/25(木) 01:09:18ID:???そのコメントアウト化ってどういうアルゴリズム?
ルールさえ決まってるなら1行ずつ処理していく方法でも上手くいきそうな気がするけどそれじゃダメそう?
0749nobodyさん
2010/03/25(木) 01:16:51ID:???0750nobodyさん
2010/03/25(木) 09:47:05ID:???my $file = <$fh>;
これでファイルが丸ごとスカラに入る。
0751nobodyさん
2010/03/25(木) 11:11:15ID:???use CGI::Lite;
を付け加えると、
下記のエラーが出ます。
どうすれば解決できますか?
[user@aaa ~]$ ./test.pl
Can't locate CGI/Lite.pm in @INC (@INC contains:
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl
/usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .)
at ./Extension_Mobility_test2.pl line 30.
0753nobodyさん
2010/03/27(土) 12:20:26ID:???CGI::Lite をCPANからDLして、
http://search.cpan.org/dist/CGI::Lite/
使いたいCGIのあるディレクトにCGIってフォルダ作って中にLite.pm置くだけで使えるんじゃね?
試してないけど。
0754nobodyさん
2010/03/27(土) 13:37:23ID:???依存関係がうんぬん
0755nobodyさん
2010/03/27(土) 13:42:43ID:???CGIのサブセットっぽいから動くんじゃね?
use libしなくても実行ファイルのルートからはたどってくれなかったっけ?
0756nobodyさん
2010/03/29(月) 09:22:31ID:???コマンドラインで試すときとCGIとして起動されるときは
また環境が違うから、置き場所決めてuse libしといた
方がいいんじゃないかな。
0757nobodyさん
2010/03/29(月) 14:57:28ID:???LWP::UserAgent->new;
を使っているのは理解しております。
HTTP::Requestもプログラム中では使っていますが、
なぜ、モジュール利用の宣言で
use LWP::UserAgent;
だけで、
use HTTP::Request;
となっていないのでしょうか?
0758nobodyさん
2010/03/29(月) 15:23:53ID:???0759nobodyさん
2010/04/02(金) 14:04:38ID:???0761nobodyさん
2010/04/02(金) 15:33:40ID:???イメージは下記のようにしたいのですが、エラーになります。
my $a = "aaa/bbb/ccc";
$a =~ sm|aaa/bbb|zzz|g;
0762nobodyさん
2010/04/02(金) 15:44:52ID:???sm///演算子なるものはない。
s///のセパレータに/以外を使いたいという意味なのか?
であれば、s|aaa/bbb|zzz|g でよいのではないか?
0764nobodyさん
2010/04/02(金) 16:44:23ID:???0765nobodyさん
2010/04/02(金) 20:09:24ID:TSIkzIjB0766nobodyさん
2010/04/03(土) 02:45:47ID:???0767nobodyさん
2010/04/03(土) 18:36:58ID:???〜内容〜
==============================
テキストファイルに上記のように囲まれた部分があり、HTML として整形して
表示する際にこの部分を blockquote で囲んで出力したいと思ってます。
単純に 「===」 を </blockquote> にしたら、1行目でいきなり閉じちゃうので駄目でしたw。
今は1行目をテキストファイルに存在しえない様な文字列に置換してから、
「===」 を </blockquote> に置換してから、1行目を置換するといったことをやってます。
しかしどう考えても正規表現で1行で済むように思えてならないんです。
ちなみに 「=」 の個数は2〜3ほどのバラつきがあります。
0768nobodyさん
2010/04/03(土) 18:53:47ID:???内容中に=がないことが前提だが。
use utf8;
use Encode;
$str = <<EOF;
<更新情報>========================
〜内容〜
==============================
EOF
$str =~ s|=+([^=]+)=+|<blockquote>$1</blockquote>|sg;
print $str;
0769nobodyさん
2010/04/03(土) 20:22:50ID:???使わせていただきます m(_ _)m
0770nobodyさん
2010/04/03(土) 21:16:07ID:???(<更新情報>[=]+.*?=[=]+)
=[=]+ とやらずに [=]+ とすると文字化けするので、こうなった次第。
euc-jp をやめて utf8 にした方がいいのだろうか?
0771nobodyさん
2010/04/03(土) 21:17:14ID:???下記の考え方であってますでしょうか。
当たりカードを20枚発行し、100枚の中から抽選して一つでも
発行カード番号が入っていれば当選、としたかったのですが、
スマートな方法が見つからなかったので、このように書いて
みました。
# $rate%の確率で当選者が決定。
my $rate = 20;
# 抽選カード番号を100枚の中から発行
my $rand_num = int((rand(100))) + 1;
# 抽選カード番号が設定値($rate)以下であれば当たり(1〜$rateまでに含まれている)。
if($rand_num <= $rate){ 当選処理; }
0772768
2010/04/03(土) 22:13:10ID:???Perlは内部ではutf-8を扱うのが基本
ソースももちろんutf-8
そして
use utf8;
という一文を最初のほうに加える (こうしないと2バイト文字を2文字としてカウントしてしまう)
入力と出力もutf-8であるべきだけど、
もし他の文字コードを用いたい場合には Encode.pm でデコード・エンコードしてやり、
常に内部ではutf-8を扱っている状態にしてやるのがよい
あと内部で扱う utf-8 と入出力で扱う utf-8 は別物だったりするので要注意
0774nobodyさん
2010/04/03(土) 22:52:36ID:???ENV{'HTTP_HOST'}の有無で判別しても問題はないでもんでしょうか?
0775nobodyさん
2010/04/03(土) 23:02:47ID:???'1' => { 'name' => 'TEST1', 'url' => 'http://〜', 'file' => 'test1.txt' },
'2' => { 'name' => 'TEST2', 'url' => 'http://〜', 'file' => 'test2.txt' },
'3' => { 'name' => 'TEST3', 'url' => 'http://〜', 'file' => 'test3.txt' }
};
foreach my $targetinfo (sort keys(%{$urldata})){
my $req = HTTP::Request->new(GET => $urldata->{$targetinfo}->{'url'});
上記のようなことをしたら
index.cgi: Argument "" isn't numeric in sprintf at [PATH] line 45.
とエラーが出たのですが、今いじってるスクリプトに sprintf を使っていないのでエラーの言ってる意味がわかりません。
それとも、そもそも間違ったことをしてるのでしょか?
0776nobodyさん
2010/04/03(土) 23:18:09ID:???ごめんなさい別のファイル見てましたw
質問の仕切り直しです。
@mediainfo = map { $_->[0] } sort { sprintf("%02d", $a->[3]) cmp sprintf("%02d", $b->[3]) || $b->[2] cmp $a->[2] } map { [$_, split /\t/] } @mediainfo; # レギュラー (曜日設定) と日付でソート
こうしたとき、[3] には曜日を表す 0-7 の数字が入ってるのですが、毎週無い予定に関しては曜日設定を入れてません。
そこで sprintf でエラーが出てる状況です。
split した結果、配列の中で値の無い部分に対して 0 を代入することって出来るのでしょうか?
データに -1 でも入れておけと言われればそれまでなのですがw
0777nobodyさん
2010/04/03(土) 23:27:56ID:???それ、エラーじゃなくてwarning。
その後、文字列"00"としてちゃんと実行はされている。
どうしてもその表示を消したければ、その部分で
no warnings "numeric";
0778nobodyさん
2010/04/03(土) 23:43:36ID:???0779nobodyさん
2010/04/03(土) 23:59:36ID:???@mediainfo = map { $_->[0] }
sort { sprintf("%02d", ($a->[3] ? $a->[3] : 0)) cmp sprintf("%02d", ($b->[3] ? $b->[3] : 0)) || $b->[2] cmp $a->[2] }
map { [$_, split /\t/] } @mediainfo; # レギュラー (曜日設定) と日付でソート
こうしました。
強引且つ見栄えが汚いですがww
0780nobodyさん
2010/04/04(日) 00:13:51ID:???とかでいいじゃん
あと @mediainfo の要素数がかなり多いようだったら sprintf とかは事前にすませといて sort ブロックの中はなるべく単純な比較だけにするようにしたほうがいいかも
0781nobodyさん
2010/04/04(日) 13:38:51ID:???0782nobodyさん
2010/04/06(火) 18:12:36ID:???open(INFH, '<', $config->{'file_mailform_config'});
my $config;
my $cnt = 0;
while (my $line = <INFH>){
chomp $line;
my ($tmpNAME, $tmpTITLE, $tmpALLOWVAL) = split(/\t/, $line);
$config->{$cnt}->{'name'} = $tmpNAME;
$config->{$cnt}->{'allowval'} = $tmpALLOWVAL;
$config->{$cnt}->{'title'} = $tmpTITLE;
$cnt++;
}
close(INFH);
この様にデータ内容を読み込んで、データの1行目はヘッダなので
undef $config->{0};
として削除したつもりでしたが、
foreach my $inputitem (sort keys %{$config}){
print "$config->{$inputitem}->{'name'}<br>\n";
}
としたら、1行目があった場所 (undef する前に表示されてた場所) が空行で出力されました。
undef では連想配列の要素を削除することは出来ないのでしょうか?
undef を外すとヘッダ行が表示されます。
0784nobodyさん
2010/04/06(火) 18:55:48ID:???無事、期待度通りの動作になりました。
0785nobodyさん
2010/04/07(水) 23:42:24ID:???にて
Software error:
This Perl not built to support threads
とのメッセージ
さくらのレンタルサーバーなんですがthreadsはサポートしてないのでしょうか・・・
0788nobodyさん
2010/04/14(水) 01:52:36ID:???my @check = $self->query->param('check');
foreach $temp(@check){
print $temp;
}
チェックボックスを何箇所チェックしようが、一つ目の値しか取り出せません。
URLにはキチンと &check=xxx&check=yyy〜 と渡ってきているように見えるのですが、、、
0789nobodyさん
2010/04/14(水) 01:53:37ID:???0790788
2010/04/14(水) 02:06:40ID:???どういうことでしょうか?
foreach $temp(@check)の部分で配列から1要素取り出せてるので[]は必要ないという認識なんですが、
間違ってますか?
0791nobodyさん
2010/04/14(水) 02:20:18ID:???0792788
2010/04/14(水) 02:30:47ID:???という形で渡せればいいということでしょうか?
試してみましたが、
my @check = $self->query->param('check')
で値がひとつも取れなくなりました。。。
というか、基本的なことなんでしょうがググっても情報得られず。。。
調べ方が悪いのかな・・
0793nobodyさん
2010/04/14(水) 02:49:00ID:???0795788
2010/04/14(水) 03:23:59ID:???my @check = $self->query->param('check');
print "@check";
見事に一つ目しか取れてませんね。。。
0796nobodyさん
2010/04/14(水) 03:56:01ID:???my $q = new CGI;
my @check = $q->param('check');
foreach $a(@check) {
print $a . "<br>\n";
}
とりあえずこれは動くんだけど、CGI::Applicationだとだめなんかね
0797788
2010/04/14(水) 04:00:45ID:???うーん、、、一つ目しかとれないっすね。。。
HTML部分が悪いんでしょうか?
<input type="checkbox" value="xxx" name="check"/>
<input type="checkbox" value="yyy" name="check"/>
HTML部分はこんな感じです。
0798nobodyさん
2010/04/14(水) 04:17:49ID:???でやってんでしょ?
なんでいまさらHTMLを疑うのか。。
0800nobodyさん
2010/04/14(水) 04:27:42ID:???久しぶりにPerlインスコして書いてみたら動いたというだけなので、これ以上はサポートできず申し訳ない
環境はWS2003+IIS6+Perlis.dll
0801788
2010/04/14(水) 04:33:19ID:???どうにもならなかったので力業ですが解決させました。
name要素をcheck_1,check_2に変更した上で、
my $i = 0;
while ($self->query->param("check_$i")) {
# 処理
$i = $i + 1;
}
とすることで無事に取り出せました。
解決しましたが頭の中は?でいっぱいでございます。。。
ありがとうございました。
0802nobodyさん
2010/04/14(水) 22:49:50ID:???CGI::Applicationの方はhashにしか対応してないからじゃない??
Applicationは使ったことないからどういう使い方をするのかあまり知らないが、
そもそも重複したparam名を使用すべきではないとか。。
CGI::Application こっちのsub array はハッシュのみ。
http://cpansearch.perl.org/src/MARKSTOS/CGI-Application-4.31/lib/CGI/Application.pm
CGI.pm こっちのsub paramは、arrayに対応。
http://cpansearch.perl.org/src/LDS/CGI.pm-3.49/lib/CGI.pm
0803nobodyさん
2010/04/14(水) 23:02:13ID:???>>796がうまく動かないらしい。
まぁ何かの間違いだと思うけど
0804nobodyさん
2010/04/23(金) 00:45:52ID:???それぞれ先頭から順番に値がセットになるような感じで並んでいたとします
また、それぞれに同じ値はないものとします
配列Aから条件式でマッチングを行い
必要なデータを取り出します
この条件式は配列Bでは使えないのですが
同じ条件で配列Bから抜き出すにはどうしたらいいでしょうか?
@a = (あ,い,う,え,お);
@b = (1,2,3,4,5);
@aのみ条件式でマッチング
最終的に
あ&1、う&3、お&5
みたいな感じで取り出したいんです
0805nobodyさん
2010/04/23(金) 01:01:20ID:???0806nobodyさん
2010/04/23(金) 01:04:47ID:???マッチング時に要素番号と要素をセットにした連想配列を作って
さらにその連想配列のkeyでループを回せばいいんじゃないかな
0807nobodyさん
2010/04/23(金) 01:06:19ID:???0808nobodyさん
2010/04/24(土) 20:33:36ID:???my @array = qw(1 2 3 4 5);
say "found!(1)" if 3 ~~ @array;
say "found!(2)" if @array ~~ 3;
上記で「found!(1)」しか出力されません。
スマートマッチは可換ではないのでしょうか?
0809nobodyさん
2010/04/24(土) 23:01:11ID:???0810808
2010/04/25(日) 14:09:14ID:???ttp://perldoc.jp/docs/perl/5.10.0/perlsyn.pod
ここにも。
use 5.010;
my @array = qw(1 2 3 4 5);
my $number = 3;
say "found!(1)" if $number ~~ @array;
say "found!(2)" if @array ~~ $number;
say "found!(3)" if grep $_ == $number, @array;
0811nobodyさん
2010/04/25(日) 14:27:40ID:???演算子が増えるとわくわくするよねw
0813nobodyさん
2010/04/25(日) 19:58:29ID:???それ普通に実行されるけど・・・
ちなみにうちの環境
v5.10.0 built for MSWin32-x86-multi-thread
Binary build 1004 [287188] provided by ActiveState
Built Sep 3 2008 13:16:37
0814812
2010/04/25(日) 21:00:28ID:???http://search.cpan.org/~dapm/perl-5.10.1/pod/perl5101delta.pod#Changes_to_type-based_dispatch
> Changes to type-based dispatch
> The smart match operator ~~ is no longer commutative.
0815nobodyさん
2010/04/25(日) 21:50:33ID:???evalで囲っただけじゃOracleの戻りを待っちゃってうまい実装を探してます。
0816nobodyさん
2010/04/26(月) 00:42:37ID:???eval {
local $SIG{ALRM} = sub { die 'timeout'; };
alarm 10;
# ディスパッチ
alarm 0;
};
unless ($@ =~ /timeout/) {
}
0817808
2010/04/26(月) 03:49:45ID:???>>813
>>814
ありがとうございます。
スッキリしました。( ^ー゚)bグッ!
ちなみに私のは、
v5.10.1 built for MSWin32-x86-multi-thread
Binary build 1007 [291969] provided by ActiveState
Built Jan 26 2010 23:15:11
です。
0818nobodyさん
2010/04/26(月) 12:44:34ID:???そです。
でもその実装だと10秒でdieしてくれなくてOrcleから処理が戻ってきてからじゃないとハンドリングできないんですよ。
0819nobodyさん
2010/04/26(月) 13:04:32ID:???DBIのマニュアルにまさしくDBD::Oracleだとうまくいかないからこうしろってのが
書いてあるのでためすといいよ。
0820nobodyさん
2010/04/30(金) 10:50:25ID:???内容的には非常に単純で
<hoge>テスト</hoge>
とすると、
<font style="font-size:x-large">テスト</font>
のように置換するだけです。
ここでみなさんにお伺いしたいことは
テストの文字を取得して加工する
というものです。
以下のような式を考えましたが、
($art) = $mes =~ /<hoge>(.*?)<\/hoge>/;
if($art){
$mes =~ s/<hoge>(.*?)<\/hoge>/<span style=\"font-size:140%;\">$art<\/span><span style=\"font-size:180%;\">$art<\/span>/g;
}
一回の書き込みの中で2回使用しようとすると、
2回目の方まで一回目の内容で適用されてしまいます。
↑よくよく考えてみれば、当たり前ですが。
なんとか、一回の書き込みの中で複数回使用できるようにしたいのですが、
どのようにすればよろしいでしょうか?
宜しくお願い致します。
0821nobodyさん
2010/04/30(金) 10:58:23ID:???0823nobodyさん
2010/04/30(金) 22:13:35ID:???表示用とは別に保存しておくといいよ
0824nobodyさん
2010/05/01(土) 04:35:43ID:???下記で取得が行えません。
my $q = new CGI();
my $fh = $q->upload($fieldname);
my $mime =uploadInfo($fh)->{'Content-Type'};
エラーログには下記がはかれていました。
Premature end of script headers:
Can't use an undefined value as a HASH reference at /image line 82, <DATA>
他にもContent-Typeを取得する方法があればそれでもいいのですが、
このエラーも解決してみたく持ってますので、ご教示いただけますと
幸いです。
0825nobodyさん
2010/05/01(土) 05:00:33ID:???0827nobodyさん
2010/05/01(土) 07:52:23ID:???my $mime = $info->{'Content-Type'};
ようわからんけど uploadInfo から帰ってきた値が undef だと言われてるみたいだけど
0828nobodyさん
2010/05/01(土) 09:41:14ID:???moduleのドキュメント見てみたけど、
uploadInfoに渡すのはfile handleじゃなくファイル名じゃないとダメなんじゃない?
[module doc]
$filename = $q->param('uploaded_file');
$type = $q->uploadInfo($filename)->{'Content-Type'};
unless ($type eq 'text/html') {
die "HTML FILES ONLY!";
}
0829824
2010/05/01(土) 18:35:17ID:???これってフォームからアップロードされた画像を対象にContent-typeの
取得を行うんですね。。根本的に間違えてました。。
指定した画像のContent-Typeを取得する簡単な方法はないもので
しょうか。
拡張子がgifなのに実際はpngであったりとするケースがあるため、
Content-Typeで判定をしたいのですが、ご存知でしたらどうか
教えてください。
0830nobodyさん
2010/05/01(土) 19:30:27ID:3heBO4S1それってUploader云々ではなくて、例えばローカルとかに保存してあるファイルのことかい?
だったらGDでもImage::Magicでも使って、画像を判定すればいいんでね。
まあヘッダの数十〜百バイト程度の判定で済むから、自前でバイナリ読んで解析するとかもあり。
(GDではWindows-bmpに未対応なので、以前自分で書いた)
0831nobodyさん
2010/05/01(土) 20:59:59ID:???はい、そうです。
Image::Magickはサーバに入れられなかったので、GDで
できる方法があれば教えていただけますと幸いです。
よろしくお願いいたします。
0832nobodyさん
2010/05/01(土) 21:32:17ID:???ttp://labs.gmo.jp/blog/ku/2007/05/8.html
phpだがperlに応用可能だろう
0833nobodyさん
2010/05/01(土) 22:50:54ID:???ただ、PNG が無いっていうw
0834nobodyさん
2010/05/01(土) 23:06:47ID:???モジュールあるのね
そこそこ設定の揃ってるマジックファイルって、誰か配布して無いっすかね
0835nobodyさん
2010/05/02(日) 02:25:22ID:???ありがとうございます。
勉強になりました。
最終的には、MMagicを使用させていただきました。
これ便利ですね。
この場をお借りし御礼申し上げます。
0836nobodyさん
2010/05/10(月) 14:42:47ID:???$q = new CGI;
@hoge = $q->param('hoge');
@hoge = ("hoge", "hogehoge")
と同じ方法をCGI.PMをもちいらないで出来ませんか?
read(STDIN, $q, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $q);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
@FORM{$name} = $value;
}
@FORM{$name} = ("hoge", "hogehoge")
みたいな感じで
0837nobodyさん
2010/05/10(月) 14:45:58ID:???0838836
2010/05/10(月) 18:06:05ID:???@pairs = split(/&/, $q);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
push(@hoge, $val) if $key =~ /hoge/;
@FORM{$name} = $value;
}
で自己解決しました。
お邪魔しました。
0839836
2010/05/10(月) 18:07:53ID:???だった。
0840nobodyさん
2010/05/10(月) 20:01:30ID:???0841nobodyさん
2010/05/12(水) 14:33:57ID:l5g8HUnE文字化けしています。どうすれば良いのでしょうか。
Perlのソースに記述した漢字は、パソコンのテキストエディタ表示、
IE上のフォーム表示、サーバのファイル上のいずれでも文字化けして
いません。
フォームを表示するhtmlの<meta>タグではShift-JISを指定しています。
よろしくお願いします。
0842nobodyさん
2010/05/12(水) 21:13:03ID:???ソースが無いことにはなんとも
0844nobodyさん
2010/05/14(金) 23:42:43ID:???変換?してたような気がするんですけど、なんでしたっけ?
ちなみに GD 使ってます
0846nobodyさん
2010/05/15(土) 00:26:24ID:???GD にメモリの中にあるバイナリを GD と結びつける方法は無いのかしら?
一旦ファイルに書き出さないと駄目な感じなんですかね・・・
0847nobodyさん
2010/05/15(土) 00:35:15ID:???SEE GD Manpage
>Alternatively, you may create a GD::Image object based on an existing image by providing an open filehandle, a filename, or the image data itself.
0848nobodyさん
2010/05/15(土) 00:52:53ID:???「ファイルから読め」
って事っすね orz
0849nobodyさん
2010/05/15(土) 02:58:47ID:???〜 ファイル名 $tmp_filename で画像を作る処理 〜 省略 〜
my $imgbin = GD::Image->new($tmp_filename);
こうやるとエラーログに
[Sat May 15 02:42:21 2010] index.cgi: Use of uninitialized value $pkg in concatenation (.) or string at /perl/lib/Symbol.pm line 129.
が出てきます。
Symbol.pm の 129 行目を含む関数は qualify なんですが、 GD.pm のソースを見ても qualify が有るわけも無く、デバッグしようにも負えません。
GD::Image->new($tmp_filename); に必要な引数があるのかと思って、CPAN の GD とこを見ても、サンプル自体がこういう記述の仕方。
コレって解決方法無いんでしょうか?
0850nobodyさん
2010/05/15(土) 13:25:56ID:???これでファイルの読み込みしなくて済むようになった
ImageToBlobみたいのがあるかと思ったら、そのままGDに投げてよかったんですね
0852nobodyさん
2010/05/15(土) 20:30:59ID:???↑
これか!
言われて今気が付いたw
0853nobodyさん
2010/05/15(土) 23:27:44ID:???なぜURLエンコードが必要が教えて下さい
0854nobodyさん
2010/05/16(日) 02:50:47ID:???0856nobodyさん
2010/05/16(日) 08:23:36ID:???あるよ↓
OK World - ?? ???? ?? ?? ??
http://world.okwave.jp/korean/
0857nobodyさん
2010/05/16(日) 18:26:33ID:GMFXnF2Imy $method = 'POST';
$request = HTTP::Request->new( $method, $uri,$header,$xml); --�@
POSTする際に、BASIC認証が必要なのですが、
別のモジュールでいう、
$req->authorization_basic("username","password");
的なことを、
use HTTP::Request;
を使って行いたいと思っています。つまり、�@に追加して認証を行わせたいと思っています。
http://search.cpan.org/~gaas/libwww-perl-5.836/lib/HTTP/Request.pm
何か方法はありますでしょうか?
0858nobodyさん
2010/05/16(日) 19:17:21ID:???http://search.cpan.org/~gaas/libwww-perl-5.836/lwpcook.pod#ACCESS_TO_PROTECTED_DOCUMENTS
0859nobodyさん
2010/05/16(日) 22:43:32ID:GMFXnF2IB(AP SERVER)
A-B 間は、HTTPプロトコルでXMLをやり取りするシステムだとします。
この際、AからBに何らかのXMLを送られてきたときHTTP GET で、
Bには、http://www.geekpage.jp/programming/perl-network/lwp-useragent-0.php
のプログラムがあり、BのAPサーバー上で 上のプログラム.pl とすると、期待通り、htmlファイルを
すべて画面に表示します。
さて、クライアントAから上のCGIにアクセスがあったとき GET でhoge.cgi としてクライアントからサーバーにアクセスします。上の結果をA(クライアント)に帰してやりたいと考えています。
具体的には、AからのレスポンスのXML内に埋め込んでやりたいと考えています。
どうやれればいいでしょうか?
もう少し言うと、
APからのサーバのレスポンスは、
HTTPレスポンスヘッダと、
<XML1>
ここに取得した情報を書きたい
<XM1>
このレスポンスを返したいと思います。
0860nobodyさん
2010/05/17(月) 04:32:17ID:???/img/5/a/7/d/20304495.jp
みたいにすることがありますが、これって技術的な名前ってあるんでしょうか?
ディレクトリ 分散化 でググっても知識として手に入れる例とかが出てこないので・・・
0861nobodyさん
2010/05/17(月) 10:48:50ID:???例えば、はてなブックマークのスクリーンショットはSHA-1で正規化したコードを
ディレクトリとファイル名に使ってる。
0863nobodyさん
2010/05/17(月) 12:40:45ID:???自分が作るサービスに数万ものユーザーが来るわけではないですが、それを見越した設計をするのが良いのかなと思ってたとこでの質問でした。
1時間に数百ものファイルが投稿されたら、1つのディレクトリに1万ものファイルとか余裕でたまるわけで、
全てのサーバーが新しいファイルシステムを採用してるわけではないので、1つのディレクトリあたりのファイル数を
1万未満に制限し、あふれたファイルは別のサブディレクトリというのを考えてます。
純粋に http://〜.com/files/2010/05/17/hh_xxxxxx.xxx の様にしてもいいのかなと思いましたが、
記念日の0時、例えば正月なんてそれで足りるとは思えませんしw
だったら http://〜.com/[a-z]/[a-z]/[a-z]/[a-z]/[a-z]/ のようなディレクトリを先に作ってしまい、偏らないように分散出来ないものかな?
などなど思ってたりするわけです。
ここまで書いて思ったけど、perl の話じゃなかった・・・
0864nobodyさん
2010/05/17(月) 17:36:43ID:???すごく・・・ガッカリです・・・
0865nobodyさん
2010/05/17(月) 23:55:28ID:OKXaqr1FXML::ATOMって多くのモジュール入れるみたいで、エラーになります。環境は普通のWinXPです。
0866nobodyさん
2010/05/18(火) 01:44:50ID:???0867nobodyさん
2010/05/18(火) 01:49:44ID:???0868nobodyさん
2010/05/18(火) 06:45:19ID:???だから俺は使ってない
あとこいつマルチだな
0869nobodyさん
2010/05/18(火) 07:30:05ID:???SHA-1として生成した文字列があった場合、色んなディレクトリにバラけると思うが、
SHA-1から得たディレクトリに収めようとして、そのディレクトリがすでに10000を超えようとしてたら
どうやって違うSHA-1の文字列を得るの?
再生成事態があってはならない事だと思うのだけど?
0870nobodyさん
2010/05/18(火) 14:02:13ID:???頭から一桁ずつ6階層のフォルダを作るだけで16777215通りにバラけるだろ
必要に応じてもっと深くしてもいい
なんでそんなことも思いつかないの?
0871nobodyさん
2010/05/18(火) 19:28:59ID:???それだと、特定のディレクトリに一定数 (今回は1万) 以上溜まらない。 って事になるでしょう。
しかもファイルから保存場所を求めるわけだから、別の値を求められるわけではない。
0872nobodyさん
2010/05/18(火) 22:03:00ID:???ただ単にディレクトリをDBで管理すればいいだけじゃないの?
ランダム文字列/3桁数値
ファイル名とディレクトリ・数値をDBで紐付け
いまいち論点が掴めない
0873nobodyさん
2010/05/19(水) 00:40:36ID:???0875nobodyさん
2010/05/19(水) 08:17:09ID:???ディレクトリあたり2までしか保存させないとする。
ファイルのデータからSHA1を求めて、求めた文字列から保存するディレクトリを決める。
(めんどくさいので文字列は短め&単純にしてます)
ファイル SHA1 保存先
aaa.jpg 123456789 -> 1/2/3/456789.dat
aab.jpg 123456890 -> 1/2/3/456890.dat
acd.jpg 123456000 -> 1/2/3/456000.dat
例えばこうなった場合、3つめのファイル acd.jpg の保存先はどうなるのかなと。
実際の得られる文字列はもっと長いから、ディレクトリ自体を深く掘ればいいでしょうが、
それだけではファイルが溢れないという約束は得られないですよね?
0876nobodyさん
2010/05/19(水) 09:13:26ID:???ファイル名を2文字ずつぐらいに区切ったディレクトリをずんどこ掘って
格納すれば絶対に大丈夫ではある。
たとえば
aaa.jpg → aa/a./jp/aaa.jpg
0877nobodyさん
2010/05/19(水) 09:15:14ID:???最終的なディレクトリに置くファイル数が二つまでなら、1ビットになるまで桁を分割すればいい。
サブディレクトリ数1万までという前提で話すが、
SHA-1で得られる文字列は16進数なので、3桁ずつ使えばサブディレクトリ数は4095個に制限できる。
fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/f.dat
最終的なファイル数を二つに制限したい場合はこうなるな。
000/000/000/000/000/000/000/000/000/000/000/000/000/0/0.dat から
fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/7/1.dat まで
これでもまだ分からないようなら俺は降参するよ。
0878nobodyさん
2010/05/19(水) 09:32:00ID:???SHA-1は160bit(=20バイト)しかないんだから、100文字ぐらいのファイル名なら
いくらでも衝突させられるよ。狙ってファイル名を決めない限り現実にはそうそう
起きないけどね。
0879nobodyさん
2010/05/19(水) 10:35:56ID:???[hoge@foo ~]$ openssl sha1 -c a.txt
SHA1(a.txt)= 5f:e4:3b:0e:3e:95:d4:3c:1f:a4:8b:35:cf:39:e6:9c:62:83:42:81
[hoge@foo ~]$ openssl sha1 -c b.txt
SHA1(b.txt)= 5f:e4:3b:0e:3e:95:d4:3c:1f:a4:8b:35:cf:39:e6:9c:62:83:42:81
試しに2つくらい狙って衝突させてみてくれないか?
0880nobodyさん
2010/05/19(水) 10:48:02ID:???0881nobodyさん
2010/05/19(水) 11:04:11ID:???普通中身で求めるもんだと思うけどな
0882nobodyさん
2010/05/19(水) 11:15:49ID:???目的だよ。単にファイルをディレクトリに分散して置きたいだけなのに
中身のハッシュとるのは重過ぎる。
0883nobodyさん
2010/05/19(水) 11:41:02ID:???データに対してハッシュを取るのは確かに重いですね。
WEB サービスでなければ全然問題ないですが、、、
そう考えると「readme.txt」 をアップする人なんてたくさん出てくる可能性もあるし、
a.avi をアップしようとする人はたくさんいると思う。
みんながみんな、毎回毎回違うファイル名を使ってくれるとは思わない。
どう考えても衝突しますよね・・・
0884nobodyさん
2010/05/19(水) 12:13:20ID:???将来を見越すと、bigintが溢れる不安が残るかもねー。
0885nobodyさん
2010/05/19(水) 13:19:13ID:???0887nobodyさん
2010/05/19(水) 15:30:14ID:???頭おかしいんじゃねえの?
0888nobodyさん
2010/05/19(水) 15:41:50ID:???0889nobodyさん
2010/05/19(水) 17:41:34ID:???何等かの管理ファイルまたはdbには
現在の保存ディレクトリ
現在の保存数
を記録。
ただディレクトリが深くなりすぎず、且多くなりすぎないボーダーがわからん
ext3とかNTFSがパフォーマンス低下しないレベルの数どれぐらいなんだろうな
0890nobodyさん
2010/05/19(水) 17:57:19ID:???の「:」って何?
0892nobodyさん
2010/05/19(水) 22:01:01ID:???とりあえず0〜10000000まで衝突なし。
while( $i < 10000000 ){
$sha1 = sha1($i);
$digest{$sha1}++;
$i++;
}
で衝突有無の確認したんだけど、
たったこれだけでメモリ1GB消費するんだよね。
単体スクリプトで、他に何かいい書き方ってあるのかな?
っつーか、sha1って脆弱性突いて2^52の計算でおk!なんだよね・・・・
まだ2^24未満だよ。このままだと$i = 2^80まで衝突しないんだろうか?
0894nobodyさん
2010/05/20(木) 01:34:31ID:???何か省メモリな方法(知恵?)があったりするんかなーって思っただけだから。
0895nobodyさん
2010/05/20(木) 01:34:50ID:Y0b7Ouqxmy $data = get 'http://search.twitter.com/search.atom?q=java';
use XML::Atom::Syndication;
を使って
my $doc = XML::Atom::Syndication->instance->parse_file($data);ーー�@
として、##XPathを使用して取り出す
my $title = $doc->query("/feed/title")->text_value;のようにして、各要素を取りだそうとおもったのですが、
Can't locate object method "instance" via package "XML::Atom::Syndication"
と�@で、エラーになります。どうすれば、�@で変数に格納できるでしょうか?
0897nobodyさん
2010/05/20(木) 05:12:58ID:???>1万のファイル数制限をかけたいのに4000物ディレクトリなんて使いたくないよママンw
>>863
>1万未満に制限し、あふれたファイルは別のサブディレクトリというのを考えてます。
ここなんか矛盾してない?
0898nobodyさん
2010/05/20(木) 05:38:10ID:???YouTubeがそれやってるね
>>895
XML::Atom::Syndicationはバージョンによって
インタフェースがガラッと変わってるので、まずはバージョンを
0899nobodyさん
2010/05/20(木) 17:06:08ID:???0900nobodyさん
2010/05/20(木) 17:43:39ID:???inode的には全然余裕あるな
もう分ける必要ないね
0901nobodyさん
2010/05/20(木) 18:16:37ID:???0902nobodyさん
2010/05/20(木) 19:07:44ID:???「年月日/時/分/秒/ミリ秒/接続元IP.拡張子」でよくない?
1ミリ秒に5,000〜10,000リクエストなんて処理できないから大丈夫だよ
0903nobodyさん
2010/05/20(木) 19:10:04ID:???0904nobodyさん
2010/05/20(木) 21:48:03ID:???インターネットを見ながら見よう見真似なのですが、ファイルを上手く書き出せません。
Windowsのperl(5.8.8)です。スクリプトはUTF-8でUTF-16でファイルを作りたいのですが、
文字が■□◇みたいになって化けてしまいます(><)何処がおかしいですか?
#!/usr/bin/perl
use strict;
use utf8;
binmode STDIN, ":encoding(cp932)";
binmode STDOUT, ":encoding(cp932)";
open W, ">:encoding(utf-16)", "[TEST].txt" or die $!;
print W <<EOF;
A「もしもしB君?パソコンが動かなくなっちゃったんだけど」
B「どこのメーカーのPCだっけ?」
A「スイッチ押すとピーって言って止まっちゃう」
B「ふーん・・・で、メーカーは?」
A「何回も再起動してるんだけど、ピーって言って止まっちゃう」
B「・・・なんかエラーメッセージ出てない?」
A「まただ・・・またピーって言って止まったよ。なんで?」
B「知るかっ!」
EOF
close W;
print "書き出しました...\n";
exit;
__END__
0908nobodyさん
2010/05/20(木) 22:44:57ID:???秀丸の表示ではスクリプトは[UTF-8][CR+LF]になってます。
書き出されたファイルは↓な感じで部分的に読めます。
秀丸では[Unicode(Big-Endian)][CR]と出ています。
A「もしもしB君?パソコンが動かなくなっちゃったんだけど」
???椰???????????????A「スイッチ押すとピーって言って止まっちゃう」
???田???????????????A「何回も再起動してるんだけど、ピーって言って止まっちゃう」
??????��????????????��????A「まただ・・・またピーって言って止まったよ。なんで?」
??????????
0909nobodyさん
2010/05/20(木) 22:47:27ID:???0912nobodyさん
2010/05/21(金) 03:02:13ID:???5000個ごとに分けたいだけなのに1000ディレクトリもわけないといけないなんて
と嘆くのが今回の質問者
cronで定期的にファイルの数かぞえて、(たとえば)4500を超えていたら新しいディレクトリを作成して、
シンボリックリンク(たとえばcurrent)を張り替えるのがいいかもしれん
0913902
2010/05/21(金) 04:19:19ID:???SHA-1以外のなにかで、280とおりもとめられればおよそ問題ないハズなのでそっちから検討するのもあり
(誕生日問題を含む)偶然まで考慮するなら他のアルゴリズムを採用するべき
ただし、どの場合でも(衝突率が誕生日問題で崩壊してるので)ファイル名はキーになりえない。
0914902
2010/05/21(金) 04:21:28ID:???1. ベストは「要件に合わせて適切な処理をする」なのでこんな大雑把な質問にベストの解は無いので
小でも動くけど大まで見越すのであれば大がある程度基準になってしまうのはしょうがないと思う。
「小でも〜」を考慮するとあらかじめ保存先をすべて作っておくよりなければ都度作る方が効率がいいと思う。
>アクセスに依存する考えなので「1000に分けないで〜」と言う要件は解決
2.FAT16やext2世代より以前のファイルシステム使ってるようなサーバなら
そもそもそんなにトランザクションさばけないので要件を満たす。
現状の良いスペックでも要件を満たす。
将来性もある程度考えた仕組みを考える。
>勝手に作った前提
3. 株とかFXみたいにものすごいトランザクションでは無い投稿系の処理なら
msまでわけないで秒までにしておいて衝突するようなら攻撃的なアクセスとみなしてエラーにしちゃえばいい
4. ディレクトリ数は秒までなら366*24*60*60ディレクトリ(合計31,622,400)となるので
ひとつのディレクトリは1000こえないのでext2でも十分機能する
もっと古いFSを考慮するなら255こえないほうが安全なので年/月/日にすればいい
>msまで考えると1000になりえるので破綻
5. 最近のハードでも1台で運用するのであれば5000〜10000UU/秒をさばける構成は思いつかない。
将来的(5〜10年後)もよほど画期的な何かがでてこない限り要件を満たすハズ。
画期的なアイデアがでたとしても普及には時間がかかるので見直して修正する時間は十分にある。
「一台で」という勝手に作った前提がくずれて複数のフロントエンド、1つのファイルサーバとみても
フロントエンドのIPを要件にあわせて必要な位置に足せば十分機能する。
6. (プログラムの性質にもよるけど一般的に)拡張性を考えても頭の方の「年月日」を「年/月/日」にして
当年ディレクトリまたは当月ディレクトリ辺りを早いデバイスにすれば十分な速度が得られる
0915nobodyさん
2010/05/21(金) 07:37:40ID:???に対する考察ってことでOK?
0916nobodyさん
2010/05/21(金) 17:19:06ID:???0917nobodyさん
2010/05/21(金) 23:24:55ID:???280 って何じゃそりゃ?
SHA-1 の衝突(#)困難性の脆弱化は、 総当たり攻撃で
2**80 の計算で一回起ると言われていたが、現在
2**52 で起るとの報告がされてる。
「4.5035996273705e+15」の計算だ。
「 280 回の施行で衝突を起こせる」つーのはググって、
ソース元にアクセスせずに鵜呑みで書いてるだろ。
ま、一つほど大歩危カマしてる .jpg ファイルは見つけたけど。
== 余談 # の事 ==
SHA-1 の話題で「衝突」と言えば、
「異る2つの対象ファイルが同一のハッシュ値を持つ事」
を意味する。
決して「偶然同じ名前を付けられた二つのファイルの
ハッシュ値が同じ」などの意味では使わない。
んなもん一回の計算で衝突させられるに決まってる。
ネットワークデータ通信で衝突と言う言葉も使われるが、
混同しない様に注意しながら文を書くのが礼儀じゃねーの?
スレ違い失礼。
0918nobodyさん
2010/05/21(金) 23:36:08ID:???ハッシュ値が同じ」
0919902
2010/05/21(金) 23:44:50ID:???0920nobodyさん
2010/05/22(土) 00:13:35ID:???>>892氏が既に呟いてる事柄を見落したりして、
適当に調べた事を、平気で書く人間の文を真面目に
読む気にはならんよ。
0921nobodyさん
2010/05/22(土) 19:18:04ID:VfPIyjHK配布されてるCGIのゲームをホームページにつくり、そのスクリプト改造しながら勉強してます。
最初は改造方法とか書いてあるページでいろいろやってましたが。。
そろそろ基本的なことを着実にやらないとと思い、ちまちまやってます。
学生でお金もあまりないので参考書とかあまり買えないです。ネットで勉強してます。
なので恐ろしく馬鹿馬鹿しい質問するかもしれませんが許してやってください。意欲だけなら底なしです。。
ゲームの内容は普通にプレイヤーがモンスターを倒す(ダメージをあたえる)ようなもんです。
そこでプレイヤーの技に「〜〜という文字が含まれているモンスターには普通より多いダメージを与える」というものを作りたかったんです。
それで
if ($xx =~ /ABC/){ ・・・の文法を使おうとしたんです。
でもABCのところにいざモンスターの名前をいれようと全角カナを使ったらエラーです。
どうにかできないかと""で囲ったりいろいろやってたらどんどん迷いこんでしまいました。
jcodeとかあるなーなんてやってみてもjcode呼び出す文とかがぜんぜん分からなくて・・・
解決方法と解説、よろしければお願いします。m(__)m
※全部半角でいこうかと考えましたが、これのほかに解決方法がなければそうしたいなと思ってます。
0922nobodyさん
2010/05/22(土) 20:06:15ID:???0923nobodyさん
2010/05/22(土) 20:14:20ID:???とりあえず、技名は全て決め、その技名に対してユニークな (重複の無い) な ID を振る。
その技がどんなタイプなのかを決めておくといいかも。
例えば、スライム系に対して攻撃力何パーセント上乗せみたいな。
my $SPAttack = {
'00001' => {
'name' => 'アイスアロー',
'base_power' => 30,
'type' => {'magick' => 1, 'physical' => 1}, # 技が魔法、物理かどうか
'attribute' => 'ice',
'target_attribute' => {'slime' => 120, 'dragon' => -30, } # base_power に対するパーセンテージ。 存在しない属性は±0
}
}
みたいな感じはどうでしょ?
参照は $SPAttack{'00001'}->{'name'} で出来る。
敵のパラメータにどんな属性が弱いのかを持たせておけばいいのかなと。
my $monsters = {
'00001' => {
'name' => 'スライム',
'def' => 10,
'str' => 5,
'attribute' => 'slime',
'weak' => ['ice, 'fire'],
'strong' => ['poison']
}
};
などなど
とにかく、技名とか武器とか敵とかにはそれぞれで重複しない固有の ID を割り振るのが鉄則かと。 (属性も ID 振っても良いのかなとは思う)
0924nobodyさん
2010/05/22(土) 20:17:02ID:???は
'weak' => {'ice' => 1, 'fire' => 1},
にした方がいいのかな
0925921
2010/05/23(日) 12:29:26ID:IxcMBDCuIDを振るっていうのがよくわからなかったんですけども
とりあえず技の特定の属性に対してのダメージ増減とモンスターの属性設定だけしてやってみました。
やっぱ文字設定よりこっちのほうが便利ですね。最初は大変ですが。
0926nobodyさん
2010/05/24(月) 14:15:12ID:???「今のはメラゾーマではない・・・メラだ・・・」
って演出が出来ない。
id, name, power
101, メラ, 10
103, メラゾーマ, 180
104, メラ, 200 #魔王専用
ってやるのがデータを扱う定石。
0927nobodyさん
2010/05/25(火) 12:37:02ID:???空白有りにも対応するには、どうすれば良いでしょうか。
system "soft.exe $file";
0928nobodyさん
2010/05/25(火) 13:33:10ID:???0929nobodyさん
2010/05/25(火) 14:20:58ID:???0930nobodyさん
2010/05/25(火) 15:35:08ID:???Windowsなら system "soft.exe \"$file\""; か system qq(soft.exe "$file"); でどうか
他のOSは知らん
0931nobodyさん
2010/05/25(火) 17:07:23ID:???"を二重に囲うような方法が分からなくて。
教えて頂いた方法でエラーなく動作しました。
ありがとうございました。
0932nobodyさん
2010/05/25(火) 19:44:20ID:???0933nobodyさん
2010/05/25(火) 20:40:06ID:???エスケープすることが多い
0934nobodyさん
2010/05/25(火) 20:46:05ID:???print 'Hello, ', $name, " san!\n"; とかw
>>931
なるほどエスケープの方法が訊きたかったわけね
0935nobodyさん
2010/05/25(火) 22:22:42ID:???qw//とかqr//は普通に使うんだけど
0936nobodyさん
2010/05/26(水) 01:36:17ID:???なにー、マジで? ちょっと今度ベンチとって見よう。
いや、最近php絡みの案件でHTMLやJavascriptを出力する時なんか、
' と " が多重に出現するのでヒアドキュメントとかを使うんだが、
そんな時Perlのqq() が使えればなー、ってよく思う。
0937nobodyさん
2010/05/26(水) 13:16:36ID:???読みづらくなるからなぁ
>いや、最近php絡みの案件でHTMLやJavascriptを出力する時なんか、
うちの場合JavaScriptやcssは全部外部に置いてるから打ち出すのはイベントで関数を呼ぶ部分ぐらい
HTMLはヒアかSmarty
0938nobodyさん
2010/05/26(水) 18:52:28ID:???リストを頭から出力していくだけの , 区切りに比べて遅いんじゃないの?
どっちにしても相当長い文字列で何千万、何億回とか回してみてやっと差が出るぐらいだろうけど
0939nobodyさん
2010/05/26(水) 21:09:03ID:???'comma1' => sub { print 'πは ', $num, ' だもにゅ', "\r" },
'comma2' => sub { print "πは ", $num, " だもにゅ\r" },
'dot1' => sub { print 'πは ' . $num . ' だもにゅ' . "\r" },
'dot2' => sub { print "πは " . $num . " だもにゅ\r" },
'merge' => sub { print "πは $num だもにゅ\r" },
}, 'none',);
cmpthese($results);
print;
Rate dot1 dot2 comma2 merge comma1
dot1 323719/s -- -4% -6% -7% -11%
dot2 337029/s 4% -- -2% -3% -7%
comma2 342618/s 6% 2% -- -2% -5%
merge 348578/s 8% 3% 2% -- -4%
comma1 362188/s 12% 7% 6% 4% --
0940nobodyさん
2010/05/26(水) 21:09:16ID:???Rate dot1 merge dot2 comma1 comma2
dot1 1488538/s -- -13% -15% -46% -51%
merge 1720578/s 16% -- -1% -38% -44%
dot2 1743679/s 17% 1% -- -37% -43%
comma1 2770851/s 86% 61% 59% -- -10%
comma2 3061849/s 106% 78% 76% 11% --
0941nobodyさん
2010/05/26(水) 21:20:16ID:???ってことかな?
ってことで sprintf でメモリ内の処理でベンチ
(そもそも sprintf の使い方を間違えてけどwww)
" " で囲むより ' ' で囲ったほうが高速
変数展開を無視する分、それだ早い?
カンマで区切った方が遅いのは、カンマで区切る分だけ print が発生してるのでは? と思った
ちなみに perl 5.10 で計測しました
使用されたメモリ含めてのベンチって取れないのかしら?
0942nobodyさん
2010/05/26(水) 21:37:06ID:???0943nobodyさん
2010/05/26(水) 22:23:39ID:???ぶっちゃけ、環境依存。俺の環境だと以下。
% cat hoge.pl
use Getopt::Long ;
use Benchmark qw( timethese cmpthese ) ;
GetOptions( 'c=i' => \my $cnt ) ;
die if ! $cnt ;
my @arr = (q{a} x $cnt ) x 10 ;
cmpthese timethese ( undef, {
'concat' => sub {
print STDERR $arr[0] . $arr[1] . $arr[2] . $arr[3] . $arr[4] . $arr[5] . $arr[6] . $arr[7] . $arr[8] . $arr[9] . qq{\n} ;
},
'list' => sub {
print STDERR $arr[0] , $arr[1] , $arr[2] , $arr[3] , $arr[4] , $arr[5] , $arr[6] , $arr[7] , $arr[8] , $arr[9] , qq{\n} ;
},
'quote' => sub {
print STDERR qq{$arr[0]$arr[1]$arr[2]$arr[3]$arr[4]$arr[5]$arr[6]$arr[7]$arr[8]$arr[9]\n};
},
});
% perl hoge.pl -c 10 2> /dev/null
(略)
list 67414/s -- -83% -83%
concat 385602/s 472% -- -1%
quote 389251/s 477% 1% --
% perl hoge.pl -c 1000000 2> /dev/null
(略)
concat 95.0/s -- -0% -50%
quote 95.3/s 0% -- -50%
list 189/s 99% 98% --
0944nobodyさん
2010/05/26(水) 22:24:37ID:???失礼。
0945nobodyさん
2010/05/26(水) 22:49:18ID:???http://d.hatena.ne.jp/dayflower/20060603/1149311938
これのサンプルちょっといじったけど、
test_1_の方は、シングルクォート最強他は糞状態。
test_2_の方は、qrだけアウト。クォート有/無、シングル/ダブル、qqでほぼ一緒。
リテラルでの比較は危険ってことか?とにかくシングルクォートが一番安定かも。
0946945
2010/05/26(水) 23:02:10ID:???とにかく上記test_1_は、シングルクォート以外糞遅い。
環境:XP home SP3, ActivePerl-v5.10.1 built for MSWin32-x86-multi-thread
0947nobodyさん
2010/05/27(木) 12:45:24ID:4E5NJ/2Pよろしくお願いします。
Windows2000 + ActivePerl です。
CPANで初めてモジュールをインストールしました。
cpan> install Net::Twitter したところ、
各種ファイルが C:\Perl\cpan\build 以下に配置され、
Net::Twitter は C:\Perl\cpan\build\Net-Twitter-3.13003-Pu89O8\lib\Net\Twitter
にインストールされました。
当然、そのままでは
Can't locate Net/Twitter.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib
. C:\Perl\cpan\build) at test.cgi line 48.
と怒られてしまい、使えません。
普通に@INC 以下のディレクトリに配置されると思っていたのですが、
インストール時に何か指定を間違えましたでしょうか?
また、この後どうしたらよいか教えていただけると助かります。
0948nobodyさん
2010/05/27(木) 17:00:17ID:???入ってなかったら、ppm install Net::Twitterでppmからインストール。
いじょ。
0949947
2010/05/27(木) 17:56:53ID:rbfUMQUI0950nobodyさん
2010/05/31(月) 13:14:59ID:jC7AE+TDドキュメント通り
my $graph = GD::Graph::chart->new(400, 300);
と書くと、
Can't locate object method "new" via package "GD::Graph::chart" (perhaps you for
got to load "GD::Graph::chart"?) at test.cgi line 42.
と怒られます。
GD::Graph::chartは確かに入って無さそうなのでinstallしようとして
ppmとCPANで調べると、 GD::Graph::chartそのものがなさそうなのですが
どうしたら良いでしょう。
use Chart; の方がいいんでしょうか。
0951nobodyさん
2010/05/31(月) 13:28:06ID:???chart is bars, hbars, lines, points, linespoints, mixed or pie
0952nobodyさん
2010/05/31(月) 16:08:22ID:???「linesとかbarsとかのチャート機能をnewして・・・」ってつもりで書いてあるんだなw
紛らわしいドキュメントだ
>>950
こういうときは「Perl モジュール名」で検索して、ひとまず動作する実例を探すって手もあるよ
2004年の記事だけどここなんかどうかな
GD::Graphを使ったPerlグラフ生成 - SourceForge.JP Magazine : オープンソースの話題満載
ttp://sourceforge.jp/magazine/04/04/15/0110216
0954951
2010/05/31(月) 16:49:18ID:???うむ。
# CHART is bars, hbars, lines, points, linespoints, mixed or pie.
my $graph = GD::Graph::CHART->new(400, 300);
こう書いてくれたら、だいぶ分かりやすくなるのになぁ。
0955nobodyさん
2010/05/31(月) 17:08:15ID:GblyjBgz在日の40%の生活保護者所帯への援助は年間平均一所帯600万円。
年計2兆3千億円が「在日朝鮮人の生活保護費」になっている。
≪都市部の30代母親と小学生子供2人の生活保護費の内訳≫
生活費として月に『15万円』
母子家庭なら母子加算と呼ばれる追加支給が月に『2万3千円』
教育費として給食費・教材費など『7千円』
住宅費は上限が決まっているが『5万円』全額支給される。
これだけで合計月に『23万円』
国民年金全額免除。上下水道基本料金免除。NHK受信料全額免除。
医療費は保険診療内なら全額免除。通院費も認められれば全額支給。
都営交通無料乗車券。JRの定期券割引。
年金は支払い免除のうえ“掛け金無しで”年金受給が可能である。
他にも名目を変え様々な給付や免除がある。
民潭の統計では在日朝鮮人約64万人中、約46万人が『無職』という。
つまり4分の3が無職である。 在日は「特権は存在しない」というが、
民潭が自ら「46万人が無職」と公言しているのである。
無職がどのように飯を食っているか考えればそんな嘘は通じない。
http://www.koreanantijapan.comze.com/index.html
0956950
2010/06/01(火) 15:43:22ID:0JV8JwVp引き続き申し訳ないのですが、ActivePerl GD::Graphで質問です。
GD::Graphの文字がデフォルトの文字がカクカクで読みにくいので
use GD::Text;
GD::Text->font_path('C:/WINNT/Fonts');
$graph->set_title_font('arial.ttl','40');
など、arial.ttfをカレントディレクトリに移動したり色々変更してやってみてるのですが、
文字に全く変化ありません。
アドバイスいただけると助かります。m(_)m
0957nobodyさん
2010/06/01(火) 19:50:00ID:???0958950
2010/06/02(水) 13:52:42ID:VCaPMnRA$graph->set_title_font('arial.ttf,'40');
修正して、以前状況かわりませんが、
自分でももう少し頑張ってみています。
0960950
2010/06/02(水) 15:21:58ID:VCaPMnRA途中で気が付き直しました。スミマセン。
フォントをカレントディレクトリに移して
GD::Text->font_path('./');
$graph->set_title_font('ARIAL' , 16)
$graph->set_title_font('ARIAL.TTF' , 16)
や、
$graph->set_title_font('C:\WINNT\Fonts\ARIAL.TTF' , 16);
も試したのですが、上手く行かないので
$graph->set_title_font(gdGiantFont);
としたら、フォントは見づらいのですが文字が大きくなって若干マシになりました orz
0961nobodyさん
2010/06/02(水) 21:25:05ID:???libgd was not built with FreeType font support と出るんじゃないの
0962nobodyさん
2010/06/02(水) 22:32:28ID:???このような使い方はできるのでしょうか。
どうか教えてください。
0963nobodyさん
2010/06/02(水) 22:54:03ID:???http://perldoc.perl.org/functions/undef.html
0965nobodyさん
2010/06/02(水) 23:54:43ID:???0966nobodyさん
2010/06/03(木) 09:40:00ID:???0967nobodyさん
2010/06/03(木) 16:49:28ID:???http://www.tohoho-web.com/soft/wsrch.htm
英数字の全角半角を同一視する素人発想のルーチンを入れると極端に遅くなってしまいます。
★まず、入力フォームのルーチン内で、キーワード$wordに英数字が含まれているかどうか、
(ここを通る前に、入力されたキーワードの全角英数字は半角英数字に変換済です。)
if ($word =~ /[0-9A-Za-z]/) {
$wordeisu = 1; #英数字あり(検索時に全角→半角に統一)
} else {
$wordeisu = 0; #英数字なし(検索時の全角→半角をせず、スピードアップ)
}
★そして、検索ルーチン内で以下の処理を追加... $lineは、全文を一行づづ取り出したものです。
if ( $wordeisu eq "1") { #検索語に英数字が含まれる場合、すべて半角英数字に統一
&jcode'tr(\$line,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0-9A-Za-z');
#ここはeucではないので、&jcode'tr(\$line,'0-9A-Za-z', '0-9A-Za-z');だと上手くいきません。
}
これで、入力された$wordも全文の一行$lineも半角英数字に統一され、
検索結果としては正しく出来るのですが、時間が10倍以上かかってしまいます。
(もちろん、この改造をしても英数字を含まない場合は時間がかかりません。)
なにか良い方法がありますでしょうか?
0968nobodyさん
2010/06/03(木) 17:30:16ID:???日本語でもtrできるから書きなおすのお勧め。
0969nobodyさん
2010/06/03(木) 17:43:34ID:???この関数を使う以外にIPアドレスからホスト名を取得する方法ってありませんか
0970nobodyさん
2010/06/03(木) 17:46:44ID:???それを防ぐ理由は名前を引くコストを削減したいから。
IP からホスト名を返す仕組みを他に用意するか、自分でゴリゴリ書くか。
0971nobodyさん
2010/06/03(木) 17:54:09ID:???↑の関数が使えなくてもWHOIS?とかいうのを使えばどうにかなるのかな?
0972nobodyさん
2010/06/03(木) 18:20:16ID:???0973nobodyさん
2010/06/03(木) 19:10:30ID:???ただ、タイムアウトが厳しいサーバーだとやらないほうがいいのでは?
とは思う
ログの活用なら、ローカルに落として活用するとかとか
0974nobodyさん
2010/06/03(木) 19:43:21ID:???0975nobodyさん
2010/06/03(木) 21:38:54ID:???0976nobodyさん
2010/06/03(木) 22:24:04ID:???DNS 問い合わせ辺りでぐぐれば分かりますか
0977nobodyさん
2010/06/03(木) 22:40:53ID:???がいいとおもいます。
0978nobodyさん
2010/06/03(木) 22:46:09ID:???なんかUDPも通らないという制限もあったし。
0979950
2010/06/03(木) 22:57:17ID:oT6XV7cd$graph->set_title_font(略) or die $graph->error; すると、
何もエラー文字吐かずにdie してしまうので
原因が判らなかったんですよね。
Fontが対応していないということでしょうかね。
ちょっと探してみます。
ありがとうございます。
0981921
2010/06/04(金) 18:54:41ID:jTzgRcFesub send_item2 {
my($kind, $no) = @_;
$send_id = unpack 'H*', $m{guild};
if (-f "$guilddir/$send_id/depot_g.cgi") {
open my $fh, ">> $guilddir/$send_id/depot_g.cgi";
print $fh "$kind<>$no<>\n";
close $fh;
}
}
長すぎエラーなので続きます。
0982921
2010/06/04(金) 18:56:26ID:jTzgRcFemy $target = shift;
if ($m{is_full_g}) {
$mes = "$max_depot_g個までしか保管することはできません";
return; }
if ($weas[$m{wea}][1] eq $target) {
$npc_com = "$weas[$m{wea}][1]を倉庫にいれました";
&send_item2($m,1, $m{wea});
$m{wea} = 0; }
elsif ($arms[$m{arm}][1] eq $target) {
$npc_com = "$arms[$m{arm}][1]を倉庫にいれました";
&send_item2($m,2, $m{arm});
$m{arm} = 0; }
elsif ($ites[$m{ite}][1] eq $target) {
$npc_com = "$items[$m{ite}][1]を倉庫にいれました\n";
&send_item2(3, $m{ite});
$m{ite} = 0; }
if ($npc_com) {
&get_depot_cg;
return; }
$mes = qq|どれを倉庫にいれますか?<br />|;
$mes .= qq|<span onclick="text_set('@ほかん>$weas[$m{wea}][1] ')">$weas[$m{wea}][1]</span> / | if $m{wea};
$mes .= qq|<span onclick="text_set('@ほかん>$arms[$m{arm}][1] ')">$arms[$m{arm}][1]</span> / | if $m{arm};
$mes .= qq|<span onclick="text_set('@ほかん>$ites[$m{ite}][1] ')">$ites[$m{ite}][1]</span> / | if $m{ite};
$act_time = 0;
}
0983921
2010/06/04(金) 18:57:38ID:jTzgRcFe$kindはアイテムの種類(武器か防具か道具か)、$noはアイテムのナンバーです。$mは自分(プレイヤー)
アイテムを倉庫にいれるスクリプトを作ってみたのですが
どうもうまくいきません。
文法上のミスはないのですが暗転エラーが起きます。
$max_depot_gとか&get_depot_cgとかはこれより前に指定しています。
エラーの具合からsub send_item2で何か呼び出せないのかなと思い
いろいろ書き方も変えてみたのですけどもやっぱりエラーが起きます。
どこをどういう風に変えたほうがいいのでしょうか?
説明下手ですみません
0984976
2010/06/04(金) 19:10:22ID:???これでサーバを調べてみたんですがNet::DNSモジュールは使えないみたいです
逆引きについては諦めた方がいいんでしょうか
0985nobodyさん
2010/06/04(金) 19:31:58ID:???>&send_item2(3, $m{ite});
とりあえず、斜め見ただけでもここは
&send_item2($m, 3, $m{ite});
じゃねーのか?
それにしても、すっげー、気持ち悪いコード。
元コードがそれなら、悪癖が付くだけだから今すぐ止めるのをお勧めする。
勉強の為なら、1から rewrite すれば良いかも知れん。
0986nobodyさん
2010/06/04(金) 20:39:03ID:???>sub send_item2 {
> my($kind, $no) = @_;
これはどういう事だよ。
0987nobodyさん
2010/06/04(金) 21:09:36ID:???確か&つけたら、引数が呼び出した関数にも引き継がれるんじゃなかったかな……
まあ可読性が著しく落ちるので安全なコードじゃないと思うが
0988nobodyさん
2010/06/04(金) 21:16:30ID:???グローバル変数使いすぎ
0989nobodyさん
2010/06/04(金) 21:22:36ID:???何でオレにレスするか知らんが。
% perl -le 'sub foo{ print $foo ; } $foo = 42 ; &foo( $foo) '
42
% perl -le 'sub foo{ print $foo ; } my $foo = 42 ; &foo( $foo) '
(何も無し)
0991nobodyさん
2010/06/04(金) 21:40:17ID:???うろ覚えなら書くなよ。確かめてから書け。
% perl -le 'sub foo{ print $foo ; } my $foo = 42 ; &foo '
(何も無し)
サブルーチンに & を付けて引数省略した時には、その
スコープの「 @_ 」が自動的に引数にセットされる。
% perl -le 'sub foo{ print $_[0] ; } {local @_ = (42) ; foo ; }'
(何も無し)
% perl -le 'sub foo{ print $_[0] ; } {local @_ = (42) ; &foo ; }'
42
結論から言うと %m がグローバル。986氏の突っ込み通り、
引数に与える必要すらない。
俺の985はケースバイケースで、
my($kind, $no) = @_;
に期待される引数がセットされないのを指摘しただけだ。
0992nobodyさん
2010/06/05(土) 04:54:25ID:???暗転エラーってなんだ?
解析するのはいいことだが、それは大抵自分でがんばるもんだ。
というか、解析、改造したいという欲求でモチベーションを保てないのなら未来はないよ。
0993nobodyさん
2010/06/05(土) 16:00:29ID:???この場合、$m はリファレンスで渡すか、現状 &send_item2() の第2引数を最初に渡すかしないと、
やりたいことは出来ないのでは?
&send_item2() の第1引数で $m を渡してるのに、第3引数で $m の中身の一部分を送ること自体が無駄。
アイテム名を取り出すところ、アイテムデータを普通の配列で管理するなら、定数を使った方がいいかと思います。
use Readonly;
Readonly my $ITEMNAME => 1;
こんな感じ。
※ 定数は全部大文字で!
[1] とか書いてると、数ヵ月後に保守しようとすると、とてつもなく見づらいかと。
0994nobodyさん
2010/06/05(土) 18:39:58ID:k+mTvgx/なんなんだコレ。全くわからない。
誰か分かり易く解説できる方、
0995nobodyさん
2010/06/05(土) 20:42:26ID:???配列とか連想配列を関数の引数に渡したいときとかにリファレンスで渡してる。
あと、扱うデータ (スカラにせよ配列にせよ) が大きいときはリファレンスで渡す場合も。
0996nobodyさん
2010/06/05(土) 21:02:44ID:1P81rnLsうーむ・・・(;´∀`)
0997nobodyさん
2010/06/05(土) 21:04:55ID:1P81rnLsまだちょっとPerl CGI 知識が足りないようで勉強しています。
リファレンスのところで壁にあたっています。
上記作業の経験者いませんか?
クレジットカード決済にはepsilonを使用予定です。
0998nobodyさん
2010/06/05(土) 21:07:53ID:???説明を読んで、例を実際に動かしたりいろいろ試したりしてるうちになんとなく。
実際に手を動かすのが一番わかりやすいと思うよ。
初めはこんなシンプルなのでも「えっ、こんなことできるの?」って感じだった。
my $aref = ['hoge', ['fuga', 'piyo']];
print $aref->[0], "\n", $aref->[1][1], "\n";
というか、次スレ立ててくる。
0999921
2010/06/05(土) 21:11:43ID:???理解しようと苦しんでいるところなのでもうちょっと待ってあげてください。
いや待たなくてもいいけど。
1000nobodyさん
2010/06/05(土) 21:12:09ID:Hs2b1+tPPerlコーディング初心者質問スレ Part 61
http://pc11.2ch.net/test/read.cgi/php/1275739870/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。