【Perl】初心者コーナーPart11
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/03/27 12:53ID:wAXxxOxPいらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけどなんか質問ある Pert 5.01 】
http://pc.2ch.net/test/read.cgi/php/1015127347/l50
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
過去ログ、その他の役立ち情報は>>2-10を見よう。
0111nobodyさん
02/04/01 13:55ID:???<input type=hidden name=mode value=plus>
<input type=submit value="追加">
</form>
<form action=test.cgi method=post>
<input type=hidden name=mode value=delete>
<input type=submit value="削除">
</form>
0112108
02/04/01 15:19ID:wV1XGpKY他のサイトのデータを読むにはどうすれば良いんでしょうか?
i-modeでソースを見たいんですけど。。。
0113108
02/04/01 15:38ID:???勉強しなおしてきまふ。
0114nobodyさん
02/04/01 16:46ID:???perlってマインスイーパーとかペイントみたいな
アプリケーションって作れるの?
どうなの?おせーて★
0117nobodyさん
02/04/01 17:05ID:???Perlだから○○はつくれない、ってことはないぞ。
得手不得手はあるにしても。
頑張ればマインスイーパーでもなんでも作れるさ。
0119nobodyさん
02/04/01 17:48ID:???Javaなんて大がかりなもの持ち出すまでもない。
http://turedure.s8.xrea.com/yourmine/index.html
0120nobodyさん
02/04/02 05:14ID:???スマートに処理をするには、どうすればいいのでしょうか?
一応以下のを考えましたが、m// って遅いしメモリ食うんですよね?
local $_ = '';
while (!eof(STDIN)) { $_ .= STDIN }
&func($_);
sub func {
local $_ = shift;
while (m/^(.*?\n)(.*)$/) {
$_ = $2;
print $1; # ここら辺にしたい処理を入れる予定
}
return 1;
}
他には local @_ = split(/\n/, $_); なども考えましたが、
一瞬だけメモリが二倍要りますし・・・。
あ、サブルーチンには @_ では無く $_ で渡したいのです。
0122nobodyさん
02/04/02 07:35ID:???ファイル全部読み込んでメモリも何も無いと思う。
敢えてやるならwhileとm//gかなあ。
$/ = '';
func(<STDIN>);
sub func {
local $_ = shift;
print $1 while /(.*\n)/g;
# ↑処理
}
まあ、ネタなんだろうけど。
0123nobodyさん
02/04/02 10:03ID:???ネタかな?とも思ったが、一応「初心者スレ」なんで...
どうして変数$_ にファイル内容をすべていれた後に改まって1行ずつ処理をするのかわかりませんが、
結局、メモリをくわないようにファイル処理したいのならば以下のように正攻法でいくのがベターかと。
open(READ, 'filepath');
while (<READ>){
やりたい処理 if /pattern/;
}
あと、「m// って遅いしメモリ食うんですよね?」とありますが、そんなことはありません。
特に先頭マッチ(m/^pattern/)や後方マッチ(m/pattern$/)は高速だし、1バイト文字に
マッチさせたいのならindex関数を使うほうが高速です。これは結局、処理内容に応じて
最適の処理を模索していくしかないと思いますが、それでもより高速化をもとめるのならば
C的な言語にシフトせざるを得ません。
0124nobodyさん
02/04/02 13:32ID:YZpqqRq/何回かに一回openに失敗してしまうなんて事はあるのですか?
0125nobodyさん
02/04/02 13:38ID:vQkiGH9yopenとcloseの数は合ってますか?
0126124
02/04/02 13:52ID:PEBO6o/oすいません。open失敗したわけではないのですが
そういう場合てあるのかな〜?と思ったので。
0128124
02/04/02 14:08ID:PEBO6o/o>ファイルハンドルに使われるメモリが足りなくなったときとか。
こういう場合があるんですね。なるほど。
けど、こんなサーバ使ってられん!てレベルの話ですよね?
レスありがとございます。
0129nobodyさん
02/04/02 14:09ID:aIwf9lEFソース中に、
my $ref = {
'a' => 1,
'b' => 2
};
こんな感じで初期できますけど、これを、
ファイルにして、そのファイルから
open ( FILE , "<ファイル" ) ;
my $ref = <FILE> ;
close ( FILE ) ;
こんな感じで取り込みたいんです。
(このソースじゃ駄目でしたけど・・・)
どなたか、ご存知でしたら、ご教授ください。
0130nobodyさん
02/04/02 14:11ID:???require "ファイル";
じゃダメなのか?
0131129
02/04/02 14:24ID:aIwf9lEFなるほど!
盲点でした。
ありがとう御座います。
0132129
02/04/02 14:27ID:aIwf9lEF無名リストのに名前を付けれたと、記憶しているのですが、
その記述方法を忘れてしまいました。
$VAR1 = {
'x' => 1,
'y' => 2
};
dumperの結果ですが、変数が$VAR1になってしまうのですが、
これを変えたいのです。
以上よろしくお願いいたします。
0133nobodyさん
02/04/02 15:26ID:YZpqqRq/print <<"EOF";
〜〜大量〜〜
EOF
で出力すると〜〜大量〜〜の分をまとめてメモリに格納しちゃうんですか?
それとも一行づつ処理して
print "〜〜〜";
print "〜〜〜";
print "〜〜〜";
と同じになるのですか?
0135☆
02/04/02 16:15ID:???テキストに書き出したいんですが、
バナー複数ある場合テキストの中に
$banner, $bannertitle, $url, $hyoujikaisu, $clickkaisu
という風に書き出したいです。
バナー表示回数とクリック回数を
どのように記述すればいいか是非教えて下さい。
0138☆
02/04/02 16:39ID:???表示回数カウントの方法と、
クリック回数カウントの方法です。
0139nobodyさん
02/04/02 17:40ID:BrKRPiRdレスありがとうです。
出力をバッファリングしなくなるのでprint文の
実行と同時に出力してくれるようになる。というやつですね。
これでいちいちメモリに格納しないで直接?出力する。イコール
print <<"EOF";
〜〜大量〜〜
EOF
でも
print "〜〜〜";
print "〜〜〜";
でも同じになるのでしょうか?
0140nobodyさん
02/04/02 18:24ID:???{
my $class = shift ;
my ( $filename ) = @_ ;
print "##### $ARGV[ 0 ]\n" ;
my $self = {} ;
bless $self ;
}
クラスのメソッドから、グローバル?の変数参照すんのどうすんの?
0141nobodyさん
02/04/02 18:25ID:???効率よく入出力するためのバッファリングなので、あまり気にしすぎない方がいいよ。
手元にある環境で試したけど、標準出力に対し、cygwin版Perlは行バッファリングされていたけど、
ActivePerlはバッファリングされていなかった。
いずれにせよ、STDOUTに対しては完全バッファリングはしてないんちゃうかな?
よくわかんらんけど。
0142nobodyさん
02/04/02 18:36ID:???main::でアクセスすれば? 行儀悪いと言われるだろうがね。
0144nobodyさん
02/04/02 18:57ID:???0146129
02/04/02 19:24ID:aIwf9lEF記述例など、頂けると助かります。
よろしくお願いします。
0148129
02/04/02 19:37ID:aIwf9lEFでは、Dumperで、無名リストを表示する場合、
名前を付ける方法ご存知の型は、居られませんでしょうか、
よろしくお願いします。
>>147
レスありがとう御座います。
ただ、申し訳ありませんが、今後、私の発言に干渉なさらないよう、
お願い申し上げます。
0150nobodyさん
02/04/02 19:51ID:???氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね
氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね
0151147
02/04/02 20:44ID:???的外れで意味不明な質問をしておきながらそのデカい態度。
見上げたもんだな。
その厨っぷりに感心したから教えてやろう。
Data::Dumper->new([ ref-list ], [ name-list ]);
e.g.
print Data::Dumper->Dump([ \%HASH ], [ 'HASH' ]);
print Data::Dumper->Dump([ \%HASH ], [ '*HASH' ]);
0152129
02/04/02 21:19ID:aIwf9lEF>>151
レスありがとう御座います。
ただ、申し訳ありませんが、今後、私の発言に干渉なさらないよう、
お願い申し上げます。
引き続き、ご存知の方宜しくお願いします。
0153nobodyさん
02/04/02 21:56ID:???$Data::Dumper::Varname="manco";
print Dumper($manco) ;
これじゃだめ?
ttp://www.xav.com/perl/lib/Data/Dumper.html
このあたり参考になるかも
0154139
02/04/02 21:58ID:wv3Og9zkご丁寧にどうもありがとです。
けど、なんか混乱状態に陥ってます。。。
>>139の両者ともサーバへの負担はかわらずという事ですかね?
0155nobodyさん
02/04/02 22:20ID:???0156120
02/04/02 22:36ID:???ソース公開したりして無くて・・・というか、ずっと以前に
公開してた事ありましたが、直ぐに中止してよかった (笑
>>121
m// や s/// 等が続いて switch 分作る時に良くやります。
が、玄人さんは使いたがらないらしいですね。
私は初心者ですのであまり理由がわかりませんが。
>>122-123
自分はまだ「どうにかプログラムを書ける」位のレベルですので、
やっと関数・処理の切り分け、流用・設計を考慮し出したトコなのです。
main ではデータの流れだけを担当し、細かい処理は各関数に
任せた結果が例の処理でした。
で、各関数には @ で渡さず $ で統一したかった、という感じ。
やっぱり >>123 のようなのがやり方が一般的ですよね。
そうすると、便利な関数にはなるのですが、酷いと main 一個だけの
プログラムにもなりかねないので・・・もっと精進します。
有難う御座いました。
0157129
02/04/02 23:35ID:???レスありがとう御座います。助かりました。
URLも参考になりました。
とりあえず、このような形で解決できました。
ありがとうございました。
$aa->{ 'aa' } = 'aa' ;
$Data::Dumper::Terse = 1 ;
print '$aaa = ' . Dumper( $aa ) ;
結果:
$aaa = {
aa => "aa"
}
0158nobodyさん
02/04/03 00:09ID:???$manco='manco';
こんなふうにして、staitc?な変数置きたいんだけど、
駄目?
0161158
02/04/03 00:56ID:???package manco ;
my $manco='manco';
だったぁ〜
0162nobodyさん
02/04/03 01:03ID:???package system;
$system::logfile = 'bbs.log';
package main;
my $filename = $system::logfile;
こういう事じゃなくて?
0163nobodyさん
02/04/03 01:23ID:???わざわざそんなことしてなんになるのか?
ただのアホだな! アホのくせに書き込むんじゃねーよ!
0164nobodyさん
02/04/03 02:53ID:Hn4nUBfcそういうのって可能ですか?
例えば、htmlの場合
<html>
<!--#exec cgi="cgi-bin/accesskaiseki/accesskaiseki.cgi"-->
</html>
みたいに記述すればOKですが、同じ文章を
CGIファイルの中に付け足しても無理ですよね。
アホな質問かもしれませんがわかる方いたら教えてください。
0165nobodyさん
02/04/03 02:59ID:???>やっと関数・処理の切り分け、流用・設計を考慮し出したトコなのです。
>main ではデータの流れだけを担当し、細かい処理は各関数に
>任せた結果が例の処理でした。
>で、各関数には @ で渡さず $ で統一したかった、という感じ。
なるほど、意図が判った。
そういうときは、私はファイル名、もしくはファイルハンドルを関数に渡します。
0168nobody
02/04/03 04:15ID:???具体的に何のCGIに入れるのか分からないが、
掲示板みたいのなら上の方の設定部分に
$honyarara='<!--#exec cgi="cgi-bin/accesskaiseki/accesskaiseki.cgi"-->\n';
とやっておいてhtml表示部分に
print "$honyarara";
を足す。多分だけどな。
うまく行ったら私の幸せでも祈ってください。
0170168
02/04/03 04:41ID:???しかも間違えてたよ。
$honyarara='<!--#exec cgi="cgi-bin/accesskaiseki/accesskaiseki.cgi"-->';
print "$honyarara\n";
だよ。(鬱
逝ってきます。
164は166の方法が難しいときはSSIでなくCGIのアクセス解析にしてimgタグを上記方法で埋め込んで下さい。
0171nobodyさん
02/04/03 11:21ID:???こんな感じで、ファイルハンドルをハッシュの中にいれて使おうと思ったんだけど、
うまくいかんかったのだけど、どして?
0172nobodyさん
02/04/03 11:28ID:???そういう奴は、すっこんでろよ。
ここは、【Perl】初心者コーナーだ。
質問する訳でもなく、答える気も無い奴は、
しゃべるなってこった。わかったか?
0173nobodyさん
02/04/03 11:41ID:???初心者に質問の仕方を教えてますがなにか?
まずは質問の仕方を覚えるのが大事。
質問の仕方がわかるようになれば、問題の解決法を調べる方法もわかるようになってくる。
そうすれば他人に聞かずとも自分で調べる事もできるようになるしな。
回答を教えるだけが親切ではない。
0174nobodyさん
02/04/03 12:00ID:???漏れが、いいたいのはさ、
「そんな事もしらねぇ〜書き込むんじゃねぇ〜よ」
みたいな事いってるのよ、
あんたの、その上から人を見るような、口調は、正直気に入らないが、
教えて欲しい人には、利益になるから、いんじゃねか
0175nobodyさん
02/04/03 12:58ID:???129みたいなのに常駐されると特に厄介だし。
「2:それでこんな風にやってみたが・・・ 」を書いてあると、
間違いを指摘するのが容易で答えやすいのではないでしょうか。
なんの努力もなしに、教えてくれと助けを求める人の中には、
初心者というより、ただ単に頭が悪い人という場合があるので、
適当にあしらってしまうのも理解できます。
FAQのような事はgoogleや適当なWebサイトに誘導するのはアリだと思うし、
調べ方を教えるのが、質問者に対してもっとも利益になると思います。
過度の煽りには賛同しかねますが、
Perlに関する初心者向けの本で解決することを質問されていてはきりがないので、
適度に追い返して欲しいというのが本音です。
と172の煽りに乗ってしまう俺がいる。
ほとんどの方は、努力する姿勢をみせている質問者には、
煽らずに答えてあげていると思います。一部の方は・・・(省略)
172さんのような口調の方がおられると余計に荒れてしまうので、
自身も多少の自粛をお願いします。(気持ちは理解してますけど。)
0176春虫
02/04/03 13:18ID:???foreach $i (@args) {
($name, $val) = split(/=/, $i);
#$val =~ tr/+/ /;
#$val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack('C', hex($1))/eg;
#$cgi{$name} = $val;
if ( $name eq 'data1' ){
$data1 = $val;
} elsif ( $name eq 'data2' ){
$data2 = $val;
}
}
これだとフォームが増えるとif〜のがズラズラ増えちゃうよね?
なんかスマ〜トにやるにはどー書いたらいいでしょか?w
0180179
02/04/03 13:27ID:???0181nobodyさん
02/04/03 13:48ID:???とりあえず、
print $file{ 'fh' } $str ;
を
$fh = $file{ 'fh' } ;
print $fh $str ;
って対処してはいるんだけど、
なんかスマートじゃないなーって思って質問したんやけど、
これで、あってるのかしら?
0182nobodyさん
02/04/03 13:59ID:???use warnings ;
皆さん使ってます?
0183
02/04/03 15:35ID:7cQZbwjHフォームで取得した情報を、テーブル内に表示しようとすると
並び順がめちゃくちゃになってこまっています。これを順番に表示するにはどうしたら
よいでしょうか?
名前 → 本文
メールアドレス → 名前
本文 → メールアドレス
#フォームデータの復元
foreach $pair (split(/&/, $query)) {
($key, $value) = split(/=/, $pair);
# 文字のデコード
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
$FORM{$key} = $value;
0184nobodyさん
02/04/03 16:05ID:???>>1から引用
> 1:自分はこう言う事がしたい。
> 2:それでこんな風にやってみたが・・・
> 3:それだとこんなエラーが出て上手く行かなかった。
肝心の「何がしたいか」を書かないでまともな返事を期待するなよ。
アンタのやりたいことは多分これだと思うが。
-- begin code --
print { $file{fh} } $str
-- end code --
0185nobodyさん
02/04/03 16:06ID:???Hashってのはそういう仕様なんだよ。
順番に表示したきゃsort keys %hashやTie::IxHash、DB_FileのDB_BTREEでも使えや。
0186183
02/04/03 16:18ID:7cQZbwjHどうも有難うございました。そういう仕様なのですね。納得です。
勉強してまた、出直してきます。
0187nobodyさん
02/04/03 16:29ID:???sortを使ってハッシュの中身を整列してから表示するという手もある。
0188183
02/04/03 16:38ID:???ところで、hash は順番めちゃくちゃに表示っていうのは
毎回ランダムに順番が代わるのでしょうか?それとも何か規則性あるんですか?
0190nobodyさん
02/04/03 16:54ID:???順番は変化します。
基本的には恐らくハッシュ値の順とかだろうけど、同じハッシュ値の場合は
格納した順によって変化するはずなので、同じ順番に並ぶことを
期待しない方がいいと思う。
以上適当な解答なので、どうしても気になるならPerlのソースコードでも
見て確かめてください。
ハッシュについてはC言語のアルゴリズムの本をみればよく分かると思う。
0191nobodyさん
02/04/03 17:09ID:???モジュールで整列できる物がある。
・・・以前JAPUさんに教えてもらったのにログが見つからない。(涙
0193nobodyさん
02/04/03 18:34ID:???<input type=hidden〜〜〜>
で渡す。
0194nobodyさん
02/04/03 18:39ID:???〜〜.cgi?comment=sage
ってするか、フォームボタン作って
<input type="hidden" name="comment" value="sage">
ってする。もしくはjavascript使って併用することもできる。
あとはクッキー使う方法もある。削除パスワードとか。
0195192
02/04/03 18:44ID:???<input type="hidden" 〜
で解決しました。皆様方に感謝です。
0196nobodyさん
02/04/03 21:56ID:???なんですけど
package test ;
sub new {改行多すぎて省略}
sub a
{
my ( $self ) = shift ;
my ( $str ) = @_ ;
print "$self->{test} ### $str\n" ;
}
sub b
{
my ( $self ) = shift ;
my ( $str ) = @_ ;
# a( $str ) ;
a( $self , $str ) ;
#ここの引数の数と
}
package main ;
my $test = new test() ;
$test->a( "call a" ) ;
#ここの引数の数
$test->b( "call b" ) ;
exit ;
メインから呼ぶとき、
$test->a( "call a" ) ;
だけど、メソッドbから、呼ぶときは、
a( $self , "call a" ) ;
と、なっちゃったんだけど、できれば引数の数が変わるのは、避けたいいんだけど、
これは、言語仕様すか?
それとも、記述の仕方間違ってます?
0198nobodyさん
02/04/03 22:16ID:???$self→a("call a");
ってやりなされ。
0200nobodyさん
02/04/04 01:44ID:???漏れは、
$FORM{$key} = $value;
push(@FORM_ORDER,$key);
てな感じでキーの順序を覚えておいて、
foreach(@FORM_ORDER) {...}
で回すだす。
0201nobodyさん
02/04/04 10:04ID:???0202春虫
02/04/04 15:04ID:???print TMP "$no<>$data1<>$data2<>$date\n";
open(DATA,"$file") || &error("$fileが変!");
while (<DATA>) {
print TMP $_;
記事に$noを振りたいんだけど$noを1づつ増やして
いきたいのですが・・・どうも上手くいきません。
Perlの先輩方々よいアドバイスをください・・・
感じとしては$fileの1行目を読み込んで
$noに+1をする感じでいいのでしょうか。。。
0203nobodyさん
02/04/04 15:16ID:???もう少しわかりやすく。
何をやりたいかよくわからない。
0204202
02/04/04 15:22ID:???書き込みにNoをつけたいんです;−;
1番目記事,2番目の記事って感じに。
0206nobodyさん
02/04/04 15:25ID:???ログにナンバーを振るのでなく、表示の際にナンバーを振っていく方がいいと思うが
それじゃダメなのかな?
0207202
02/04/04 15:35ID:???0208誰かもっとスマートな方法教えて
02/04/04 16:00ID:???open(TMP, ">$tmp") || &error("$tmpが変!");
$tmp = <DATA>;
$tmp =~ /^(\d+)<>/;
print TMP ($1+1) . "<>$data1<>$data2<>$date\n$tmp";
while (<DATA>) {
print TMP $_;
0209nobodyさん
02/04/04 16:00ID:???http://www.nn.iij4u.or.jp/~nabe/osietekunn.html
君はなかなかの教えてクンだ。
だが今一歩足りないな。
もっと無意味な情報をこれ見よがしに提示し、
自分の考えを捻じ曲げて喚き散らし、
狂ったように答えを催促すれば誰しも認める第一級教えてクンになれるゾ!
■ このスレッドは過去ログ倉庫に格納されています