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/
0039nobodyさん
2008/08/10(日) 13:54:06ID:e4jqjZel#!C/:perl/bin/perl
として指定していますがこれをを
#!usr/bin/perl
で動かしたいのですが良い方法はありますか?
0040nobodyさん
2008/08/10(日) 14:25:28ID:???試してからもう一度聞きに来てくださいな。
あ、あたち、……待ってゆかやぁ!
# ちなみにそれ、どっちもたぶん間違っているけれど釣りなのか typo なのか。
0041nobodyさん
2008/08/10(日) 15:25:56ID:???まあ、何も書いてなくても動くけど。
004236
2008/08/11(月) 21:00:27ID:???何度やっても、ぴったり再現するようなら、以下の原因が考えられます。
- Windows Vista 搭載 cmd.exe(?) の新機能
- Windows Vista の新機能
- Perl もしくは Module のバージョンが古臭い
当方は以下の環境で相変わらず再現せず:
Perl 5.10.0, (nyacus.exe|cmd.exe|command.com), Windows XP Professional SP2
0043nobodyさん
2008/08/13(水) 12:07:37ID:???どのように記述すればいいでしょうか?
$str = 'XXX,YYY';
$aa = $ARGV[0]; # (.+),(.+)
$bb = $ARGV[1]; # $2-$1
$str =~ s/$aa/$bb/; # YYY-XXX になるようにしたい
0044nobodyさん
2008/08/13(水) 12:41:40ID:???ただ$1-$2は"で囲わないと、変数展開しないと思う。
0045nobodyさん
2008/08/13(水) 23:35:35ID:???そのまま $1-$2 に置換されます。
できないのでしょうか。
0047nobodyさん
2008/08/14(木) 04:07:34ID:???忘れずに。
0048nobodyさん
2008/08/14(木) 09:24:20ID:???eを使わなくても変数展開するが、その場合は一度しかしない。
$2-$1だと引き算が行われるので、"で囲って変数展開が行われるようにする。
0049nobodyさん
2008/08/14(木) 15:40:50ID:???最終的にこうしました。
$str = 'XXX,YYY';
$aa = $ARGV[0]; # (.+),(.+)
$bb = $ARGV[1]; # $2-$1
$bb = "\"".$bb."\"" if($bb =~ /[\$]\d/);
$str =~ s/$aa/$bb/ee; # YYY-XXX になるようにしたい
0050nobodyさん
2008/08/16(土) 16:45:37ID:oiXxzTPYMIME::Parserを使用してメールを処理したいのですが
my $parser = MIME::Parser->new();
$parser->parse(\*STDIN);
のparseを呼び出した時点で処理がとまってしまいました。
無限ループではまったかのようにとまっています。
falseも返ってきません。
ネットを調べても、上記の状態でとまったという事例を
発見することができませんでした。
原因として考えられることはどのようなことでしょうか?
0051nobodyさん
2008/08/16(土) 16:54:48ID:???0052nobodyさん
2008/08/16(土) 17:02:50ID:oiXxzTPYwhile(<STDIN>){
$buf .= $_;
}
my $entity = $parser->parse($buf);
ありがとうございます。
この形でよろしいでしょうか?
上の形にしても現状の解決はできませんでした。
新しくわかったこととして、メールに画像を添付した際に
とまってしまっていることがわかりました。
ファイル添付をしていないメールならば
$parser->parse()を抜けてきているようです。
0053nobodyさん
2008/08/16(土) 17:46:56ID:???0054nobodyさん
2008/08/16(土) 18:02:12ID:oiXxzTPY正直今ひとつわかっていないと思います。
どこか、大前提のようなものが抜けているのでしょうか?
0055nobodyさん
2008/08/16(土) 23:56:28ID:???qmail 使ったことないんでわからんけど。
0056nobodyさん
2008/08/17(日) 01:13:43ID:???0057nobodyさん
2008/08/17(日) 03:07:34ID:???.qmail 使わずに添付ファイルの受信は出来てるのかとか、色々問題を切り分けてみてよ
あと止まる直前か直後の文字コードを、正常に受信出来たときのコードで憶測してみるとか
まだまだやることはあるんじゃないの?
0058nobodyさん
2008/08/17(日) 04:50:10ID:???そのファイルが展開できるかどうかをチェックしてみればいいんじゃないのか。
あと、エラートラップは、きっちり書いて。
0059nobodyさん
2008/08/18(月) 10:53:12ID:???質問者が特定場所以降のドロップっ意味で止まってるって書いてるならやる意義は十分ありますが…
0060nobodyさん
2008/08/18(月) 11:46:03ID:???0061nobodyさん
2008/08/18(月) 12:32:24ID:???0063nobodyさん
2008/08/19(火) 18:06:14ID:???項目を数字で指定しない方向で同等の処理は出来ないでしょうか。
お願いします。
' VB+oo4o
OraDynaset = OraDataBase.DbCreateDynaset(SQL_STR, 0&)
aaa = OraDynaset.Fields("AAA").Value
# Perl+oo4o
my OraDynaset = OraDataBase.DbCreateDynaset(SQL_STR, 0)
$aaa = $OraDynaset->Fields('AAA')->{Value};
結果:Can't call method "Fields" on an undefined value at ***.
$aaa = $OraDynaset->{Fields('AAA')}->{Value};
結果:Undefined subroutine &main::Fields called at ****
0064nobodyさん
2008/08/19(火) 18:26:43ID:???0065nobodyさん
2008/08/19(火) 23:26:21ID:???自覚はないのかも知れないけれど、なんだかすごく混乱しているみたい。
VB, Oracle, oo4o, OLE, Perl のそれぞれに分けて把握を整理したほうがよさげ。
0066nobodyさん
2008/08/20(水) 10:57:24ID:???エラーメッセージから分かるのは、Fieldsをメソッド/サブルーチンとして呼び出そうとしている。
それを踏まえてPerlの文法をもう少し勉強してみます。
0068nobodyさん
2008/08/20(水) 23:50:12ID:???文字列で、"20080820"となっている
前日(昨日)を求めるコーディングを
教えてください。
0069nobodyさん
2008/08/20(水) 23:54:12ID:???0071nobodyさん
2008/08/21(木) 00:34:14ID:???0072nobodyさん
2008/08/21(木) 01:40:28ID:???0073nobodyさん
2008/08/21(木) 01:50:41ID:???0074nobodyさん
2008/08/21(木) 02:22:39ID:???とか
use Date::Manip qw(UnixDate DateCalc Date_Init);
とか。
0075nobodyさん
2008/08/21(木) 02:56:24ID:???日付の話がでたついでに質問なのですが、Nヶ月後とかNヶ月前ってどうやって計算してる?
(というよりどう定義してるかの問題?)
Q1. 1月31日の一ヶ月後
Q2. 2月28日の一ヵ月後
Q3. 3月31日の一ヶ月前
Q4. 3月31日の一ヵ月後
0076nobodyさん
2008/08/21(木) 03:46:07ID:???ttp://www5d.biglobe.ne.jp/~Jusl/TomoLaw/KikanKeisan.html
007763
2008/08/21(木) 08:04:49ID:???";"は当たり障りある部分を消すときに一緒に消えたのでしょう。
一応、文字コードが変な様ですが、通ることは通るようになりました。
項目指定にリテラル数字/リテラル文字列を指定すると変なままですけど。
my $OraSession = Win32::OLE->new ("OracleInProcServer.XOraSession");
my $OraDatabase = $OraSession->DBOpenDatabase("orcl", "scott/tiger", 0);
my $oDyna = $OraDatabase->CreateDynaset("SELECT * FROM ****", 0);
my %FN;
my $i;
for ($i = 0; $i < $oDyna->Fields->Count ; $i++){
$FN{$i} = $oDyna->FieldName($i);
}
while(!($oDyna->{EOF})) {
for ($i = 0; $i < $oDyna->Fields->Count ; $i++){
print $oDyna->Fields($FN{$i})->Value, "\n";
}
print "\n";
$oDyna->MoveNext;
}
0078nobodyさん
2008/08/21(木) 09:39:20ID:VetJG0Vxprint $OraDynaset->Fields('ABCD')->Value."\n";
は普通に通ります。
0079nobodyさん
2008/08/23(土) 09:30:39ID:???ギャル文字の正規化モジュールとか知りませんか。ギャル文字への変換じゃなく、ギャル文字からの変換。
手作業で対応表を組もうとかも考えましたが、無謀すぎた……orz
0080nobodyさん
2008/08/23(土) 10:04:39ID:???今様々なWEBページからHTMLを取得して、それをShiftJISに変換しているのですが、
JcodeでもEncodeでも一部のページで文字化けが起こって困っています。
文字化けを極力起こしたくない場合、どのような変換方法がいいのでしょうか?
0081nobodyさん
2008/08/23(土) 10:17:15ID:???元ページ自体が文字化けしてるかどうか目視することも一考
0082nobodyさん
2008/08/24(日) 04:03:35ID:???decoded_contentが一番楽っぽい。
gzip/deflateにも対応してるみたいだし。
$r->is_success or die $r->status_line;
my $content = $r->decoded_content();
defined $content or ...;
utf8で出てくるから、あとは適当に変換で。
008380
2008/08/25(月) 20:08:13ID:???文字化けするページは一部文字化けしている場合が多いですね。
もともとそのページに問題があるのかも知れません。
>>82
そんな方法あったんですね、初めて知りました…。
近いうちに試してみようと思います。
返信ありがとうございました。
0084nobodyさん
2008/08/27(水) 11:11:12ID:???自分で内容を追加していくといった物ではなくて、既存のHTMLにチェックボックスがあり、
そこにチェックを入れ、「保存する」ボタンを押したら、ログファイルにチェックされているか否かを保存し、
更新後にチェックされている状態が保存されている物を作りたいのですが、このような処理はどのようにしてやれば良いのでしょうか?
最終的には自分でToDoの内容も掲示板みたく追加出来るようにしたいです。
0085nobodyさん
2008/08/27(水) 12:03:04ID:???0086nobodyさん
2008/08/27(水) 15:59:09ID:???外部のものなら、パーサーで解析してチェックボックスを割り込ませて出力、とかいうことになるんじゃないか。
この作業が一番めんどくさい。
0087nobodyさん
2008/08/27(水) 19:52:46ID:???紹介されていたんだけど、これって現役?
0088nobodyさん
2008/08/27(水) 20:00:37ID:???0089nobodyさん
2008/08/27(水) 20:35:39ID:???0090nobodyさん
2008/08/27(水) 20:45:09ID:???0091nobodyさん
2008/08/27(水) 21:02:23ID:???0092nobodyさん
2008/08/27(水) 21:25:25ID:???お好みでCGI::MinimalでもCGI::Simpleでも。
0093nobodyさん
2008/08/27(水) 21:49:46ID:???車輪の再発明?
0094nobodyさん
2008/08/27(水) 22:34:42ID:???トレーニングのための再発明にゃあ手頃な車輪だろ。
よそに迷惑かけないようにさえすりゃ誰も止めねえよ。
0095nobodyさん
2008/08/28(木) 10:53:23ID:???CGIやCGI::Liteやフレームワークに丸投げした方がいい、と昔Perlスレで言われた
0096nobodyさん
2008/08/28(木) 16:12:26ID:???CGI::Minimalと
CGI::Simpleとで、
どれを使えばいいの?
0097nobodyさん
2008/08/28(木) 16:28:55ID:???0098nobodyさん
2008/08/28(木) 20:19:56ID:???実際のサービスの為に作りこむのはアンチパターンの"高慢"。
0099nobodyさん
2008/08/28(木) 22:31:17ID:oELFSwbaPHPで言うところのupload_max_filesizeやpost_max_sizeは、
Perlではどこら辺を設定すればいいんですか?
0101nobodyさん
2008/08/28(木) 23:59:40ID:???CGI.pmが簡単、は例からわかるんだが、
汚れた変なデータ渡されても誤動作しないのかとか
デフォルト設定をちゃんと覚えないととかちょっとだけ不安。
0102nobodyさん
2008/08/29(金) 08:08:31ID:???何時の話だ
0103nobodyさん
2008/08/29(金) 10:08:36ID:???0104nobodyさん
2008/08/29(金) 15:26:13ID:???マルチパートのパースがむつかしい、、、というかめんどくさい。。
while(<STDIN>)
ってしたら、大きい添付ファイルきたらいちどメモリに確保する分つらいしな。。
readでちょっとずつ読むしかないのか、、
0105nobodyさん
2008/08/29(金) 15:27:54ID:???0106nobodyさん
2008/08/29(金) 15:45:42ID:???0107nobodyさん
2008/08/30(土) 09:40:00ID:???0108nobodyさん
2008/08/31(日) 18:20:50ID:???Perl は汎用言語として開発されています。
そのためその言語仕様は CGI (をはじめとする Web プログラミング) など他の周辺仕様と直行しており、その点で PHP とは事情が異なります。
Web アプリケーション開発のために生まれたのが PHP で、
Web アプリケーション開発にも流用されているのが Perl であると言うこともできます。
Perl は CGI で利用できる言語として広く普及しました。
その過程で生まれたノウハウを抽出したものが CGI::* などのモジュール群です。
幸い CGI.pm は pure Perl ですから、この機会に目を通してみてはいかがでしょう。
その上で、あなたが必要とする品質に達していないと判断したなら、それは新しい車輪を作るに充分な理由だと思います。
イイモノができたら CPAN で公開してください。使わせてもらいます。
0109nobodyさん
2008/09/02(火) 08:28:05ID:guk/QrQq今スコアについて作成しているのですが
どうにも反映されません、何が違うのでしょうか
Flashのスコア登録コードは
stop ();
CGIFile = "test.cgi?" + Math.floor(Math.random() * 1000);
mySaveVars = new LoadVars();
mySaveVars.score = score;
mySaveVars.playername = playername;
myLoadVars = new LoadVars();
myLoadVars.onLoad = function (success)
{
var _loc1;
for (var _loc1 = 0; _loc1 < RANK_MAX; ++_loc1)
{
ranker[_loc1].playername = myLoadVars["name" + _loc1];
ranker[_loc1].score = myLoadVars["score" + _loc1];
} // end of for
gotoAndStop("display");
};
mySaveVars.sendAndLoad(CGIFile, myLoadVars, "POST");
0110nobodyさん
2008/09/02(火) 08:30:11ID:guk/QrQquse CGI 'Vars';
my %in = CGI::Vars;
open LOG, '+<score.dat';
my %rank = map { chomp; split /\t/, $_, 2; } <LOG>;
$rank{$in{score}} = $in{name} if $rank{$in{score}} < $in{name};
my @rank = sort { $rank{$b} <=> $rank{$a} } keys %rank;
truncate LOG, 0;
seek LOG, 0, 0;
print LOG map { "$_\t$rank{$_}\n" } @rank[0..9];
print "Content-type: text/plain\n\n";
print map { "score$_=$rank[$_]&name$_=$rank{$rank[$_]}&" } 0..9;
test.cgiにはtop10の空欄表示はされますが
登録する画面にはいかずそのまま終わってしまいます
score.datも空欄ですが、動いているようです
0111nobodyさん
2008/09/02(火) 15:54:14ID:XutqN0xSログに場所や原因を特定できる情報を吐くために、
callerで大元の呼び出し元からのツリーを吐く方法を探してます。
力技でやれば、階層確認用の変数を作って
mainから関数を呼ぶたびに1ずつインクリメントしていってエラー関数でforで
階層確認用の変数の分だけ回せば出来るとは思うんですが、
sub err {
my ($sadd) = @_;
my $s;
for ($i=MAXVALUE; $i <= 0; $i--) {
$s .= caller($i).' / ';
}
print STDERR $sadd."\n".$s;
}
手動でインクリメントすることなく、上記のMAXVALUEを取得する方法はありませんでしょうか。
0112nobodyさん
2008/09/02(火) 17:08:26ID:62/De0KZ$hoge=gethostbyaddr(pack('C4',split/\./,$ENV{'REMOTE_ADDR'}),2)||$ENV{'REMOTE_ADDR'};
以下の場合だと、$hogeは空になります。
$hoge=gethostbyaddr(pack('C4',split/\./,$ENV{'REMOTE_ADDR'}),2)or$ENV{'REMOTE_ADDR'};
後者が空になってしまうのは何故ですか?
0113nobodyさん
2008/09/02(火) 17:20:16ID:???($hoge=gethostbyaddr(pack('C4',split/\./,$ENV{'REMOTE_ADDR'}),2)) or$ENV{'REMOTE_ADDR'};
0115nobodyさん
2008/09/02(火) 17:37:04ID:62/De0KZそういうものなんですね。ありがとうございました。
0116nobodyさん
2008/09/02(火) 17:44:36ID:???confessも読んでいくと
my $pkg = caller(++$i);
unless(defined($pkg)) {
みたいなことをしてループでネストの深さ調べてるから
インクリメントしていると言える。
見かけ上自分でインクリメントしなけりゃいいならこれで
いいんだろうけどな。
0117nobodyさん
2008/09/02(火) 17:52:27ID:IiWNBMxF0118nobodyさん
2008/09/02(火) 17:55:37ID:???ありがとうございます
> my $pkg = caller(++$i);
> unless(defined($pkg)) {
こんなこと出来るんですね…
すみません調べが足りず、callerに対して無効な範囲の引数を渡したら
落ちちゃうもんだとおもってました。
目的としては、余計な引数のリレーとかグローバル変数とか使わずに
エラーサブだけでツリー生成することでしたので、下記のような感じでテストしてみます。
うまく行ったら〆報告します。
sub err {
my ($sadd) = @_;
my @return;
my $i = 0;
while(1) {
my $s = caller($i);
if (defined $s) {
@return .= $s;
} else {
last;
}
$i++;
}
print STDERR $sadd."\n".(join ' / ', reverse @return);
}
0119nobodyさん
2008/09/02(火) 17:58:31ID:IiWNBMxF0120nobodyさん
2008/09/02(火) 18:34:27ID:???抜粋ですが、下記でツリーというかパンくずリストというかそれっぽいものが出力できました。
ただ、ファイル名はrequireした元ではなく全て実行ファイル名になるようで、
あんまり意味無かったかも…
>my $i = 0;
>while (($package,
> $filename,
> $line,
> $subroutine,
> $hasargs,
> $wantarray,
> $evaltext,
> $is_require,
> $hints,
> $bitmask) = caller($i++)) {
> push @aTree, "$filename\($line\) $subroutine";
>}
>my $sRev = join ' => ', (reverse @aTree);
>print STDERR $sRev
以上、ありがとうございましたー
>>118は無限ループっぽいのでご注意下さい
0121nobodyさん
2008/09/02(火) 18:54:50ID:???0122nobodyさん
2008/09/02(火) 19:06:01ID:???なんで…?
と思ってよくよく考えたら、confessそのまま使えばよかったのか…orz
すみませんなにか焦りのままにわけのわからない事をしてしまったようで…orz
0125nobodyさん
2008/09/03(水) 02:01:14ID:???何の初心者かと言えばまず間違いなく Perl の初心者さんで、
バイオなんとかについては専門 (恐らく受講中) ということであれば、
# (この程度の情報はよこしてもよかろう、ケチんぼめ)
「バイオインフォマティクスのためのPerl入門」(ISBN4-87311-103-X)
を買え。
0126125
2008/09/03(水) 02:16:22ID:???これを機会にPerlをイチから少々嗜んでおこうと考えたなら
(または「バイオ(以下略)」のPerlに歯が立たなかったら)、
次の書籍から入るのが王道よん。
「初めてのPerl 第3版」(ISBN4-87311-126-9)
いずれにせよこの手の応用なら計算のためのモデル化が必須で、
モデル化するためには当該分野の知識が必要、と。
数式にまで落し込んで示せば誰かコード例を書いてくれるかもね。
しかしそこまでできれば自分で書けちゃうよなあ。w
0127nobodyさん
2008/09/03(水) 02:46:19ID:???習い事板にでも書いて。
0128nobodyさん
2008/09/03(水) 02:49:05ID:???結城さんのだよ。
ほかのはむずかしすぎて(説明が下手すぎて)わかんないとおもう。
0129nobodyさん
2008/09/03(水) 02:57:19ID:???ここをこう直せばこう行ける、みたいな経験則で。
0130nobodyさん
2008/09/03(水) 05:15:42ID:???ラクダ本やPerldocなど読んで、基本をしっかりマスターすることが大切。
文法エラーが出なければ、なんでも良い訳じゃない事を知って欲しい。
特にファイルオープンのエラー処理を省く奴。
0132nobodyさん
2008/09/03(水) 09:20:14ID:???0133nobodyさん
2008/09/03(水) 09:29:36ID:???頭の悪すぎる奴というのであってる。
0134nobodyさん
2008/09/03(水) 11:33:27ID:???そして素人に最初から完璧な探し方を要求する
0135nobodyさん
2008/09/03(水) 11:37:02ID:???0136nobodyさん
2008/09/03(水) 11:59:41ID:???連発する新人が来て、一週間で営業に飛ばしたのを思い出した。
0137nobodyさん
2008/09/03(水) 13:16:42ID:???0138nobodyさん
2008/09/03(水) 13:22:49ID:???■ このスレッドは過去ログ倉庫に格納されています