Perlコーディング初心者質問スレ Part 58at PHP
Perlコーディング初心者質問スレ Part 58 - 暇つぶし2ch1:nobodyさん
08/08/06 22:54:32
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ スレリンク(php板)
過去ログ倉庫 URLリンク(user.ftth100.com)

2:nobodyさん
08/08/06 22:56:09
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: URLリンク(www.site-cooler.com)

[本]
リャマ: URLリンク(www.oreilly.co.jp)
駱駝: URLリンク(www.oreilly.co.jp)
Effective Perl: URLリンク(www.ascii.co.jp)
クックブック: URLリンク(www.oreilly.co.jp)
Perl ベストプラクティス: URLリンク(www.oreilly.co.jp)
Perl Hacks: URLリンク(www.oreilly.co.jp)

[オンラインマニュアル] (追加)
最新のドキュメント: URLリンク(search.cpan.org)
perl5.8.xのドキュメント(一部): URLリンク(www.kt.rim.or.jp)
perl5.005_03 のドキュメント: URLリンク(www.kt.rim.or.jp)
日本語ドキュメント検索: URLリンク(www.cpan.jp)
perldoc.jp: URLリンク(www.perldoc.jp)
Perldoc.com: URLリンク(www.perldoc.com)

3:nobodyさん
08/08/06 22:56:31
ム板Perlスレより 2 of 2

[モジュール]
CPAN.com: URLリンク(search.cpan.org)
河馬屋二千年堂: URLリンク(homepage3.nifty.com)

[テクニック]
Perlメモ: URLリンク(www.din.or.jp)
Perlのページ: URLリンク(homepage1.nifty.com)
Perlの小技: URLリンク(homepage3.nifty.com)

[Perl5.8Unicodeメモ]
URLリンク(www.pure.ne.jp)
URLリンク(www.namazu.org)
URLリンク(www.lr.pi.titech.ac.jp)

4:nobodyさん
08/08/07 00:19:06
say >>1 '乙';

5:nobodyさん
08/08/07 07:15:27 1CE8PFPT
Webページを取得するため、LWP::UserAgentを使用したのですが、
ある特定のページでは途中で切れてしまいます。

データサイズも大きくないのに、
なぜ途中で止まってしまうのかがわかりません。。

#!/usr/local/bin/perl
use strict;
use warnings;
use LWP::UserAgent;

my $url = 'URLリンク(human7.2ch.net)';
my $browser = LWP::UserAgent->new;
my $resp = $browser->get($url, 'User-Agent' => 'test');

print $resp->content;


6:nobodyさん
08/08/07 11:10:29 qpI1q2Ei
URLリンク(www.rescue.ne.jp)
このような暗号化するサイトをつくりたいです。
暗号化に使用するスクリプトは知り合いに作ってもらいました
sub enc_string{
my ($key, $string) = @_;
my @map = (('A' ... 'Z'), ('a' ... 'z'), ('0' ... '9'), '+', '&');
my @key = unpack('C*', $key);
my $str = '';
my @x = map { int(rand(200)) } (0 ... 2);
@key = map {$x[$_] ^ $key[$_]} (0 ... 2);
while($string ne ''){
my $n = substr($string, 0, 3, '');
my @n = unpack('C3', $n);
map{$n[$_] ^= ($key[$_])} (0 ... 2);
@key = unpack('C3', $n);
@key = map {$x[$_] ^ $key[$_]} (0 ... 2);
my $a = $n[0] >> 2;
my $b = (($n[0] & 3) << 4) | ($n[1] >> 4);
my $c = (($n[1] & 15) << 2) | ($n[2] >> 6);
my $d = $n[2] & 63;
$str .= $map[$a] . $map[$b] . $map[$c] . $map[$d];
}
my $a = $x[0] >> 2;
my $b = (($x[0] & 3) << 4) | ($x[1] >> 4);
my $c = (($x[1] & 15) << 2) | ($x[2] >> 6);
my $d = $x[2] & 63;
return $str.'<>'.$map[$a].$map[$b].$map[$c].$map[$d];
}

これをcgiとして上記のサイトのように出力するようにするにはどうすればいいでしょうか?

7:nobodyさん
08/08/07 11:45:30
$aとか$bはsortで使うから使わないほうが良いよ。

8:nobodyさん
08/08/07 12:07:07
>>7
知り合いに作ってもらったのですが、触り方がわかりません。
同じ出力でできるのでしたら教えてください

