【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を見よう。
0039ノバ
02/03/28 15:03ID:B1izX7ckどうすればいいのでしょうか??
フォルダに格納されている画像が6つの時は
★★★
★★★
画像が8つの時は
★★★★
★★★★
このように表示したいです。
0042ノバ
02/03/28 15:16ID:B1izX7ck★はサムネイルじゃなくて、生画像です。
0043nobodyさん
02/03/28 15:38ID:???glob('path/to/images/*.*')とか
`ls path/to/images` とか。
0044nobodyさん
02/03/28 17:09ID:???2段にしたいんだよね
だったらファイル数2で割って、そこで改行すれば良い
って俺は3ヶ月ぶりに触ってるからアホ丸出しなんだけど (笑
0045nobodyさん
02/03/28 17:14ID:???sub openDir()
{
#ディレクトリを開けてファイルを数えて2で割って$linefeedをフラグにする
&dispImage($dir,$file,$linefeed);
# $dirディレクトリのパス
# $ファイル名
# 改行表示用のフラグ
}
こんな感じで行けると思う (遅いかな
dispImageを頑張って書いてちょ
0046nobodyさん
02/03/28 17:16ID:???$dir ディレクトリのパス
$file ファイル名
$linefeed 改行表示用のフラグ
#名無しさん@お腹いっぱい じゃ無くなってる!
0047nobodyさん
02/03/28 18:00ID:???という意味のif文を教えてください。
0050nobodyさん
02/03/28 19:01ID:ZEbZLPiw>2
私は在日韓国人ですが、日本生命側が怒る気持ちも理解できます。
私も西村氏の掲示板運営に抗議するため、敢えてここで西村氏を誹謗中傷し、
「文句があれば訴状を送って来い」
と、連絡先をメールで伝えましたが、訴状は届きませんで、代わりに
イタズラ電話が毎日かかってくるようになりました。
本当に陰湿で卑劣な男です。
21 名前:名無しさん@お腹いっぱい。 投稿日:2001/04/27(金) 22:01
ひろゆきの彼女へ
今回の件、知ってるだろ?
悪い事はいわない。
ひろゆきとは別れたほうがいいぞ。
こんなイタ電しかできない男と一緒にいてどうする。
イタ電でパクられるなんてのは、大抵は女だぞ。
ひろゆきの脳は女性ホルモンが支配している。
女と女がくっついてたってしょうがないだろ?
24 名前:名無しさん@お腹いっぱい。 投稿日:2001/04/27(金) 22:26
いたずら電話とはひろゆきらしいな
ひろゆきの陰険さはメルマガ読んでればわかるし、驚きもしないが
それよりも自分への中傷だけには異常に反応するところが愉快だな
0051nobodyさん
02/03/28 21:23ID:???チョン公ウゼえよ
0052nobodyさん
02/03/28 23:17ID:Pnsb/wgVいちいちファイルを作っていたら大変なので困ってます
0053nobodyさん
02/03/28 23:23ID:???sub printx
{
my($data) = @_;
push(@buffer,$data);
print $data;
}
005552
02/03/28 23:30ID:???うにゅ? STDOUTに出力される奴を変数に送りたいんです
my $stdout;
tie *STDOUT, 'IO::Scalar', \$stdout;
こんな感じです。ActivePerl だと IO::Scalar がなくて…
005652
02/03/28 23:37ID:???ActivePerlの標準インストールベースで動かないといけないので
困ってます
再帰処理で標準出力に吐いているデータを加工するためにバッファ
に貯め込みたいんですが、再帰部分に手を入れたくないんですよ
0057nobodyさん
02/03/28 23:43ID:7pPJ3EHV@b = (5, 4, 3, 2, 1);
@c = reverse @b;
if ( @a == @c ) {
print "equal\n";
} else {
print "not equal\n";
}
if ( @a == (reverse @b)) {
print "equal\n";
} else {
print "not equal\n";
}
の実行結果が
equal
not equal
になるのはなぜですか?
0059nobodyさん
02/03/29 00:01ID:???0060nobodyさん
02/03/29 00:03ID:???1 ppmでインストールさせる。
1.5 IO::Scalarは一緒に配る。
2 perltie見ながらFILEHANDLEにtie出来るクラス作る。
3 再帰部分に手を入れる。
0061nobodyさん
02/03/29 00:14ID:???006252
02/03/29 00:17ID:???うーん、やっぱそうですか
相手が素人さんなのでインストールさせられないんです
中見てみます(ショボーン
・・・作るか
0063nobodyさん
02/03/29 00:41ID:???実際に評価されているのはスカラーだよ.
my @a = (1, 2, 3, 4, 5);
my @b = (5, 4, 3, 2, 1);
my @c = reverse @b;
my $a = @a;
my $b = @b;
my $c1 = @c;
my $c2 = reverse @b;
print join "\n", $a, $b, $c1, $c2;
006457
02/03/29 01:22ID:???ああ、そうなんですか。
じゃあ、
@a == reverse @b
の部分でリストコンテキストでreverse @bを評価するってのは
できないということですか?
無理やりスカラーにするintってのがあるかと思いますが
その逆とか・・。
0065始めて約一ヶ月
02/03/29 01:44ID:XyE2iK+m<input type=text name=$i size=10 value=$value$i>
}
この「value」の所の書き方がわかんないです。
教えてくんさい。
0066nobodyさん
02/03/29 01:47ID:???equal
not equal
にはならねぇだよ?
0067nobodyさん
02/03/29 02:10ID:???print "<input type=text name=$i size=10 value=$value$i>";
}
こういう意味か?
006852
02/03/29 02:16ID:???うう、ヘタレじゃぁ
0069始めて約一ヶ月
02/03/29 02:27ID:XyE2iK+mごめんなさい書き方が悪かったっす、
$value = tsukue;
for($i=1;$i<=$5;$i++){
print "<input type=text name=$i size=10 value=$value$i>";}
のなかで「$value$i」を使った時に「$value$i」が「tsukue1」と認識されないで
「tsukue」と「1」に認識されちゃうんです。
なにか良い書き方はありますか?
0071nobodyさん
02/03/29 03:38ID:???できないと思う.そもそも==でリストコンテキストはあり得ないんじゃないかと.
とりあえずperlfaq4にも書いてあるけど,配列の比較は面倒な方法を取らないとだめだよ.
あと,無理やりスカラーにするのはscalar.intは整数化.
my @a = qw(1 2 3 4 5);
my @b = qw(5 4 3 2 1);
sub arycmp (\@@) {
my ($a, @b) = @_;
@$a == @b or return;
my $n = @b;
$a->[$n] eq $b[$n] or return while $n--;
return 1;
}
print (arycmp(@a, reverse @b) ? "equal\n" : "not equal\n");
0072始めて約一ヶ月
02/03/29 04:20ID:XyE2iK+mごめんなさいさらに書き方が悪かったっす、
$value1 = いちばん;
$value2 = にばん;
$value3 = さんばん;
$value4 = よんばん;
$value5 = ごばん;
print "<form action=XXX.cgi>";
for($i=1;$i<=$5;$i++){
print "項目$i<input type=text name=$i size=10 value=$value$i>";}
print "<input type=submit value=更新>";
のなかの「$value$i」を「$value1」〜「$value5」と認識させて、
フォームの「項目1〜5」のテキストスペースにそれぞれ
「いちばん、にばん、さんばん、よんばん、ごばん」と表示させたいのです。
すいません説明の仕方が下手で。
よろしくお願いします。
0073自動ツッコミプログラムV0.01
02/03/29 04:29ID:???配列使えば?
0074M
02/03/29 06:31ID:xslHK9Siようにするには,ファイル名を何にすればよいのでしょうか。
0076nobodyさん
02/03/29 07:53ID:???2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
0077nobodyさん
02/03/29 09:37ID:???$value2 = にばん;
$value3 = さんばん;
$value4 = よんばん;
$value5 = ごばん;
print "<form action=XXX.cgi>";
for($i=1;$i<=$5;$i++){
cgiに書かれている言語なんていうのですか?教えてください
0078nobodyさん
02/03/29 09:38ID:???0079nobodyさん
02/03/29 09:46ID:???0080nobodyさん
02/03/29 09:50ID:???${"value$i"}
これでいいか?
わかったら帰って宿題やれ。
>73の言うように配列使った方が利口だと思うけどな。
0081nobodyさん
02/03/29 10:29ID:???本読む、初心者向けのサイト見るなどして、レベルアップしてから来い。
ここは一から手取り足取り教えてくれる無料教室じゃないって事だ。
0083nobodyさん
02/03/29 10:42ID:???$value1 = いちばん;
↑ これは ↓ こうしてみる。
$value1 = 'いちばん';
for($i=1;$i<=$5;$i++){
↑ これは ↓ こうしてみる。
for($i=1;$i<=5;$i++){
print "項目$i<input type=text name=$i size=10 value=$value$i>";
↑ これは ↓ こうしてみる。
print qq|項目$i<input type="text" name="$i" size="10" value="|, ${'value'.$i}, '">';
たぶんね。
0084nobodyさん
02/03/29 13:51ID:GD6wTrbPどうすんだ?
Cの
/* */
みたいのないの?
0085nobodyさん
02/03/29 13:58ID:???全ての行に#を付けて書く。
0086nobodyさん
02/03/29 13:58ID:???こんなのもある。
=foo
いっぺんに複数行コメントするとき
どうすんだ?
Cの
/* */
みたいのないの?
=cut
=英字
から
=cut
まで
0087nobodyさん
02/03/29 13:59ID:???要するに、ない。
どうしてもと言うのなら、使わない変数にヒアドキュメント代入する手もあるけど、メモリの無駄だな。
008885=87
02/03/29 14:00ID:???知らなかった。
スマソ。
008986
02/03/29 14:04ID:???いや、でもこれは厳密にはコメントじゃないから。
#をつかうとコンパイル時に完全に無視するけど
=は違う、みたいな話があったようななかったような…
0090nobodyさん
02/03/29 14:13ID:GD6wTrbP0091nobodyさん
02/03/29 16:22ID:???これを
foreach( %aaa )
{
print "$_" ;
}
みたいなかんじで、次々に引っ張ってきたいんですけど、
可能ですか?、出来れば簡単な例など教えて下さい。
0092nobodyさん
02/03/29 16:39ID:???foreach my $q (keys %{ $aaa->{$p} }){
print "\$aaa->{$p}->{$q} = " . $aaa->{$p}->{$q} ."\n";
}
}
これでいい?
0094nobodyさん
02/03/29 18:22ID:???0095nobodyさん
02/03/30 12:03ID:1Ui3rht3全て0にするには、
$var = 0 ;
@array = (
[ $var , $var , $var ] ,
[ $var , $var , $var ]
) ;
は分かるのですが、列数と行数を与えて初期化
するのはどのようにしたらいいのでしょうか?
$retsu = 5 ;
$gyou = 3 ;
$var = 0 ;
・・・ここから行き詰まってます。
ヒントでもお教え下さいませ。
0096nobodyさん
02/03/30 13:19ID:???$retsu = 5;
$gyou = 3;
$var = 0;
foreach $row (0 .. $gyou - 1) {
foreach $col (0 .. $retsu - 1) {
$array[$row][$col] = $var;
}
}
0にするだけなら@array = ();でもいい気がするけど。
0097nobodyさん
02/04/01 04:59ID:???アンカタグでリンクにするのってどうすれば良いですか?
0098nobodyさん
02/04/01 06:49ID:???画像を表示する部分のタグ変更。
0099sato
02/04/01 12:58ID:???送信ボタンを押した時に、あるサブルーチンへ飛ばしたい場合は
<form action=>の部分にどのように記述すればいいんでしょうか?
0100nobodyさん
02/04/01 13:07ID:???条件があるなら条件を指定して呼び出せば良い。
0101初心者
02/04/01 13:07ID:???>>99
<input type="hidden" name="mode" value="submit">
あとは、$modeとかに値を入れてsubmitなら
フォーム送信された場合のサブルーチンへ飛ばす。
とか。。
でいいんですよね?
0102初心者
02/04/01 13:08ID:???0103100!
02/04/01 13:10ID:???0105nobodyさん
02/04/01 13:26ID:???みんな頑張ってsatoの難題に挑戦してくれ!
0107nobodyさん
02/04/01 13:36ID:???0108nobodyさん
02/04/01 13:45ID:2cwLH4730109sato
02/04/01 13:48ID:???それをボタンが押された時に行いたいんです
すなわちtest.cgiの中に
[追加] [削除]
ボタンがこのようにあるとして、
[追加]を押した時には、サブルーチン sub plus へ。
[削除]を押した時には サブルーチン sub delete へ。
この時<form action=test.cgi method=post>をCGI内に埋め込むと
複数ボタンと複数サブルーチンをどのように処理するのか・・
0110nobodyさん
02/04/01 13:55ID:???条件分岐はわかるね。CGI内では条件分岐して処理を場合わけする。
htmlのボタンごとにcgiの処理を分岐するには呼び出す時点で条件を指定する。
具体的には環境変数というのを使って引数を持たせる。>>101の方法。
mode=plusという引数を持ってたら追加モードへ..ってやる。
あとは「環境変数」で検索してくれ。
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 "〜〜〜";
でも同じになるのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています