Perlについての質問箱 18箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/09/18(日) 02:23:25"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html
● 2005/03/17現在の最新版: 5.8.7
● 2005/03/17現在の開発版: 5.9.2
リンク集は>>2-3
過去スレは>>4-5
0002デフォルトの名無しさん
2005/09/18(日) 02:25:15Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/
[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873110378/
[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.7/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://search.cpan.jp/
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
0003デフォルトの名無しさん
2005/09/18(日) 02:26:44CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://homepage3.nifty.com/hippo2000/
[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
Perlの小技: http://homepage3.nifty.com/hippo2000/perltips/index.htm
[Perl5.8Unicodeメモ]
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004デフォルトの名無しさん
2005/09/18(日) 02:29:011 http://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 http://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 http://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 http://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 http://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 http://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 http://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 http://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 http://pc5.2ch.net/test/read.cgi/tech/1079114157/
0005デフォルトの名無しさん
2005/09/18(日) 02:29:5911 http://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 http://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 http://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 http://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 http://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 http://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 http://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 http://pc8.2ch.net/test/read.cgi/tech/1121804136/
0006デフォルトの名無しさん
2005/09/18(日) 02:38:09$a=10;
$b=3;
$c=$a/$b;
これで答えを出すと少数が大量につくのだが、小数点以下の数字の数を指定するにはどうしたらいいんだ?
$c=3.33;
とか。intと何かを使う?
0007デフォルトの名無しさん
2005/09/18(日) 02:42:17スレタイ間違ってるけどな
>6
printf '%.2f', 10/3;
変数に入れるならsprintfで。
0008デフォルトの名無しさん
2005/09/18(日) 02:44:47乙。
次スレ20にすれば無問題。
0009デフォルトの名無しさん
2005/09/18(日) 03:09:00サンクス
00101
2005/09/18(日) 03:11:33数字消して18入れ直したらしい。
前スレのテンプレをメモ帳にコピーして編集してたから・・・
0011デフォルトの名無しさん
2005/09/18(日) 04:52:23使用すると「plugin error - [plugin名]: plugin not found」
が発生してしまいます。Commaプラグインを例にすると
初回プロセス作成時に[% USE Comma %]しているテンプレートを読み込んだ場合は
そのプロセスはその後もCommaプラグインをロードした状態を保持し続けるのですが
初回プロセス作成時に[% USE Comma %]を書いていないテンプレートを読み込んだ場合に
上記エラーが発生するようです。
エラー発生後、再度そのプロセスにアクセスするとCommaプラグインがロードされている状態になり
エラーは発生しなくなるのですが他のプラグインを読むと何故か前に読んだプラグインがアンロードされます。
どなたか同様の症状に遭遇された方はいませんでしょうか。
-環境-
fedora1
template-toolkit-2.14
httpd-2.0.51
mod_perl-1.99
perl-5.8.3
Apache::Reload使用
0012デフォルトの名無しさん
2005/09/18(日) 11:00:59何か良いページや本をご存知の方いますか?
どうやって使うんですか?と聞いて簡単に答えれるものでもないですよね?
0013デフォルトの名無しさん
2005/09/18(日) 11:07:47http://search.cpan.org/~sherzodr/CGI-Session-4.02/lib/CGI/Session.pm
001412
2005/09/18(日) 11:31:05たとえば、あるプログラムを作りそれをいろいろ使いまわす時に、サーバによってCGI::sessionが
無かったら困るのですが、どうなのでしょうか?
また、入っていなかった場合はcgiと一緒にCGI/sessionフォルダもアップをし、自分の領域からCGI::sessionを
読み込むとかは許されるのでしょうか?
>>13
ありがとうございます。がんばって読んでみます。英語苦手ですが…
0015デフォルトの名無しさん
2005/09/18(日) 13:23:24ttp://perldoc.jp/docs/modules/CGI-Session-3.11/
0016デフォルトの名無しさん
2005/09/18(日) 13:26:37キャッシュとか使ってたりする?
0017デフォルトの名無しさん
2005/09/18(日) 13:54:350018デフォルトの名無しさん
2005/09/18(日) 14:49:52古いけどな
00191
2005/09/18(日) 15:22:50/libディレクトリを作り、そこにCGI::sessionをインストール
利用するスクリプトで
use lib '/lib';
use CGI::session;
TOPに入れるのか。。。
djb並みだよなぁ♪
0021デフォルトの名無しさん
2005/09/18(日) 16:02:41CGI::Session - CGIアプリケーションにおける持続的なデータのセッション
http://perldoc.jp/docs/modules/CGI-Session-3.11/Session.pod
Tutorial - CGI::Sessionのさらに広範囲に渡って記述されたマニュアル
http://perldoc.jp/docs/modules/CGI-Session-3.11/Tutorial.pod
ご参考まで。
> また、入っていなかった場合はcgiと一緒にCGI/sessionフォルダもアップをし、
> 自分の領域からCGI::sessionを読み込むとかは許されるのでしょうか?
許すか許さないかは、そりゃ、プロバイダの考え方次第。でも、自作CGIの
使用を許しているプロバイダなら、禁止する理由はないと思うな。
やったことないから安請け合いはできないけど、たぶん自分のディレクトリに
置いても動くと思う。
002221
2005/09/18(日) 16:08:48002311
2005/09/19(月) 00:11:54TTのキャッシュでしょうか?もしそうでしたら使用しています。
デバッグの過程でキャッシュを使用しないで検証もしてみたのですが
同様の症状が発生しました。
ちなみにCommaとTruncateJpプラグインを使用して実験すると
CommaがロードされてるとTruncateJpがエラー
TruncateJpがロードされてるとCommaがエラー
という感じです。
発生状況がやや一定ではないので四苦八苦してます
0024デフォルトの名無しさん
2005/09/19(月) 01:28:48ううむ。再現できないとなんとも。
確実に解決する方法としてはstartup.plでTTのプラグインをロードするってのがあるんだけど。
そのほうが効率もいいし。それじゃ駄目?
002511
2005/09/19(月) 02:01:12それで問題ないのですが
mod_perl、perl/CGIどちらでも動くように組んでいるので
動的にロードしてくれる方が美しいかなと思いまして。
今日もハマってみて何か分かったら報告致します。
0026デフォルトの名無しさん
2005/09/19(月) 02:06:13あ、いや、
テンプレート内でUSEしておいて、
かつstartup.plに書いておけばいいっしょ。
002711
2005/09/19(月) 13:16:58今までスクリプト中でuse Template::Plugin::Comma;
ってして逃げてたので勝手に読み違えていましたorz
0028デフォルトの名無しさん
2005/09/20(火) 00:24:08SQLで取得したデータをHTMLでテーブルにして表示しているのですが、
よくフリーメールであるような各行にチェックボックスがあって、
それにチェックを入れたデータだけCSVに書き出すといったものを作りたいのですが、
ロジック的にはどういったものになるのでしょうか??チェックボックスでCGIに渡せるパラメータは
○○=on とかってなりますよね。どうやって、データを識別したらよいでしょうか???
0029デフォルトの名無しさん
2005/09/20(火) 00:50:13CGIの作り方なら、WebProg板かWeb制作板で聞いたほうがいいんじゃない?
Perlと無関係とは言わないけど、ブラウザからCGIのプログラムに送りつけられたものを
どう受け取るかというのは、CGI全般の基礎知識だしPerl以外に知っておくべきことが
先にありそうな気がする。
0030デフォルトの名無しさん
2005/09/20(火) 11:56:37マルチ
0031デフォルトの名無しさん
2005/09/20(火) 12:01:19書き込み時刻から想像するけど、>>28は、ここで言われて、WebProg板に
移動したんじゃないの? いちおう初心者スレなんで、あんまりカリカリ
しないでのんびりやりましょうや。
0032デフォルトの名無しさん
2005/09/20(火) 15:59:18perlでHTMLをテキストにパースする場合
HTML::FormatTextあたりって使わないのでしょうか?
手製でタグ削除より
1.lynxでダンプさせる
2.またはperlのテキストフォーマッタとして
HTML::FormatTextあたりが出ていました
自分も似た感じになってるのですが
ttp://homepage3.nifty.com/h_sasaki/contents/ap6xx.html
それともテキストフォーマッタ相当の機能として統合されたのかな?
PPMのアーカイブ自体
ビルド800〜にはHTML::Format〜がみあたらない
...ので600〜から落として試したら
PPMでインストールできません。
ローカルのパッケージからインストールするには
なにか特別な設定がいるのでしょうか?
ActivePerl v5.8.6 built 811ですがreadmeどうり
cdでppm install html-format.ppd
するとsearchでネットワークを探しにいき
ないといいます。800〜のパッケージにはないのですが
ローカルから入れられないのでしょうか?
lynxでダンプさせていますがperlのテキストフォーマッタ
を使えないかなと思ったのですが
パッケージがはいらないので代わりに試せないorz...
0033デフォルトの名無しさん
2005/09/20(火) 16:47:360034ヽ(´ー`)ノ ◆.ogCuANUcE
2005/09/20(火) 17:13:26HTML::FormatText に
> Formatting of HTML tables and forms is not implemented.
とあるが、それでもいいならイイんじゃね。
> 手製でタグ削除より
単純にタグを削除したいだけなら、HTML::Strip とかはどうよ。
0035デフォルトの名無しさん
2005/09/20(火) 17:38:23・Sample
my $res="";
select( $res ); #できないけど、こんなイメージ
print "↑\n";
print "攻撃力2000\n";
select(STDOUT);
print "(^_^) " x 3 ,"\n";
print $res;
−出力結果−
(^_^) (^_^) (^_^)
↑
攻撃力2000
0036デフォルトの名無しさん
2005/09/20(火) 17:47:47少なくとも、その構文では変数に入れる意味が全くない。
0037デフォルトの名無しさん
2005/09/20(火) 18:37:16少し高度になるけど、
パイプを使えばできるよ。
でも、特に理由がないなら sprintf か、
push あたりでいいのでは。
push の例:
my @res;
push @res, "↑\n";
push @res, "攻撃力2000\n";
print "(^_^) " x 3 ,"\n";
print @res;
−出力結果−
(^_^) (^_^) (^_^)
↑
攻撃力2000
0038デフォルトの名無しさん
2005/09/20(火) 19:10:39回答有り難う御座います。
Sampleが良くなかったですね。 目的は、同じ構文で出力先を
アクティブに変更したいと考えています。 sampleをもうちょいマジメに(汗)書き直すと、
-Sample-
my $res="";
if( $mode=0 ){ #標準出力
select(STDOUT);
}elsif( $mode=1 ){ # File出力
open(FILE,">> access.log");
select(FILE);
}elsif( $mode=2 ){ # 変数出力
select( $res ); #できないけど、こんなイメージ
}
&logline;
select(STDOUT); # 出力先を元に戻す
if( $mode=1 ){ close(FILE); # File出力
}elsif( $mode=2 ){ $res をゴニョゴニョ文字列処理して転用 }
exit;
sub logline{
print "xx年xx月xx日 xx時xx分アクセス";
}
0040デフォルトの名無しさん
2005/09/20(火) 19:26:300041デフォルトの名無しさん
2005/09/20(火) 19:27:39C言語なら素直にその方法取りますが、Perlは結構いろいろ
できるみたいなので、こんなのもできるかなー と思いまして。
原始的な命令を繰り返すCに馴れてると、selectでprintの振る舞いが
変わるってのも結構な驚きで、perlって高級言語だなぁ と実感。
0042デフォルトの名無しさん
2005/09/20(火) 19:35:31> >>37 さんの様に、全部配列に入れて好きに出力でもいいと思ってて、
> C言語なら素直にその方法取りますが、Perlは結構いろいろ
> できるみたいなので、こんなのもできるかなー と思いまして。
技に溺れると、あとで後悔するよ。
0043デフォルトの名無しさん
2005/09/20(火) 20:22:19class hito{
public:
void atama(){ ・・・}
}
void hanasu(hito taro){
・・・
}
main(){
hito sakaki;
hanasu(sakaki);
}
このように関数間でインスタンスを渡すことができますが、perlではどのように
すればよいのでしょうか?
$test=hito->new();
hanasu($test);
これでは失敗しました…。
004412
2005/09/20(火) 20:35:46CGI/Session.pmファイルも一緒にアップをして、
use CGI::session
で読み込んでくれました。
なんか、サーバ側で普通はインストール(?)をしなくてはい気がするのですが、できてしまいました。何でですかねf(^^;
とにかく、いろいろとありがとうございました。
0045デフォルトの名無しさん
2005/09/20(火) 22:12:27ストリームと同じ振る舞いをする文字列オブジェクトって
大抵の言語にあるじゃん。
>>35の難点といえば暗黙のグローバルな状態に依存してて
コードの局所性が低いことくらい。
0046デフォルトの名無しさん
2005/09/20(火) 22:15:02普通にできます。
失敗するコードを出さないとそのくらいしか言えない。
0048デフォルトの名無しさん
2005/09/21(水) 18:22:44例えば(1,2,3,4,5,6)というリストがあったら、
1+2-3+4-5+6という感じに凍結したいのですが。
0049デフォルトの名無しさん
2005/09/21(水) 18:38:040050デフォルトの名無しさん
2005/09/21(水) 18:47:56print join("-", map { shift(@foo)."+".shift(@foo) } (0..$#foo/2));
巨大配列だと遅い。奇数の時場合分けする必要がある。
もっと簡単にできそうだけど思いつかん。
$Out_Strings = join '', map { sprintf qq|%s%s|, $_ == 0 ? '' : $foo[$_] % 2 ? '+' : '-' , $foo[$_] } (0 .. $#foo);
print $Out_Strings;
長ったらしい、、、
0052デフォルトの名無しさん
2005/09/21(水) 19:13:23use strict;
sub njoin($\@) {
my($delims, $list) = @_;
my $r;
my $i = 0;
foreach (@$list) {
$r .= $_ . $delims->[$i];
$i = ($i + 1) % @$delims;
}
chop $r;
return $r;
}
my @l = (1, 2, 3, 4, 5, 6);
print njoin(['+', '-'], @l), "\n";
0053デフォルトの名無しさん
2005/09/21(水) 19:49:07@foo = (1..60);
$bar = join '~', @foo;
$bar =~ s/~([^~]*)~/+$1-/g;
$bar =~ s/~/+/;
print $bar;
0054ヽ(´ー`)ノ ◆.ogCuANUcE
2005/09/21(水) 20:07:58sub ejoin(&@)
{
my ($sep, $s, @n) = @_;
$s .= $sep->() . $_ foreach (@n);
return $s || '';
}
my $i = 0;
print ejoin(sub { print $i, "\n"; (++$i % 2) ? '+' : '-' }, 1 .. 6);
0055デフォルトの名無しさん
2005/09/21(水) 20:17:48my $str;
my @sign = qw( + - );
$str .= $_ . $sign[ $_ % @sign ] foreach @foo;
print $str;
は?可読性と拡張性で勝負。
0057デフォルトの名無しさん
2005/09/21(水) 20:25:02と書こうとしたらかぶってる上にchop入らねー
005855
2005/09/21(水) 20:37:00とりあえず無駄多すぎ
my @foo = (1..60);
print shift @foo;
print map { sprintf "%s%d", $_ % 2 ? '+' : '-' , $_ } @foo;
005955
2005/09/21(水) 20:40:16ラス行もこれでいいと思われ。
2個の引数にsprintfは贅沢。
0060デフォルトの名無しさん
2005/09/21(水) 20:41:43my @foo = (1..60);
($_ = join "+",@foo) =~ s/(\d)\+(\d+)\+/$1+$2-/g;
print $_;
0061デフォルトの名無しさん
2005/09/21(水) 20:44:19($_ = join "+",@foo) =~ s/\+(\d+)\+/+$1-/g;
print $_;
006255
2005/09/21(水) 21:07:04>>53を読んでその程度に縮めることは出来るとは思ったが、
join後にg置換って、場合によっては重くならないか?
#俺達TIMTOWDIの真っ最中:-)
0063デフォルトの名無しさん
2005/09/21(水) 21:19:06いいのかね?
0064デフォルトの名無しさん
2005/09/21(水) 21:20:200065デフォルトの名無しさん
2005/09/21(水) 21:27:37配列がデカくなると巨大文字列がメモリをバカ喰いして遅くなるかもね。
0066デフォルトの名無しさん
2005/09/21(水) 21:30:47置換使った奴とか、その要素自体が偶数か奇数かで+-を
切り替えてる奴は使えなくなるよな。
たとえば @foo = qw(1 a -5 +5 xyz) みたいな。
0067デフォルトの名無しさん
2005/09/21(水) 21:31:31そういうときはベンチですよ
0068デフォルトの名無しさん
2005/09/21(水) 21:45:01TMTOWTDI ですよ。
@hoge = (1 .. 60);
$flag = !$flag and $_ .= '+' or $_ .= '-' for @hoge;
print substr(join('', @hoge), 0, -1);
006968
2005/09/21(水) 21:47:00$_ .= $flag = !$flag ? '+' : '-' for @hoge;
007068
2005/09/21(水) 21:47:550071デフォルトの名無しさん
2005/09/21(水) 22:09:29@foo = (1..60);
@sep = qw[+ -];
$bar = join '$sep[$count++%@sep]', @foo;
eval qq[print "$bar"];
0072デフォルトの名無しさん
2005/09/21(水) 22:33:36chop $str;
これでよくないか
0073デフォルトの名無しさん
2005/09/21(水) 22:53:060074デフォルトの名無しさん
2005/09/21(水) 23:34:000075デフォルトの名無しさん
2005/09/22(木) 00:06:16配列でかくて、セパレータ長ければ分かるけど。
1..60で、reallocは10回も無いのでは。
0076デフォルトの名無しさん
2005/09/22(木) 00:44:19以下の感じでソケットでwebページ情報とってきてるんですけど、
もし、取得に失敗してタイムアウトした際に
もう一度とってくるのってどうやって書けばいいのでしょうか?
どうぞお願いしまする
$client_socket = new IO::Socket::INET (
PeerAddr => $host,
PeerPort => 'http',
Proto => 'tcp',
TimeOut => '1'
);
unless ($client_socket){
print "Socket Error:$!\n";
}
0077デフォルトの名無しさん
2005/09/22(木) 01:19:230078デフォルトの名無しさん
2005/09/22(木) 01:21:05do {
...
} while ($@ =~ m/Timeout/i);
0079デフォルトの名無しさん
2005/09/22(木) 04:47:32Perlってプログラム中にそのまんま漢字とか平仮名とか入れて平気でつか?
多分無理だと思うんでつけど、そういう場合ってどうすればいいでつか?
0080デフォルトの名無しさん
2005/09/22(木) 04:52:01平気でつ
0081デフォルトの名無しさん
2005/09/22(木) 05:06:31ありがとうございまつ
0082デフォルトの名無しさん
2005/09/22(木) 05:43:290083デフォルトの名無しさん
2005/09/22(木) 13:57:48としてデータ構造を作成した場合に
$listが指している要素数を知るにはどうしたらいいんでしょうか
0084デフォルトの名無しさん
2005/09/22(木) 14:06:39じゃだめ?
0086デフォルトの名無しさん
2005/09/22(木) 23:05:59$#$list + 1
0087デフォルトの名無しさん
2005/09/22(木) 23:15:580088デフォルトの名無しさん
2005/09/22(木) 23:25:40これ使って何か面白いことできないかなぁ。前々から思ってるんだけど。
package Foo;
sub new { bless, {}, Foo; }
sub foo { print "foo\n"; }
pacakge Bar;
sub bar { print "bar\n"; }
package main;
my $obj = new Foo(); # Fooインスタンス作成
$obj->foo(); # --> "foo" と表示
bless $obj, Bar; # Barにクラスチェンジ
$obj->bar(); # --> "bar" と表示
$obj->foo(); # --> エラー : Can't locate object method "foo"...
0089デフォルトの名無しさん
2005/09/22(木) 23:49:27Smalltalkをインストールして
become: の senders を検索しる。
0090デフォルトの名無しさん
2005/09/23(金) 00:55:55おもしろいこと=newとdeleteの整合性がとれなくなってアボン
0091デフォルトの名無しさん
2005/09/23(金) 14:54:55Net::FTPでできるの?
教えてください。
0092デフォルトの名無しさん
2005/09/23(金) 20:29:23お願いします
やりたいこと
・アップロードされた画像ファイルを縮小保存したい
条件とか
・画像は汚くてもかまいません
・jpg限定でかまいません
・鯖管じゃないのでimagemagicとかGDとかはナシで
0093デフォルトの名無しさん
2005/09/23(金) 20:50:110094デフォルトの名無しさん
2005/09/23(金) 21:40:040096デフォルトの名無しさん
2005/09/24(土) 01:56:04>>1
0097デフォルトの名無しさん
2005/09/24(土) 03:14:320098デフォルトの名無しさん
2005/09/24(土) 07:50:42スレ違い。
0099デフォルトの名無しさん
2005/09/24(土) 10:47:01$in_file = "./smple_data.txt";
open( IN_FILE, "$in_file" );
$record = <IN_FILE>;
print $record;
close( IN_FILE );
exit;
このプログラムの3行目がファイルから1行目を読み込んで
$$recordに格納し、オープンしたファイルから1レコードを読み込む。
とされているのですが、何故1レコード目だけが読み込まれるのか理解できません。
データが3レコードあり、2レコード目を出力する事は出来ないのでしょうか?
全くの初心者なのでやさしく教えてください。
0100デフォルトの名無しさん
2005/09/24(土) 11:14:57http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#Context
0101デフォルトの名無しさん
2005/09/24(土) 11:30:47現在80ページ付近を勉強してるのですが、先に進めない訳じゃないんです。
学習が進めばこの項目は出てくると思うのですが、現状でその考え方を知っておきたいんです。
■ このスレッドは過去ログ倉庫に格納されています