9:nobodyさん
08/08/07 12:17:13
知り合いに作ってもらえばいいだろw


10:nobodyさん
08/08/07 12:19:33
いや今海外に居て連絡がつかないんです
なのでこちらでお願いしているんです

11:nobodyさん
08/08/07 12:23:08
しらんがな

12:nobodyさん
08/08/07 12:31:41
さすがに変数を変更出来ないのは初心者以前の問題じゃんw
最低限の知識ぐらいは身につけてから来た方がいい。

13:nobodyさん
08/08/07 12:36:34
>>12
復号等は諦めますので、暗号化だけはしたいんです
初心者以前なのは承知の上で今回だけお願いします

14:nobodyさん
08/08/07 12:49:13
>>13
それに合ったスレがあるでしょう。

15:nobodyさん
08/08/07 13:00:58
>>14
すみません、誘導お願いします

16:nobodyさん
08/08/07 13:03:10
お断りします。

17:nobodyさん
08/08/07 13:17:02
>>15
今度だけだよ。次からは自分で探してね。

# アドバイスが欲しい場合:
★三 【 スクリプト改造工房 PART 9 】 ★三
スレリンク(php板)

# 誰かにやってもらいたい場合:
【 スクリプト改造依頼スレ 】(丸投げ) part7
スレリンク(php板)

18:nobodyさん
08/08/07 13:37:45
>>17
本当にすみません、ご迷惑おかけしました

19:nobodyさん
08/08/07 14:03:46
>>5
$resp->is_successと$resp->status_lineを確認してみれ。

20:nobodyさん
08/08/07 16:26:22
Template Toolkitで、HTMLを書くときに、セレクトメニューやラジオボタンの
初期値を設定するにはどうすればいいのでしょうか。
CGI.pmでセレクトメニューを作ったときのようにdefault値を指定できる仕組みがあると便利なのですが。
現状では一つ一つにifで

<select name="test">
<option value="test_1" [% IF test_1 %]selected="selected"[% END %]>test1<option>
<option value="test_2" [% IF test_2 %]selected="selected"[% END %]>test2<option>
<option value="test_3" [% IF test_3 %]selected="selected"[% END %]>test3<option>
</select>

こんな感じでやってるのですが、他に効率のいい方法があったら教えてください。

21:nobodyさん
08/08/07 16:55:07
>>5
っ[LWP::Debug*]

22:nobodyさん
08/08/07 16:57:22
>>20 HTML::FillInFormを通すとかダメ

23:nobodyさん
08/08/07 18:43:16
>>20
selectする要素がDBに入ってるから、
ループでまわして、同じ値だったらselectedするようにしてる。

24:nobodyさん
08/08/07 21:07:08
[% USE FillInForm %]
[% FILTER fillinform fdat => stash %]
<select name="test">
<option value="test_1">test1<option>
<option value="test_2">test2<option>
<option value="test_3">test3<option>
</select>
[% END %]

25:5
08/08/07 21:41:11 1CE8PFPT
不思議~!

print "content=" . $resp->content . "\n"; #これだとHTML全部表示される
#print $resp->content; #これだと途中で止まる

