Perlコーディング初心者質問スレ Part 58
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/08/06(水) 22:54:32ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1203935151/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0173nobodyさん
2008/09/09(火) 16:11:52ID:???0175nobodyさん
2008/09/09(火) 16:16:31ID:???答える答えないは別として。
0176nobodyさん
2008/09/09(火) 16:21:23ID:???start_xxx
end_xxx
ってパターン知らないと、調べるにもその先が広がらないよね
0177nobodyさん
2008/09/09(火) 16:28:12ID:???初心者が手にするような入門書には書いてないのかもしれないな。
初心者は入門書がマニュアルだから。
入門書に書いてなければ、即質問。
0178nobodyさん
2008/09/09(火) 20:55:13ID:???perldoc perl
モジュールのマニュアルを見るには perldoc の引数にモジュール名を与えて実行します:
perldoc CGI
# 今回のケースはこのコマンドで表示される内容のうち、"SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS" という節に載っています。
perldoc の使い方も perldoc で調べることができます:
perldoc perldoc
以上、初心者のための perldoc 入門でした。よろしくご活用下さい。
0179nobodyさん
2008/09/09(火) 21:25:32ID:???態度でかいな。
0180nobodyさん
2008/09/09(火) 23:58:37ID:???0181nobodyさん
2008/09/10(水) 09:33:06ID:???'perldoc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
Pathが通ってなかったOracle10g付属Perl
Pathを通すと動くようになった
0182nobodyさん
2008/09/10(水) 13:01:51ID:???0183nobodyさん
2008/09/10(水) 13:10:53ID:Ln4PKjnAってやって出てくる1ページ目にものすっごいヒントがあるじゃないw
NAME
CGI - Simple Common Gateway Interface Class
SYNOPSIS
# CGI script that creates a fill-out form
# and echoes back its values.
use CGI qw/:standard/;
print header,
start_html('A Simple Example'),
h1('A Simple Example'),
start_form,
"What's your name? ",textfield('name'),p,
"What's the combination?", p,
checkbox_group(-name=>'words',
-values=>['eenie','meenie','minie','moe'],
-defaults=>['eenie','minie']), p,
"What's your favorite color? ",
popup_menu(-name=>'color',
-values=>['red','green','blue','chartreuse']),p,
submit,
end_form,
hr;
0184nobodyさん
2008/09/10(水) 13:30:20ID:???0185nobodyさん
2008/09/10(水) 14:12:03ID:???CGI - 簡単なCGI(Common Gateway Interface)クラス
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
0186nobodyさん
2008/09/10(水) 16:22:39ID:???直前に出ているOracle Server入ってる環境もOracleのPerlと競合して入れられない。
(入れられはするが環境変数が競合して可笑しな動きをする)
コマンドが使えるかどうか、使えなければ、PATHを通ってなければ通すとかすれば使えるから、そっちをやると良い
0187nobodyさん
2008/09/10(水) 16:32:00ID:???mysqlで勉強してます。文字コードはsjisです。
1、「’、<」などの通常の特殊文字のエスケープ
2、sjisどうしても使う場合は「SELECT 〜$str 〜」のSQL文の中で使う
すべての文字列をEncode::from_to($str, "sjis","sjis");
毎回これ何個もずらりと書くの大変です。
mysqli_real_escape_string()関数も同様に毎回ですよね。
質問です。
・1だけの処理で簡単に終わらせることは可能でしょうか?
可能でしたらどの文字をどうしたらよいのか知りたいです。
・2をすれば対策になっていますか?
よろしくお願いします。
0188nobodyさん
2008/09/10(水) 16:37:22ID:???1.
プレースホルダ使えよ
2.
SJISは知らん。多分はまり道なので避けられれば避けたほうがいいような
気はするが避けようがないなら....まあ、頑張れ。
0189nobodyさん
2008/09/10(水) 17:07:20ID:???0190nobodyさん
2008/09/10(水) 21:12:56ID:???それを行うライブラリを書いたらいいんじゃないかな。
それがたとえ既存の車輪だとしても、勉強になるし便利になるし安全…かどうかは中身次第だけど、少なくともメインプログラムの行数が減ればバグも減る。
0191nobodyさん
2008/09/11(木) 03:45:37ID:???http://www.ipa.go.jp/security/vuln/websecurity.html
昔から疑問に思ってたんだけど、
プレースホルダ使った方が楽で確実なのに、
エスケープで通す利点ってあるの?
0192187
2008/09/11(木) 04:05:18ID:???IPAの解説書にプレースホルダか一つずつエスケープ処理する
対策があるみたいですね。
意識しないでquote()使っていたので大丈夫のようです。
今度からは、プレースホルダも使ってみたいと思います。
ありがとうございました。
0193nobodyさん
2008/09/11(木) 12:02:32ID:???0194nobodyさん
2008/09/12(金) 06:22:07ID:???where ... in (...) ってやつ?
my @fields = ( ,,, );
my $query = sprintf("select ... from Table where ... in(%s)", join(',', ('?')x@fields));
my $sth = $dbh->prepare($query) or die $dbh->errstr;
$sth->execute(@fields);
こんな感じで特に問題ないと思う。
0195nobodyさん
2008/09/13(土) 14:59:35ID:D0b2LLILhoge.cgi?key=ab+cd で「ab+cd」という値として受け取りたいのです。
CGI::Lite, CGI::Simple, CGI::Minimum などは、皆「ab cd」と空白に変換してしまいます。
0196nobodyさん
2008/09/13(土) 15:06:54ID:???0197nobodyさん
2008/09/13(土) 15:08:31ID:???0198nobodyさん
2008/09/13(土) 17:12:54ID:???" "はブラウザが"+"にエンコードして送ってくる。
> hoge.cgi?key=ab+cd で「ab+cd」
として受け取りたいなら、RFC書いて、各ブラウザを改良させて、モジュールを修正する。
まぁ、頑張ってくれ。
0199nobodyさん
2008/09/13(土) 17:21:39ID:???「+」をその文字のままで扱いたかったら、>>196の言う通り
送り側が%2Bとエスケープしてからサーバーに送らんといかん。
どうしても「+」(送り側は半角スペースのつもり)のままで受け取りたいなら、
モジュールの中身を改造するか、自前で引数受け取り、デコード用の処理を書くかするしかないんじゃないの。
0200nobodyさん
2008/09/13(土) 21:31:17ID:???逃げ道はあるけど、うまい方法だと思われても困る。
0201nobodyさん
2008/09/14(日) 20:04:01ID:???dddから始まる行を、置換で削除したいです
(下記の場合dddeeeが該当)
aaa
bbb
ccc
dddeee
fff
検索:ddd[a-z]
置換:\n
だとうまく置換されません
なぜ??
0202nobodyさん
2008/09/14(日) 20:11:49ID:???0203nobodyさん
2008/09/14(日) 20:46:53ID:???0204nobodyさん
2008/09/14(日) 21:26:37ID:???Perl でやってるんだったら「こう書いてるけどうまく行かない」も書きましょう。
<$fh> =~ s/ddd[a-z]/\n/g; # うまく行かない
0205201
2008/09/14(日) 21:26:47ID:???解決できて嬉しいです。
0206nobodyさん
2008/09/18(木) 23:04:37ID:???if (open(FH, ">data.bat")) {
print FH $data;
close(FH);
↑CGIを使用しページを見ているユーザーに入力を求め、<入力したメールアドレス><入力したPW>に代入?させてファイルに書き出したいのですがいい方法ってありますか?
0207nobodyさん
2008/09/18(木) 23:19:12ID:???2. そのフォームを受け取って、ファイルに書き出すスクリプトを作る。
0208nobodyさん
2008/09/18(木) 23:52:53ID:???0209nobodyさん
2008/09/19(金) 13:28:02ID:J2CRWlwv亀レスですが。
あんまりスマートじゃないけど、こんなんでどうですか? fasta形式のファイル読み込むようになってます。
BioPerl使った方がいいのかもしれませんが、私はよく知らないので・・・ テキトーに参考になさってくだされば幸いです。
ところで、ついでに質問させていただきます。 15行目の$1を22行目のprintの中に入れると、 Use of uninitialized valueのエラーが出るのですが、 これはなぜでしょうか?
お分かりになる方いらっしゃいましたら教えて、いただけますでしょうか?
>sequence1 NIDA
atgaccaccg aaacaaccgg acaccggcac acagctgacg cgaccgatcc ctacctgcgg 60
cgcgcgttgc gggaggtagc ggacgggctc aaggtcgggc gcttaccggc ccgcgtcgtc 120
>sequence2 MONA
gcttagccct aaacctcagt agttaaaaca acaaaactac tcgccagaat actacaagca 60
acagcttgaa actcaaagga cttggcggtg cttcacatcc ccctagagga gcctgtccca 120
したにつづく
0210209
2008/09/19(金) 13:28:56ID:J2CRWlwv1 #!/usr/bin/perl
2 use strict;
4 use warnings;
6 open (my $fh,'<','fastafile.txt') or die "cannot open file\n";
8 $/ = '>'; #セパレーターを\nから変更
9
10 my @sequences = <$fh>;
11 shift @sequences; #要素数0は空だから削除
12
13 for (@sequences) {
14 s/^(.+)\n//; print ">$1\n"; s/\d|>//g;
17 #カウントとマッチしたところを大文字に
18 tr/ATGCU/atgcu/;
19 my $TAG = $_ =~ s/tag/TAG/igm;
20 my $TGA = $_ =~ s/tga/TGA/igm;
21 my $TAA = $_ =~ s/taa/TAA/igm;
22 print "$_ UAA:$TAG\n UAG:$TGA\n TAA:$TAA\n\n\n";
23 }
0211nobodyさん
2008/09/19(金) 13:53:37ID:???0212209
2008/09/19(金) 13:56:08ID:J2CRWlwvすいません。
改行制限に引っ掛かったので、14行目にまとめてました。
14 s/^(.+)\n//;
15 print ">$1\n";
16 s/\d|>//g;
0213nobodyさん
2008/09/19(金) 17:07:37ID:???$1 は、次に正規表現が呼ばれた際にクリアされる。当然、15行目の $1 は 16 行目には
クリアされているので、22 行目で print 出来るわけない。のはいいとして、、、
- 普通 fasta format には塩基数表示なんか無い。同様にスペース区切りも入らない。
もしあなたがそれを常用しているのなら、今すぐ止めた方が良い。
それは「 fasta format の様なもの」にしか過ぎない。
- さらにスクリプトの方では、塩基配列中の空白、改行が残る為 「 TA A 」などのケースを逃す。
(空白は通常の fasta format を想定してるならそれでも良いがそうなると s/\d|>//g; が謎。
改行の除去忘れは重大)
- local せずに $/ ='>' するのはスクリプトが大きくなった時、混乱を招くのでお勧めしない。
- frame 無関係に終止コドンの数を数えてどーすんの?
以下、引数に multi fasta、cds(DNA 配列) frame 毎の終止コドンの数を単純に数える場合。
# エラー処理など割愛、インデントは全角空白
sub cnt{
# sequence を 3base 区切りにし、table と照合し、該当数を帰す。
my %table = %{ shift @_ } ;
( my $seq = shift ) =~ s/(.{1,3})/$1 /g ;
return scalar grep { $table{$_} } split /\s+/, $seq ; # hit 無しの場合は 0 が帰る
}
my %stopcdn = qw( TAA 1 TAG 1 TGA 1 ) ;
# file を丸呑みした後、/(?=^>)/m にて split し、無名配列として回す。
for ( split /(?=^>)/m, do{ local $/ ; <> } ) {
s/^>(.*?)$//m ; my $name = $1 ; s/[\n\r\s]//g ; my $seq = uc ; # ごにょごにょ調整、大文字化
# frame 順に cnt させ、その結果をプリント。
printf "%s\tframe%d\t%d\n", $name, $_ + 1, cnt \%stopcdn, substr $seq, $_ for 0 .. 2 ;
}
0214209
2008/09/19(金) 18:44:46ID:???添削ありがとうございます。
半端な知識で回答してしまって申し訳ないorz
>>117氏を混乱させるとこでした。
出直してきます。
0215nobodyさん
2008/09/20(土) 07:08:55ID:???ゲームの得点ランキングを作ろうと思い、
名前・得点・コメントを入力してランキングに登録するといった形のものを作りたかったのですが、
値を入力し、送信してもうまく表示されません。
logのファイルに書き込みはできてるみたいですが、正しくかけていないように思えます。
どうすればランキングを表示できるでしょうか?
もうどこが間違ってるのか分からなくなってしまいましたので、アップロードさせていただきました。
どなたか修正・ご指導よろしくお願いします。
0216215
2008/09/20(土) 07:44:46ID:???URLミスです。こちらでお願いします。
http://www.cgi-web.net/download-top.html様の
quizというCGIを元に改造してみたものです。
よろしくお願いします。
0218nobodyさん
2008/09/20(土) 08:23:17ID:???0219nobodyさん
2008/09/20(土) 08:39:59ID:???★三 【 スクリプト改造工房 PART 9 】 ★三
http://pc11.2ch.net/test/read.cgi/php/1143834740/
0220215
2008/09/20(土) 18:44:01ID:???ありがとうございました。
0221nobodyさん
2008/09/21(日) 08:39:11ID:???どこの解説ページを見ればいい?
XAMPPと自分でインストールしたアパッチで、
もう、通常のHTMLファイルと、PHPは
動くようになってます。
PerlもActivePerlでDOSプロンプトのコードは
動くようになってます。
あと、たぶんアパッチの設定だと思うんですけど。
0223nobodyさん
2008/09/21(日) 10:49:20ID:???それで、普通のhtmlファイルは表示できるし、
http://localhost/1/1.htmlとかで。
そんで、PHPのファイルも実行できるんよ。
http://localhost/xampp/
そんで、今、パソコンの中に、
ActivePerlがインストールされているんだけど、
さらに、xamppのホームページにある、
perlのアドオン、ていうのをとってきて、
インストールしないとだめなのかなぁ?って思って。
でも、そんなことしたら、自分のパソコンの中に、
activeperlと、xamppのperlと、二つのperlが混在することに
なりますよね。それでいいのかなぁ?と。
0224nobodyさん
2008/09/21(日) 10:51:02ID:???自分のパソコンの中で動かすこと!
で、アパッチはたぶん、xamppのアパッチを使えばいいと
おもうんだけど、perlは、前から使ってるactiveperlで
いいのかな?って。
その場合、何か設定は必要なの?
その場合、その設定は、xamppの、アパッチの、
httpd.confに対して行うの?
0225nobodyさん
2008/09/21(日) 10:59:17ID:???できた。できた。できた。できた。できた。できた。できた。できた。できた。できた。できた。
ボクのパソコンの中でハローワールドが動いた!!!!!!!!!!!!!
0226nobodyさん
2008/09/21(日) 11:10:05ID:???忘れていたものを思い出させてくれた
0227nobodyさん
2008/09/21(日) 14:44:46ID:???0228nobodyさん
2008/09/21(日) 18:53:27ID:???0229nobodyさん
2008/09/21(日) 21:55:27ID:???0230nobodyさん
2008/09/21(日) 23:12:41ID:???0231nobodyさん
2008/09/22(月) 02:52:25ID:???0232nobodyさん
2008/09/26(金) 08:48:40ID:???for (1..5) {
flock(FH, 2) and last;
sleep 1;
}
0233nobodyさん
2008/09/26(金) 10:00:49ID:???0234nobodyさん
2008/09/26(金) 10:12:12ID:???0235nobodyさん
2008/09/26(金) 11:15:27ID:???いくつかのファイルのうちどれかでロックが取得できればいい場合に
LOCK_NBつけて、場合によってはループまわすことはあるが
普通に使ってる分にはそんな事する必要もない
0236nobodyさん
2008/09/26(金) 11:25:11ID:???0237nobodyさん
2008/09/26(金) 11:27:33ID:???0238nobodyさん
2008/09/26(金) 12:15:18ID:???了解しました。
0239nobodyさん
2008/09/26(金) 13:37:22ID:???0240nobodyさん
2008/09/29(月) 01:27:41ID:???規模が大きくなるにつれてファイルを分割したのですが、
モジュールが呼び出し元のパッケージの変数を要求することが多く、
一々変数の前にパッケージ名をつけなければならないのが非常に面倒です。
mainパッケージの変数を簡単に呼べるようにno strictしたりもしましたが、
こうするとコードを書く効率が悪くなります。
何か解決法は無いでしょうか?モジュールの分割の方法が下手なんでしょうか。
0241nobodyさん
2008/09/29(月) 01:39:41ID:???0242nobodyさん
2008/09/29(月) 01:53:46ID:???わざわざ名前空間を明示しない意味がわからない
例えば新宿駅で、京王線のホームで駅員を呼んだら京王線の職員が駆けつけてくれたのに
「JRの職員が来ないのはなぜだ!!(#゚Д゚)」と言ってごねている人を君はどう思うか・・・
八王子市内から市外局番なしで電話をかけておいて、「03局に繋がらない!!(#゚Д゚)」と言って
NTTにクレームを付ける人をどう思うか・・・
0243nobodyさん
2008/09/29(月) 04:50:42ID:???以下のようなプログラムをtest.plとして保存し、プロンプトから
>perl test.pl hoge hugaと実行すると引数が想定どおりに表示されていきますが
>test.pl hoge hugaとすると何も表示されません。
拡張子.plはperl.exeと関連付けられているので実行はされるんですが、引数がうまくわたっていないようです。
後者の場合でも引数が表示されるようにするにはどうすれば良いでしょうか教えてください。
$i = 0;
foreach (@ARGV) {
print "$i:$_\n";
$i++;
}
環境:WindowsXPとActivePerl v5.8.8
0244nobodyさん
2008/09/29(月) 09:02:48ID:???廃棄するしかないですね
0245nobodyさん
2008/09/29(月) 10:17:10ID:???関連付けが間違ってるか、Windowsが壊れたかのどっちか。
うちのWindowsは、たまに関連付けが壊れるので困る。
C:\Perl\bin\perl.exe "%1" %*
0246nobodyさん
2008/09/29(月) 14:38:34ID:???それで画像のリサイズはImage::Magickで何とかなったんですが、作成後の容量がかなり大きくなります。
元の画像が100KBに対して、サムネ画像は30KBくらい。
quality値を下げても、画像が劣化するだけで容量がほとんど変わりません。
解像度はこれ以上落とせないとして、何か容量減らす方法って何か無いでしょうか?
理想は10KB以下で、画像の劣化は多少は諦めます。
どなたか分かる方がいればお願い致します。
0247nobodyさん
2008/09/29(月) 15:59:15ID:???どういうコード書いてるかエスパーじゃないからわからないけど小さくするのにresize関数
使ってるとか?
0248nobodyさん
2008/09/29(月) 17:18:36ID:???resizeで画像を小さくした後、Setで画質を下げてます。
以下ソース。
$gazouはアップされた640×480の画像です。
use Image::Magick;
$image = Image::Magick->new;
$image->Read("$gazou");
$image->Resize(width => 160,height => 120);
$image->Set(quality=>50);
$image->Write("$gazou2");
0249247
2008/09/29(月) 18:00:47ID:???$image->Sample(width=>160, height=>120);
thumbnailって関数あったと思ってたけどぐぐっても見つからなかった
ScaleかSampleだったかな
とにかく画像の容量は境目が鮮明なほど大容量になるから普通はぼかし入れてサイズ変更
することで容量がコンパクトに収まる。確かResize関数はそれをやってなかったから脹れる
0250nobodyさん
2008/09/29(月) 18:08:53ID:???return $rc if $rc = $image->Read( $_[0] );
my($width,$height) = $image->Get( 'width' , 'height' );
return $rc if $rc = $image->Thumbnail( width => $WIDTH , height => $height * ( $WIDTH / $width) );
return $rc if $rc = $image->Write( $_[1] );
0251nobodyさん
2008/09/29(月) 18:29:54ID:???JPEG使えばquality=>50で大体10k切れると思う。
0252246
2008/09/29(月) 20:17:47ID:???>>250を参考に、>>248のソースの中のこの行を、
$image->Resize(width => 160,height => 120);
$image->Thumbnail(width => 160,height => 120);
こう変えてみたのですが、エラーも何も出ずに処理が中断されました。
ちなみにResizeをScaleとSampleに変えた場合は、いちおう画像は作成されましたがResizeと同じような容量でした。
ひょっとしてサーバーが対応してないのかな…
0253251
2008/09/29(月) 20:25:35ID:???せいぜい頑張りたまえ。
0256251
2008/09/29(月) 22:15:24ID:???Image::Magick使ってから発言してるか?
160*120ドットにResizeして、JPEG,Quality50でWriteするだけで、10KB以下になるぞ。
0257251
2008/09/29(月) 22:20:16ID:???GIFで圧縮したとしても、15KB程度ぐらいには圧縮可能だろうさ。
0258nobodyさん
2008/09/29(月) 22:24:21ID:???今回の場合とは違うかもしれないが、自分も似たような症状でハマったことがある。
原因は、画像に含まれるコメントなどの付加情報だった。
Thumbnailなら消えるのかな?
0259251
2008/09/29(月) 22:30:58ID:???0261246
2008/09/29(月) 22:56:00ID:???結果から言うと無事に減量に成功しました。
>>258さんの言う通り余計な情報が入ってたからみたいで、
$image->Profile();
このコマンドを使って付加情報を消してみまたところ、元が200KBの画像もQuality75で4KBほどに落ちました。
>>251さんの言うStripも試してみましたが、サーバーが対応してないのかしてエラーが…
何かあまりよく無い方法かもしれないけど、とりあえず減らせたのでこれでいってみようと思います。
本当はThumbnailが使えたら一番良かったんだろうけど…
皆様、どうもありがとうございました。
0262258
2008/09/29(月) 23:41:26ID:???お。そりゃえがった
0263nobodyさん
2008/09/30(火) 11:08:00ID:???くっついてるライブラリの問題?
0264246
2008/09/30(火) 14:15:08ID:???ロリポップですorz
多分かなりバージョンが古いと思います。
ローカルのサーバーだとImage::Magickの最新版入れたからどっちのコマンドも使えるんだけど…
逆にProfileがエラーで使えず。
このどっちつかずの状態が非常に面倒だw
0265nobodyさん
2008/09/30(火) 16:09:35ID:???0266nobodyさん
2008/09/30(火) 16:40:02ID:???0267nobodyさん
2008/09/30(火) 18:15:01ID:WMNZymKE0268nobodyさん
2008/09/30(火) 18:50:21ID:???Win32API も呼べる
http://www.google.co.jp/search?num=100&hl=ja&safe=active&client=firefox&rls=org.mozilla%3Aja%3Aofficial&hs=6gw&q=perl+Windows+GUI&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja
0269244
2008/10/01(水) 05:05:58ID:???assoc .pl=Perl
ftype Perl=C:\Perl\local\bin\perl.exe "%1" %*
と何度かしているうちに直った
ありがとう
0270nobodyさん
2008/10/03(金) 14:04:41ID:???もしくはモジュールはありますでしょうか?
0271nobodyさん
2008/10/03(金) 14:23:53ID:???■ このスレッドは過去ログ倉庫に格納されています