Perlコーディング初心者質問スレ Part 60
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/09/03(木) 23:51:12ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/
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のキーが送信されないという、
思わぬところでつまづいてしまいました。
■ このスレッドは過去ログ倉庫に格納されています