ちなみに、
>>19
is_success=1
status_lilne=200 OK
でした。(^^

>>21
出力結果がよくわからず。。まだまだ勉強が足りないようです。。

26:nobodyさん
08/08/07 22:25:18
バッファリングかよ。どういう出力先のどういう問題だ?

27:nobodyさん
08/08/08 02:06:15
my $c = 9250; #JISコードの"あ"
print Jcode->new(chr $c,"jis")->utf8,"\n";
print Jcode->new("あ","jis")->utf8, "\n";

異なる結果が表示されるのですが、同じ結果はどうすれば得られますか。


28:nobodyさん
08/08/08 02:32:39
JISの 'あ' は10進9250じゃなさそうな気がする

29:nobodyさん
08/08/08 02:35:43
ごめんなさい。>>28撤回。

30:nobodyさん
08/08/08 02:36:27
chr が返すのは Ascii だから、そこの時点で終わってる

31:20
08/08/08 11:08:08
>>22
こんなものがあったのですね。とても便利そうなので使ってみます。
>>23
ふむふむ
>>24
具体的な使い方ありがとうございます!

みなさんどうもありがとうございました。

32:nobodyさん
08/08/08 16:57:50
>>27
use Jcode;

my $c = 9250; #JISコードの"あ"
print Jcode->new(pack('A3n', "\e\$B", $c), "jis")->utf8, "\n";
print Jcode->new('あ',"jis")->utf8, "\n";


# ぶっちゃけJISではencoding使わないとスクリプトなんて書いてられないんだが、
# 言及してないところを見ると、後釣りなんだろうか。

33:nobodyさん
08/08/08 17:45:59
'あiう' が5バイト程で済みそうな感覚のまま気軽に試しただけじゃないかな。
本気でエスケープシーケンスにまみれてたら元質問が出てこない。

34:nobodyさん
08/08/08 18:32:27
>>32
ありがとう。助かりました。

35:5
08/08/08 23:12:59 6d/Auy3a
>>26
Windows Vista 、Active Perl v5.6.1、コマンドプロンプト
でHTMLをGETしてprint出力させたところ、下記結果になりますた。。
print $hoge ; #一定サイズで止まる
print "Content=" . $hoge ; #全部出力される

36:nobodyさん
08/08/10 01:25:04
>>35
うーん、再現しないなあ。ページは >>5 のソースのアレでいいんだよね?
他に再現するページはあります?

37:nobodyさん
08/08/10 08:17:20
>>35
Perl 5.8.8 on Linux
Perl 5.8.8 on WinXP

にて再現しませんでした。

38:35=5
08/08/10 12:35:43 FnBuPKsd
2chのレス900くらいのスレッドを読み込んでも、途中で止まります。

↓こんな感じ
c:\Perl>gethtml03.pl
 ~省略~
は意識してないんですが、これで(野村
c:\Perl>

下記のようにファイル出力させると正常に</html>まで書き込んでいました。
open(OUT, ">gethtml.txt");
print OUT $resp->content ;
close(OUT);

Perlの問題ではなくて、コマンドプロンプトが勝手にセッションを切ってしまうのかもしれません。。


39:nobodyさん
08/08/10 13:54:06 e4jqjZel
WinのActivePerlにて一行目に
#!C/:perl/bin/perl
として指定していますがこれをを
#!usr/bin/perl
で動かしたいのですが良い方法はありますか?

40:nobodyさん
08/08/10 14:25:28
>>39
試してからもう一度聞きに来てくださいな。
あ、あたち、……待ってゆかやぁ!

# ちなみにそれ、どっちもたぶん間違っているけれど釣りなのか typo なのか。

41:nobodyさん
08/08/10 15:25:56
どっちもアレだねw
まあ、何も書いてなくても動くけど。

42:36
08/08/11 21:00:27
>>38
何度やっても、ぴったり再現するようなら、以下の原因が考えられます。

- Windows Vista 搭載 cmd.exe(?) の新機能
- Windows Vista の新機能
- Perl もしくは Module のバージョンが古臭い

当方は以下の環境で相変わらず再現せず:
Perl 5.10.0, (nyacus.exe|cmd.exe|command.com), Windows XP Professional SP2

43:nobodyさん
08/08/13 12:07:37
置換で後方参照を変数展開したいのですが
どのように記述すればいいでしょうか?

$str = 'XXX,YYY';
$aa = $ARGV[0]; # (.+),(.+)
$bb = $ARGV[1]; # $2-$1
$str =~ s/$aa/$bb/; # YYY-XXX になるようにしたい



44:nobodyさん
08/08/13 12:41:40
eオプションとか使えば?
ただ$1-$2は"で囲わないと、変数展開しないと思う。

45:nobodyさん
08/08/13 23:35:35
eオプション付けても
そのまま $1-$2 に置換されます。
できないのでしょうか。


46:nobodyさん
08/08/13 23:51:09
>>45
一個じゃパワーが足りないんじゃね?

47:nobodyさん
08/08/14 04:07:34
e二つなら、"も二重にする必要がある。
忘れずに。

48:nobodyさん
08/08/14 09:24:20
変数展開二重にする必要があるから、明示的にeを使用する。それも2回。
eを使わなくても変数展開するが、その場合は一度しかしない。
$2-$1だと引き算が行われるので、"で囲って変数展開が行われるようにする。

49:nobodyさん
08/08/14 15:40:50
ありがとうございました。

最終的にこうしました。

$str = 'XXX,YYY';
$aa = $ARGV[0]; # (.+),(.+)
$bb = $ARGV[1]; # $2-$1
$bb = "\"".$bb."\"" if($bb =~ /[\$]\d/);
$str =~ s/$aa/$bb/ee; # YYY-XXX になるようにしたい


50:nobodyさん
08/08/16 16:45:37 oiXxzTPY
.qmailからパイプにて呼び出すプログラムで
MIME::Parserを使用してメールを処理したいのですが
my $parser = MIME::Parser->new();
$parser->parse(\*STDIN);
のparseを呼び出した時点で処理がとまってしまいました。
無限ループではまったかのようにとまっています。
falseも返ってきません。

ネットを調べても、上記の状態でとまったという事例を
発見することができませんでした。

原因として考えられることはどのようなことでしょうか?

51:nobodyさん
08/08/16 16:54:48
STDIN の内容を一旦読み込んで、読み込んだ変数に対してやってみて

52:nobodyさん
08/08/16 17:02:50 oiXxzTPY
my $buf;
while(<STDIN>){
$buf .= $_;
}
my $entity = $parser->parse($buf);

ありがとうございます。
この形でよろしいでしょうか?
上の形にしても現状の解決はできませんでした。
新しくわかったこととして、メールに画像を添付した際に
とまってしまっていることがわかりました。
ファイル添付をしていないメールならば
$parser->parse()を抜けてきているようです。

53:nobodyさん
08/08/16 17:46:56
まさか・・・Win/LinuxでのSTDIOの扱いはわかってるよね?

54:nobodyさん
08/08/16 18:02:12 oiXxzTPY
> まさか・・・Win/LinuxでのSTDIOの扱いはわかってるよね?
正直今ひとつわかっていないと思います。

どこか、大前提のようなものが抜けているのでしょうか?

55:nobodyさん
08/08/16 23:56:28
何かの理由で eof が来ていなくてずっと待機しとるのではないかな。
qmail 使ったことないんでわからんけど。

56:nobodyさん
08/08/17 01:13:43
問題を切り分けろよ。

57:nobodyさん
08/08/17 03:07:34
qmail のログとか、qmail のインストールで null に出してる内容を出させるとか
.qmail 使わずに添付ファイルの受信は出来てるのかとか、色々問題を切り分けてみてよ

あと止まる直前か直後の文字コードを、正常に受信出来たときのコードで憶測してみるとか
まだまだやることはあるんじゃないの?

58:nobodyさん
08/08/17 04:50:10
変数ではなくて、ファイルにキャプチャして、
そのファイルが展開できるかどうかをチェックしてみればいいんじゃないのか。

あと、エラートラップは、きっちり書いて。

59:nobodyさん
08/08/18 10:53:12
読み込んでる時に止まってるんだからファイルに落とせないのでは?
質問者が特定場所以降のドロップっ意味で止まってるって書いてるならやる意義は十分ありますが…

60:nobodyさん
08/08/18 11:46:03
ファイルに取れないのなら、Perlの問題じゃないってこった。

61:nobodyさん
08/08/18 12:32:24
おまえら親切だな

62:nobodyさん
08/08/18 14:52:08
>>59
おまえの想像はどうだっていい

63:nobodyさん
08/08/19 18:06:14
練習がてらVBのコードをPerlで書き直していますがうまく通りません。
項目を数字で指定しない方向で同等の処理は出来ないでしょうか。
お願いします。

' 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 ****



64:nobodyさん
08/08/19 18:26:43
そもそもVBでもうまく通ってないじゃないかwwwwwwwwwwww

65:nobodyさん
08/08/19 23:26:21
>>63
自覚はないのかも知れないけれど、なんだかすごく混乱しているみたい。
VB, Oracle, oo4o, OLE, Perl のそれぞれに分けて把握を整理したほうがよさげ。

66:nobodyさん
08/08/20 10:57:24
oo4oのマニュアルではFieldsはプロパティと成っています。
エラーメッセージから分かるのは、Fieldsをメソッド/サブルーチンとして呼び出そうとしている。

それを踏まえてPerlの文法をもう少し勉強してみます。


67:nobodyさん
08/08/20 23:15:22
>>63
perlの文法は行の最後にセミコロン;が必要だよ

68:nobodyさん
08/08/20 23:50:12
すんません、教えてください

文字列で、"20080820"となっている
前日(昨日)を求めるコーディングを
教えてください。

69:nobodyさん
08/08/20 23:54:12
20080820 - 1

70:nobodyさん
08/08/20 23:58:55
>>69
それだったら、
20080801
の場合はどうするのかな。

71:nobodyさん
08/08/21 00:34:14
Date::* なモジュールを使え。

72:nobodyさん
08/08/21 01:40:28
20080800になってしまうので困ります

73:nobodyさん
08/08/21 01:50:41
perl -MDateTime::Format::HTTP -e 'print DateTime::Format::HTTP->parse_datetime('20080821')->subtract(days => 1)->ymd("")'

74:nobodyさん
08/08/21 02:22:39
use Date::Calc qw(Add_Delta_Days);
とか
use Date::Manip qw(UnixDate DateCalc Date_Init);
とか。

75:nobodyさん
08/08/21 02:56:24
timelocalでepochタイムに戻して-24*60*60してlocaltimeに食わせる

日付の話がでたついでに質問なのですが、Nヶ月後とかNヶ月前ってどうやって計算してる?
(というよりどう定義してるかの問題?)

Q1. 1月31日の一ヶ月後
Q2. 2月28日の一ヵ月後
Q3. 3月31日の一ヶ月前
Q4. 3月31日の一ヵ月後

76:nobodyさん
08/08/21 03:46:07
>>75
URLリンク(www5d.biglobe.ne.jp)

77:63
08/08/21 08:04:49
>>67
";"は当たり障りある部分を消すときに一緒に消えたのでしょう。

一応、文字コードが変な様ですが、通ることは通るようになりました。
項目指定にリテラル数字/リテラル文字列を指定すると変なままですけど。

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;
}


78:nobodyさん
08/08/21 09:39:20 VetJG0Vx
$OraDatabase->CreateDynasetが転けていただけでした。

print $OraDynaset->Fields('ABCD')->Value."\n";
は普通に通ります。

79:nobodyさん
08/08/23 09:30:39
こっそりとsageて質問します。
ギャル文字の正規化モジュールとか知りませんか。ギャル文字への変換じゃなく、ギャル文字からの変換。

手作業で対応表を組もうとかも考えましたが、無謀すぎた……orz


80:nobodyさん
08/08/23 10:04:39
文字コードの変換について質問です。

今様々なWEBページからHTMLを取得して、それをShiftJISに変換しているのですが、
JcodeでもEncodeでも一部のページで文字化けが起こって困っています。
文字化けを極力起こしたくない場合、どのような変換方法がいいのでしょうか?

81:nobodyさん
08/08/23 10:17:15
文字化け起こしたページの原因を把握すればいいかと
元ページ自体が文字化けしてるかどうか目視することも一考

82:nobodyさん
08/08/24 04:03:35
>>80
decoded_contentが一番楽っぽい。
gzip/deflateにも対応してるみたいだし。

$r->is_success or die $r->status_line;
my $content = $r->decoded_content();
defined $content or ...;

utf8で出てくるから、あとは適当に変換で。

83:80
08/08/25 20:08:13
>>81
文字化けするページは一部文字化けしている場合が多いですね。
もともとそのページに問題があるのかも知れません。
>>82
そんな方法あったんですね、初めて知りました…。
近いうちに試してみようと思います。

返信ありがとうございました。

84:nobodyさん
08/08/27 11:11:12
Web上で動作するToDoリスト(URLリンク(img04.shop-pro.jp))を作りたいのですが、
自分で内容を追加していくといった物ではなくて、既存のHTMLにチェックボックスがあり、
そこにチェックを入れ、「保存する」ボタンを押したら、ログファイルにチェックされているか否かを保存し、
更新後にチェックされている状態が保存されている物を作りたいのですが、このような処理はどのようにしてやれば良いのでしょうか?
最終的には自分でToDoの内容も掲示板みたく追加出来るようにしたいです。

85:nobodyさん
08/08/27 12:03:04
Queryデータ受け取って条件分岐してデータ読み書きしてHTML表示すればいいんじゃないかな

86:nobodyさん
08/08/27 15:59:09
既存のHTMLってのがどの程度のものかわからないが、cgiにそれを出力させる必要がある。
外部のものなら、パーサーで解析してチェックボックスを割り込ませて出力、とかいうことになるんじゃないか。
この作業が一番めんどくさい。

87:nobodyさん
08/08/27 19:52:46
古い本読んでたら、cgi-lib.plとかいうのが
紹介されていたんだけど、これって現役?

88:nobodyさん
08/08/27 20:00:37
既に退役。

89:nobodyさん
08/08/27 20:35:39
まじで。じゃあどうすればいいのかな?

90:nobodyさん
08/08/27 20:45:09
別に使ってもいいんじゃね

91:nobodyさん
08/08/27 21:02:23
CGI.pmが最新ですか?

92:nobodyさん
08/08/27 21:25:25
CGI.pmが標準。いささか古いが。
お好みでCGI::MinimalでもCGI::Simpleでも。

93:nobodyさん
08/08/27 21:49:46
引数の取得は自前でするのが一番軽いから自前でというのは外道ですか?
車輪の再発明?

94:nobodyさん
08/08/27 22:34:42
やれるんなら自前だってなんだっていいさ。
トレーニングのための再発明にゃあ手頃な車輪だろ。
よそに迷惑かけないようにさえすりゃ誰も止めねえよ。

95:nobodyさん
08/08/28 10:53:23
クエリの分割は、RFCの決まりとブラウザの仕様で面倒なことになっているので、
CGIやCGI::Liteやフレームワークに丸投げした方がいい、と昔Perlスレで言われた

96:nobodyさん
08/08/28 16:12:26
CGI.pmと
CGI::Minimalと
CGI::Simpleとで、

どれを使えばいいの?

97:nobodyさん
08/08/28 16:28:55
とりあえずCGI.pm

98:nobodyさん
08/08/28 20:19:56
勉強を目的に作る分には何も言わないが、
実際のサービスの為に作りこむのはアンチパターンの"高慢"。

99:nobodyさん
08/08/28 22:31:17 oELFSwba
スレチだったのでもう一度こちらで質問させていただきます

PHPで言うところのupload_max_filesizeやpost_max_sizeは、
Perlではどこら辺を設定すればいいんですか?

100:nobodyさん
08/08/28 22:57:12
>>99
use CGI;
$CGI::POST_MAX = $limit_by_byte;

101:nobodyさん
08/08/28 23:59:40
htmlやhttp勉強していたころからずっと今までCGI.pm使ってないな。。。LWPは使い出したが。

CGI.pmが簡単、は例からわかるんだが、
汚れた変なデータ渡されても誤動作しないのかとか
デフォルト設定をちゃんと覚えないととかちょっとだけ不安。

102:nobodyさん
08/08/29 08:08:31
古いPerlだとメモリーは無限で限界は考えなくて良いってコードが多いからその辺も気を付けるとか

何時の話だ

103:nobodyさん
08/08/29 10:08:36
そういう面倒なのをやってくれちゃってるのがそいつなんじゃないの?

104:nobodyさん
08/08/29 15:26:13
XSS対策で、引数の記号を適度に変換してくれるモジュールを自己開発しました。

マルチパートのパースがむつかしい、、、というかめんどくさい。。
while(<STDIN>)
ってしたら、大きい添付ファイルきたらいちどメモリに確保する分つらいしな。。
readでちょっとずつ読むしかないのか、、

105:nobodyさん
08/08/29 15:27:54
ん? 質問内容がわからん

106:nobodyさん
08/08/29 15:45:42
質問じゃなくてチラシの裏に書こうとした文だろう。

107:nobodyさん
08/08/30 09:40:00
ソースのコメントにでも書いておけ

108:nobodyさん
08/08/31 18:20:50
>>101 (== >>99 ?)
Perl は汎用言語として開発されています。
そのためその言語仕様は CGI (をはじめとする Web プログラミング) など他の周辺仕様と直行しており、その点で PHP とは事情が異なります。

Web アプリケーション開発のために生まれたのが PHP で、
Web アプリケーション開発にも流用されているのが Perl であると言うこともできます。

Perl は CGI で利用できる言語として広く普及しました。
その過程で生まれたノウハウを抽出したものが CGI::* などのモジュール群です。

幸い CGI.pm は pure Perl ですから、この機会に目を通してみてはいかがでしょう。
その上で、あなたが必要とする品質に達していないと判断したなら、それは新しい車輪を作るに充分な理由だと思います。
イイモノができたら CPAN で公開してください。使わせてもらいます。

109:nobodyさん
08/09/02 08:28:05 guk/QrQq
Flashゲームを作成しています
今スコアについて作成しているのですが
どうにも反映されません、何が違うのでしょうか
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");

110:nobodyさん
08/09/02 08:30:11 guk/QrQq
そしてtest.cgiには
use 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も空欄ですが、動いているようです

111:nobodyさん
08/09/02 15:54:14 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を取得する方法はありませんでしょうか。

112:nobodyさん
08/09/02 17:08:26 62/De0KZ
以下の場合だと、$hogeにはIPアドレスが入ってます。
$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'};

後者が空になってしまうのは何故ですか?

113:nobodyさん
08/09/02 17:20:16
後者は以下と同じこと
($hoge=gethostbyaddr(pack('C4',split/\./,$ENV{'REMOTE_ADDR'}),2)) or$ENV{'REMOTE_ADDR'};

114:nobodyさん
08/09/02 17:30:48
>>111
confessじゃだめか

115:nobodyさん
08/09/02 17:37:04 62/De0KZ
>>113
そういうものなんですね。ありがとうございました。

116:nobodyさん
08/09/02 17:44:36
>>114
confessも読んでいくと

my $pkg = caller(++$i);
unless(defined($pkg)) {

みたいなことをしてループでネストの深さ調べてるから
インクリメントしていると言える。

見かけ上自分でインクリメントしなけりゃいいならこれで
いいんだろうけどな。

117:nobodyさん
08/09/02 17:52:27 IiWNBMxF
バイオインフォマティックスについて詳しい方いらっしゃいますか?


118:nobodyさん
08/09/02 17:55:37
>>114,116
ありがとうございます

> 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);
}

