【Perl】初心者コーナー Part18
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/20 22:04ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0238nobodyさん
02/12/06 01:38ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0239nobodyさん
02/12/06 01:40ID:???余計なの読まないから良いんでない?
サブルーチンをインポートする必要がなければ、だけど。
あとは大差無いかと。
0240nobodyさん
02/12/06 07:37ID:???0241nobodyさん
02/12/06 11:46ID:yzLDpzsK@values = split(/■/, $aiueo);
$i = 0;
foreach $value (@values){
if($value eq ""){
@values[$i] = "NULL";
}
print "$i : @values[$i]\n";
$i++;
}
これを実行すると、
0 : 1
1 : 2
2 : NULL
3 : NULL
4 : 3
5 : 4
こう表示されます。
しかし、最後の5以降はsplitでは無視されてしまうようです。
自分としては
0 : 1
1 : 2
2 : NULL
3 : NULL
4 : 3
5 : 4
6 : NULL
7 : NULL
8 : NULL
としたいのですが可能でしょうか。
0242nobodyさん
02/12/06 12:01ID:???ものすごく安易な解ですがsplitする前に
$aiueo .= "EOL";
とかで後ろに文字をくっつけておいて、
splitした後にpopしてやると逃れることは
できます。
$aiueo = "1■2■■■3■4■5■■■";
$aiueo .= "EOL"
@values = split(/■/, $aiueo);
pop @valures;
$i = 0;
という感じです。
0244nobodyさん
02/12/06 12:20ID:q7PjCrztサーバに保存するファイル名に投稿された時間を反映させるには(img200212061220.jpgのように)、
どのような記述が必要ですか?
0245nobodyさん
02/12/06 13:24ID:???スクリプトを見ないとわからん
こんな感じで作った文字列をファイル名につけてやりゃいいんじゃないの
@date = reverse((localtime)[1..5]);
$date[0] += 1900; $date[1]++;
$now = sprintf "%4d%02d%02d%02d%02d", @date;
0246nobodyさん
02/12/06 13:27ID:???マルチは市ね
0247244
02/12/06 13:44ID:y8w9Rsa1ありがとうございました。やってみます。
0248bloom
02/12/06 13:47ID:7xw6gZYBhttp://www.agemasukudasai.com/bloom/
0249242
02/12/06 15:19ID:0nNWvuklあのコードじゃ
$aiueo = "1■2■■■3■4■5■■■6";
とかのときに最後の値を捨ててしまいますんで、
後ろにくっつけるのは区切り記号込みにしないと
だめですね。
$aiueo .= "■EOL"
@values = split(/■/, $aiueo);
pop @valures;
で、うまくいくはず。
0251nobodyさん
02/12/06 15:41ID:???@values = map($_||'NULL', $aiueo=~/(.*?)■/g);
0252nobodyさん
02/12/06 17:08ID:zqw+GwyUある文字(\x{100}以上かもしれない)が大文字か小文字か判定したいのですが、たとえば
「任意のアルファベット大文字1文字に一致するメタ表現」などはないんでしょうか。
それとも、UnicodeData.txtをいちいち読まなければならないんでしょうか。
0253nobodyさん
02/12/06 17:50ID:???改行数の多い書き込みは
「省略されました。全部読むには(略」 という感じで省略表示したいのですが
任意の改行数までを取得するにはどうすればいいでしょうか。
よろしくお願いします。
0254nobodyさん
02/12/06 18:04ID:???改行でsplitとか・・・、色々あるでしょ。
何故思いつかん?
0256nobodyさん
02/12/06 18:35ID:???0258256
02/12/06 18:40ID:???0259nobodyさん
02/12/06 18:43ID:???1だろ。
0260nobodyさん
02/12/06 18:44ID:???スマートかどうか知らんが、sortじゃだめなんですか?
sub numerically { $a <=> $b; }
@sorted = sort numerically LIST;
これで、最小値が@sortedの先頭に来ます。
0263nobodyさん
02/12/06 19:26ID:???my $a_ref = $_[ 0 ];
my $min = $a_ref->[ 0 ];
foreach (@{ $a_ref }){
$min > $_ and ($min, $_) = ($_ , $min);
}
return $min;
}
my @b= (20, 19, 100, 75, 6);
print min @b;
0264263
02/12/06 19:39ID:Wd1BEmDy@bの内容変わってる。
0265nobodyさん
02/12/06 22:56ID:???my($minimum) = sort { $a <=> $b } @list ;
print("$minimum\n");
これじゃダメ?
0267nobodyさん
02/12/07 00:15ID:???0268nobodyさん
02/12/07 00:19ID:ePZJKayyどうすればいいんでしょう?
10個あったら$hoge[9]まで、とか。
0270nobodyさん
02/12/07 00:49ID:???10要素の配列で$hoge[9]までなら全部じゃん(w
foreach (0..$#hoge-1){
print $hoge[$_];
}
とか。
0271nobodyさん
02/12/07 01:08ID:yEekv6g9http://www36.tok2.com/home/bttl/bttl-pc/
0272yani ◆saNSktNEdQ
02/12/07 01:19ID:KB9hByzAforeach (@list) {
$least ||= $_;
$_ < $least and $least = $_;
}
ベタな気がする。エレガントな解法求む。
0273yani ◆saNSktNEdQ
02/12/07 01:30ID:KB9hByzAmy $least;
foreach (@list) {
defined($least) or ($least = $_, next);
$_ < $least and $least = $_;
}
0274yani ◆saNSktNEdQ
02/12/07 02:26ID:6Rt0AxGbしかしイマイチ美しさを感じないのは気のせいか。
my($least) = @list;
foreach (@list) {
$_ < $least and $least = $_;
}
0275nobodyさん
02/12/07 03:44ID:???0276268
02/12/07 04:11ID:ePZJKayyあ、確かに全部っすね・・・(w スマソ
こういう方法があるんですねぇ。おかげさまでうまくいきました。
ありがとうございます。
0277nobodyさん
02/12/07 06:27ID:???forを使ってないだけで中で回ってるのは一緒だけどな。
0278nobodyさん
02/12/07 06:39ID:???grep { $min > $_ && ( $min = $_ ) } @list;
こんな具合かな。テストしてないけど。
0279nobodyさん
02/12/07 06:44ID:???駄目だ寝よう。
0280yani ◆saNSktNEdQ
02/12/07 09:40ID:6bq1sAwRそうそうgrepがあった。
手元の5.8.0の標準モヂュールで面白いものを見つけた。
use 5.8.0; ###
use List::Util qw(min);
...
$least = min(@list);
0281yani ◆saNSktNEdQ
02/12/07 11:42ID:6bq1sAwRないんだが、「面白い」(ことができるかもしれない)と言ったのは List::Util::reduce のことだ。
0282nobodyさん
02/12/07 11:46ID:???0283nobodyさん
02/12/07 16:22ID:???0284nobodyさん
02/12/07 16:24ID:/TptzaIRエラー表示させる場合「&error("文字列");」を使う例を良く見るのだが、
この場合「sub error{}」は用意しなくて良いのだろうか?
所持する本には書かれていなくて……。
ちなみに漏れは「die」関数を使ってます。
0285nobodyさん
02/12/07 16:58ID:???0286nobodyさん
02/12/07 18:32ID:???0287nobodyさん
02/12/07 20:46ID:???自分でつくるんでねぇ?
>>286
構造化プログラミングとかの本を見ると、GOTO分はプログラムの流れがワープしちまって
全体を把握するのが困難になるからいくないらしい
昭和57年頃の本だけど(藁
0288nobodyさん
02/12/07 21:03ID:???わかっていたら混乱することもないんじゃない?
0289nobodyさん
02/12/07 21:06ID:???自分で好きなの作ろうぜ。>sub error { }
きちんとエラーメッセージ吐いてその時の環境変数やら標準入力の内容やらも表示すれば、
デバッグに便利。
0290nobodyさん
02/12/07 21:54ID:HolpJHokSOCKET
WGET
LWP
WGETはサーバに入っていないので。。
LWPよりSOCKETの方が早いと思うんですが。
0292nobodyさん
02/12/07 22:31ID:HolpJHok実際私はこれで毎月30000円稼いでいます、
しかも毎月1000万円が当たるチャンスなどあります。
お小遣い稼ぎに是非!!!
http://www.fruitmail.net/cgi/introduce_jump2.cgi?901913
0293nobodyさん
02/12/07 22:58ID:???Socketの方がなんぼか早いだろうなあ。
でも、それぐらいだったらLwp使って安全かつシンプルに持ってくる方が俺はいいな。
SocketだったらRFCとかきちんと目を通さないと、正しいものは作れないだろ?
0294nobodyさん
02/12/08 10:58ID:H7RlugSZ0295nobodyさん
02/12/08 11:38ID:???「サブルーチン名は、全部小文字の方がいい」だろ?
モジュール名は(プラグマ以外は)大文字で始めろともあるだろう。
それと合わせたんじゃないか? 区別がすぐにつくように。
ま、作法の話だから、あんまり深く考えるな。
従ってれば、いつかきっと自分の中で決着がつく。
0296nobodyさん
02/12/08 11:43ID:???print "ふーん。。。\n";
}
0297nobodyさん
02/12/08 12:07ID:H7RlugSZなるほど、ソースの読みやすさのためなんですね。
モジュールは使ったことがないので今まで気にならなかったんだと思います。
0298nobodyさん
02/12/08 13:10ID:???Perlで、累計・今日・昨日のアクセス数をカウントするカウンターCGI(IMG or JSタグでCGI起動)
を設置しようと思ってるんですが、カウントの方法で少し悩んでます。
count.cgi?total でカウント処理(累計+1, 今日+1)
count.cgi?today で今日のカウントをロードするだけ
count.cgi?yesterday で昨日のカウントをロードするだけ
上の順でCGIが呼ばれると正常にカウントされるんですが、
昨日、今日、累計の順に呼ばれると、当然昨日と今日のデータはカウントされる前のものになっちゃいます。
今日と昨日のCGI が呼ばれたら、sleep(1)をして、累計のカウントがおわるまで待つ
というのも考えたんですが、あまりいい方法じゃないなーなんておもいますた。
また、カウントだけをする count.cgi?count みたいなタグを入れて、
そのタグを一番上に置いて、累計・今日・昨日のタグがきたらカウントデータを読むだけ
ってしても、やっぱり設置場所によってはデータがずれたりしてきちゃいます。
おい、おまえら!もしいい方法がありましたら教えて下さい。
0299nobodyさん
02/12/08 13:37ID:???count.cgi?todayで今日のカウントを+1して今日のカウントを出力
count.cgi?yesterdayで昨日のカウントを出力
で良いべさ。
0301nobodyさん
02/12/08 16:23ID:GWJer8wb&jcode::convert(\$hoge{'hoge'},'euc');
てやってもだめなので一回普通に変数に代入して変換して元に戻して
いるんですが・・・。
0303nobodyさん
02/12/08 23:59ID:???flockの使い方教えてくらはい。とりあえずはflockがサーバで使えるみたいなので。
そんなやつが掲示板など作るな!とかいわれそうですがお願いいたします。
参考になるサイトだけでも結構なんでお願い。
半日ググってたら、何が何やら分からなくなってしまいました。
0304nobodyさん
02/12/09 00:07ID:???ttp://www.google.com/search?num=100&hl=ja&ie=UTF-8&oe=UTF-8&as_qdr=all&q=perl+flock+%E4%BE%8B&lr=lang_ja
検索サイトの使い方のコツを覚えた方がいいんじゃないか?
0305nobodyさん
02/12/09 00:21ID:???今まで「perl cgi flock 掲示板」やら「flock 掲示板」やら、
しらみつぶしにサイトを見まくっていたら頭が変になっていました。
「例」で検索するのをすっかり忘れていました。
本当に感謝です。>304
0306nobodyさん
02/12/09 20:40ID:30vqgT1r%ex = (
hoge => "hage",
xxxx => "$ex{hoge}",
);
みたいにしたいのですが、
Global symbol "%ex" requires explicit package name at ファイル名 line 13.
みたいにエラーが出ます。
どうすればいいですか?
よろしくお願いします。
0307nobodyさん
02/12/09 21:00ID:???0308nobodyさん
02/12/09 21:01ID:???0309nobodyさん
02/12/09 21:13ID:???0310nobodyさん
02/12/09 21:14ID:???0311nobodyさん
02/12/09 21:34ID:30vqgT1ruse strict;をコメントアウトしたら、エラーは出なくなりましたが、
$ex{xxx} に $ex{hoge} の値が代入されていませんでした。
実際には、my %ex; です。写し間違えでした。
0312nobodyさん
02/12/09 21:38ID:???0313nobodyさん
02/12/09 21:59ID:???(
hoge => "hage",
xxxx => "$ex{hoge}",
)
が評価される時点で$ex{hoge}に何も入っていないなら当然。
0315nobodyさん
02/12/09 23:42ID:???0316nobodyさん
02/12/09 23:46ID:???0317nobodyさん
02/12/10 00:21ID:???checkboxや、radioのcheckedは、引き継げないんですか?
0318317
02/12/10 00:29ID:???0319nobodyさん
02/12/10 11:20ID:???たとえば、
$count;
$hoge;
foreach $count (1 .. 10){
$hoge$count = "文字:$";
}
こんな感じでつまり、
$hoge1 = "文字:1";
$hoge2 = "文字:2";
〜
$hoge10 = "文字:10";
こういう事はできるのかなという事です。
これだとやはり$hoge$countの書き方がまずいようでエラーになります。
0320nobodyさん
02/12/10 11:27ID:???0321nobodyさん
02/12/10 11:59ID:???推奨:$hoge[$count] # ただし$countが数字の場合のみ
推奨:$hoge{"$count"} # $countが文字列の場合
非推奨:${"hoge$count"}
0323nobodyさん
02/12/10 13:14ID:???0324nobodyさん
02/12/10 13:22ID:???○ 推奨:$hoge[$count] # ただし$countが自然数の場合のみ
負の数とか小数を使われたらたまらんから訂正。
0325nobodyさん
02/12/10 13:26ID:???0326nobodyさん
02/12/10 13:31ID:???0327nobodyさん
02/12/10 14:02ID:+QGYbS02抽出するにはどうすればいいのでしょうか?
例えば『あいうえお』,『Aいうえお』などの場合です。
substrを使うと『Aいうえお』がおかしくなってしまいます
0328nobodyさん
02/12/10 14:10ID:???ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Split
0329nobodyさん
02/12/10 14:16ID:???Thanks
0330nobodyさん
02/12/10 15:27ID:???すいません、よく考えたらただの配列じゃダメなんです。
$hogeと$iを合体して、
「$hoge1」という変数自体を作りたいんです。
よって、「$hoge1」という変数に文字とかを代入したりしたんです。
0331nobodyさん
02/12/10 15:46ID:???書き込み処理の所なんですが、
open(OUT, "+<$dat");
flock(OUT, 2);
@sasa = <OUT>;
truncate(OUT,0);
seek(OUT, 0, 0);
print OUT "書き込み\n";
print OUT @sasa;
close(OUT);
と
open(OUT, "+<$dat");
flock(OUT, 2);
@sasa = <OUT>;
seek(OUT, 0, 0);
print OUT "書き込み\n";
print OUT @sasa;
truncate(OUT, tell(OUT));
close(OUT);
ではどちらがいいんでしょうか?
ただtruncateの使い方がちょっと違うだけなんですが・・・。
それ以前に文法的に間違っていたらご指摘お願いします。
0334nobodyさん
02/12/10 16:11ID:???>332さんごめんなさい。
0335nobodyさん
02/12/10 16:17ID:???せめて、配列じゃなくって$hoge1という変数が欲しい
理由を書いてもらえませんか? もしかするとその原因
自体変更することで、全体としてすっきりするっていう
可能性もありますから。
0336nobodyさん
02/12/10 19:01ID:4NsDPNiK作ろうとしてるのは、パスワードを作るだけのスクリプトと、そのパス
を使って管理する掲示板なんだけど・・・文法チェッカかけたら
「Missing right curly or square bracket at hoge.cgi line 65, at end of line
syntax error at hoge.cgi line 65, at EOF
hoge.cgi had compilation errors.
」
ってなってしまった。。。
■ このスレッドは過去ログ倉庫に格納されています