119:nobodyさん
08/09/02 17:58:31 IiWNBMxF
perlを使って突然変異前後における終止コドンのカウントをしたいんですが、初心者なのでまったく分かりません・・・(涙)

120:nobodyさん
08/09/02 18:34:27
>>114,116
抜粋ですが、下記でツリーというかパンくずリストというかそれっぽいものが出力できました。
ただ、ファイル名は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は無限ループっぽいのでご注意下さい

121:nobodyさん
08/09/02 18:54:50
……(呆れている)

122:nobodyさん
08/09/02 19:06:01
>>121
なんで…?

と思ってよくよく考えたら、confessそのまま使えばよかったのか…orz
すみませんなにか焦りのままにわけのわからない事をしてしまったようで…orz

123:nobodyさん
08/09/02 23:30:34
>>119
perlじゃなきゃダメなの?

124:nobodyさん
08/09/02 23:53:47
>>123
> perlじゃなきゃダメなの?

bioinformaticといえばperlってくらい。

125:nobodyさん
08/09/03 02:01:14
>>119
何の初心者かと言えばまず間違いなく Perl の初心者さんで、
バイオなんとかについては専門 (恐らく受講中) ということであれば、
# (この程度の情報はよこしてもよかろう、ケチんぼめ)

「バイオインフォマティクスのためのPerl入門」(ISBN4-87311-103-X)

を買え。

126:125
08/09/03 02:16:22
追伸:
これを機会にPerlをイチから少々嗜んでおこうと考えたなら
(または「バイオ(以下略)」のPerlに歯が立たなかったら)、
次の書籍から入るのが王道よん。

「初めてのPerl 第3版」(ISBN4-87311-126-9)

いずれにせよこの手の応用なら計算のためのモデル化が必須で、
モデル化するためには当該分野の知識が必要、と。
数式にまで落し込んで示せば誰かコード例を書いてくれるかもね。
しかしそこまでできれば自分で書けちゃうよなあ。w

127:nobodyさん
08/09/03 02:46:19
電算機言語を*嗜む*人向けのありがたいお話は
習い事板にでも書いて。

128:nobodyさん
08/09/03 02:49:05
Perlの入門書でいちばんいいのは
結城さんのだよ。

ほかのはむずかしすぎて(説明が下手すぎて)わかんないとおもう。

129:nobodyさん
08/09/03 02:57:19
配布cgiを改造して覚えた。
ここをこう直せばこう行ける、みたいな経験則で。

130:nobodyさん
08/09/03 05:15:42
経験則だけで行くと、習得に時間が掛かる上に変な癖がつく。
ラクダ本やPerldocなど読んで、基本をしっかりマスターすることが大切。
文法エラーが出なければ、なんでも良い訳じゃない事を知って欲しい。

特にファイルオープンのエラー処理を省く奴。

131:nobodyさん
08/09/03 09:02:15
>>128
お前の頭が悪すぎるだけ

132:nobodyさん
08/09/03 09:20:14
と変な癖が付いた人が言う

133:nobodyさん
08/09/03 09:29:36
Perl関係はドキュメント類が完備されているから、それでも質問に来るのは
頭の悪すぎる奴というのであってる。

134:nobodyさん
08/09/03 11:33:27
とドキュメントを残さない、不完全なドキュメントを残す人が言う
そして素人に最初から完璧な探し方を要求する

135:nobodyさん
08/09/03 11:37:02
ドキュメント読むひまがあったら人に聞くだろ、常考

136:nobodyさん
08/09/03 11:59:41
以前、人のプログラムを見ては「変な癖がついてる」「変な癖がついてる」と
連発する新人が来て、一週間で営業に飛ばしたのを思い出した。

137:nobodyさん
08/09/03 13:16:42
なあ、もしかして英語読めないやつっているんじゃね? ありえないかな?

138:nobodyさん
08/09/03 13:22:49
俺読めない。

139:nobodyさん
08/09/03 13:40:17
sub hoge ($$\@) {}
の($$\@)って何っていう名前だっけ?

140:nobodyさん
08/09/03 13:48:18
>>139
プロトタイプ

141:nobodyさん
08/09/03 14:20:13
使用目的だけを読んで使い方が判るんだ
凄いな


142:nobodyさん
08/09/03 22:23:50
>>139 の「何っていう名前だっけ?」という質問に対して
>>140 はほぼパーフェクトな回答。

そもそもが知りもしないことを、余計な格好をつけるから
そういう間の抜けたことになる。

143:nobodyさん
08/09/05 06:53:30 SLk/ayWJ
読み込んだHTMLファイル内に直接書かれてる「@{foo[8..15]}」のような文字列を
配列として扱えるように置換したいんですが、どう書けばいいですか?

144:nobodyさん
08/09/05 07:00:40
5.10動くレンタルサーバーの一覧はありますか?

145:nobodyさん
08/09/05 08:42:28
>>143
もっと違う方法を考えた方がいいと思う。

146:nobodyさん
08/09/05 11:12:25 SLk/ayWJ
>>145
大したCGIではないのでぶっちゃけどんな方法でもいいのですが、
後学のためにもこの方法でお願いしたいです。

147:nobodyさん
08/09/05 12:29:59 hg/3f6aE
use File::Copy;を使って
コピーする場合と、
OSのコピーコマンドを
使ってコピーする場合は
どっちが高速ですか?
また、常に上書きされるのでしょうか?

148:nobodyさん
08/09/05 12:36:06
>>147
最後に、

> 自分でマニュアルを読むのが面倒なので
> 代わりに読んで説明してください。

とつけとけ。


149:nobodyさん
08/09/05 12:59:01
>>148
おまえがマニュアルを読んで
日本語で説明しろ!
そして死ね!

150:nobodyさん
08/09/05 13:12:50 r9aXZuUN
use File::Copy;を使って
コピーする場合と、
OSのコピーコマンドを
使ってコピーする場合は
どっちが高速ですか?
また、常に上書きされるのでしょうか?
自分でマニュアルを読むのが面倒なので
代わりに読んで説明してください。

151:nobodyさん
08/09/05 13:24:36
ホラ、親切な>>149さん。やってあげなよ。


152:nobodyさん
08/09/05 13:37:01
OSの違いやその他の要因で違うからなんともいえないところだが、手元で50MBぐらいの
適当なファイルについて試したところでは

% time cp hoge.log hg
cp hoge.log hg 0.00s user 0.21s system 8% cpu 2.529 total

% time perl -MFile::Copy -e 'copy "hoge.log","hg2"'
perl -MFile::Copy -e 'copy "hoge.log","hg2"' 0.02s user 0.29s system 12% cpu 2.532 total

これだけみるとcpの方がはやいかな?

気になる人は何回も条件変えたりしてやってみると良いよ。

153:nobodyさん
08/09/05 13:37:22
>>151
お前まだ死んでなかったんだ。

154:nobodyさん
08/09/05 14:58:46
>>152
システムコピーを使った場合どうなります?

155:nobodyさん
08/09/05 15:15:12
質問する奴は>>1読んでからにしろ

156:nobodyさん
08/09/05 20:38:54
>>146 eval
>>147,154 計れ。

157:nobodyさん
08/09/05 20:43:49
>>146
方法を問わずなら、TT使っといて。
URLリンク(www.hakoniwa.net)


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch