Perl コーディング初心者質問コーナー Part30
1 :
nobodyさん :
03/11/26 20:29 ID:AOnvIohs いらっしゃーい、Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
2 :
nobodyさん :03/11/26 20:29 ID:AOnvIohs
$ENV{'HTTP_USER_AGENT'}からOSとブラウザ名をはじき出すライブラリ のようなものはどこかにありませんか?PerlでもPHPでもかまいません。
10 :
8 :03/11/26 21:38 ID:???
まさにこれを探していた!
11 :
8 :03/11/26 21:43 ID:???
ついでにお聞きしたいのですがこのサブルーチンの引数で$remote_hostは意味あるのでしょうか?
13 :
8 :03/11/26 22:18 ID:???
いや、
>>9 のサブルーチンで
sub User_Agent {
my($user_agent, $remote_host) = @_;
となっておりますが、$remote_hostは特に何の役目も果たしてないようですが。
果たしておりませんな。
15 :
8 :03/11/26 22:40 ID:???
NetscapeNavigator5とか出てきちゃうし、SafariとかFirebirdとかの最近の ブラウザにも対応してないのね。
16 :
8 :03/11/26 22:41 ID:???
あとロボットとかも。
そんなのは自分で保守していくしかないだろ
18 :
8 :03/11/26 23:06 ID:???
了解しますた。
まあ、誰かは保守してる人間いるんだろうな。 それを公開してる人がいないか探して回るのもいいかもしれない。 見つからなかったら、自分でそういうサイトを立ち上げてみよう。 そうすれば君が神だ。 神は冗談にしても、そういうサイトを開いて掲示板とか置いておけば 色んな情報が集まってくれたりする。 そうすると保守が楽になったりもする。 情報のギブアンドテイク。 一つの理想系だ。
20 :
997 :03/11/27 00:39 ID:???
ごめん、巣でボケてた・・・
21 :
nobodyさん :03/11/27 18:16 ID:mfagzuaL
qq("W"クヲーテーチョン); みたいに @arry = (は,い,れ,ち,ゅ); でクヲーテイションを省略できますか?
qw(は い れ ち ゅ);
それぐらいやってみろよ
25 :
21 :03/11/27 18:59 ID:???
なるへそ。 サンクスでつ。
26 :
nobodyさん :03/11/28 01:50 ID:JTGzFPsT
読んだファイルの複数行を置換するにはどうすれば良いんでしょうか。 my $foo = <<'EOM'; ******* ***** ********* EOM open(FILE, "+>$file"); my @filedata = <FILE>; @filedata =~ s/$foo//go; とかやったのですが全く置換されませんでした……。
=~の左側はスカラー値じゃないとダメなわけだが。
>>27 置換文字列に改行が含まれてるから、一工夫必要。
あとそのopenの仕方だと読み込み時にファイルが空になってしまう。
とりあえず一例。
{
local $/; # 入力セパレータを無しにする(デフォルトは\n)
open(FILE, "$file"); # 読み込みモードでファイルオープン
my $filedata = <FILE>; # ファイル全体が変数$filedataに入る
$filedata =~ s/$foo//g; # 置換
close FILE;
}
これで多分できると思う。一行目はlocalじゃなきゃだめ
>>29 あー、$/って言う手があったか
今までこんなことしてたよ
open(FILE, "$file");
@filedata = <FILE>;
$filedata = join('',@filedata);
$filedata =~ s/$foo//g;
close FILE;
>>27 s/$foo//go for @filedata;
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
38 :
nobodyさん :03/11/28 14:30 ID:IcoS5W50
perlマンセー
>28 初めて知りました…。 >29-30 読み込みモードは書き込んだ後に気付きました。 最初 my $filedata = <FILE>; とやって駄目だったのですが$/を調べてみて納得。 無事出来ましたヽ(´ー`)ノサンクス
あぼーん
アフォにレスすんなヴォケ
43 :
nobodyさん :03/11/28 23:14 ID:izcmLwd7
テンプレート式掲示板を作っています。 テンプレートHTML内の<!-- start_log -->から<!-- end_log -->までの範囲を抜き出す方法が分かりません。 start から end までは数行あります。 どなたかご教授ください。
>43 >27以降が参考になる。
@log=grep((/<!-- start_log -->/ .. /<!-- end_log -->/ and $_), <IN>);
>>44 ,43
有難うございました。これから頑張ってみます。
# プログラミングPerl買うべきかなぁ?
本を買うのが勉強になるとは限らない。 もちろん知識は上積みされるがそれがプログラミングの発想力に繋がるとは限らない。 自分で考えながら色々なプログラムを組んでみるのが一番の近道。
48 :
43 :03/11/29 00:02 ID:???
すいません、45さんもありがとうございます。
>>47 その通りですね。精進します。
49 :
nobodyさん :03/11/29 01:33 ID:AmPBCTmU
パンチ5分の2と、キック2分の1をおしえてください!
あぼーん
あぼーん
あぼーん
>51 女にもてて童貞も捨てられるような言語があれば教えて下さい。
>>53 そいつにレスするのマジでやめて。
コピペ荒らしはほっとけば即削除されるんだからさ。
あぼーん
あぼーん
あぼーん
複数ある空行を削除する方法ってありますか? s/(?:^$)+//gm ってやったけどダメでした。 s/(?:\n|\r|\r\n)+//gm って手があるんですけど、他にスマートな正規表現ってありますか?
<!--start-->あいうえお<!--end--> かきくけこ <!--start-->さしすせそ<!--end--> ってテキストがあるときに、 ある条件では<!--start-->〜<!--end-->部分を表示して、 それ以外では<!--start-->〜<!--end-->部分を表示しないってのを考えてるんだけど、 上手い方法ありますか? if ( $text =~ m/<!--start-->(.*)<!--end-->/si ) { $area = $1; } これじゃ一個しかいかんし。。
63 :
31 :03/11/29 16:18 ID:???
>>32 自らやってみての発言か?
$ cat test.pl
#!/usr/bin/perl
@foo=qw(a b c d e);
s/(.)/uc $1/e for @foo;
print "@foo";
__END__
$ perl test
A B C D E
>>63 >>27 をよく読め。下のスクリプトで本当にうまくいくのか?
@filedata = ("abcde\n", "fghij\n", "klmno\n", "pqrst\n");
$foo = "fghij\nklmno\n";
s/$foo//go for @filedata;
print @filedata;
66 :
31 :03/11/29 18:38 ID:???
┌┐ んvヘゝ i i ノ (;゚Д゚) <ハッ…!?もうね、ボケナスかと。 / (ノ |) | ! ゙:、..,_,.ノ U U
WinのActivePerlに関連付けたplファイルが黄色の丸い顔のようなアイコンになりました。 これは何の絵なのでしょうか?
68 :
nobodyさん :03/11/29 21:35 ID:6217YKmG
うんこ
コマンドマテリア
>67 出来そこないの真珠
きんたま
恐らくPL学園と関係が
73 :
nobodyさん :03/11/30 00:55 ID:yiCtHQ+E
質問っす。 grep(/文字列/,@_); を grep(/[^文字]/,@_); みたいに、マッチした文字列を含まないもの。 を返してほしいんですが、どう書けばよいのでしょうか? 教えてくださいでつ。
74 :
67 :03/11/30 01:04 ID:???
みなさんはPLファイル、CGIファイルのアイコンは何にしてますか? エディタに関連付けてますか? Winの話ですが。
>73 grep(!/文字列/,@_);
関連づけはPERL。 アイコンはうんこ。 エディタは秀丸。
79 :
nobodyさん :03/11/30 04:49 ID:ube7xmI2
すいません、 @NAIYOU=(1+2+3+4+5); を @NAIYOU=(1,2,3,4,5); に置き換えたいのですがどのように記述すればいいのでしょうか?
>>79 まさか本当に(1+2+3+4+5)って直で書いてるの?
>>80 これは例えです。とりあえず+を,に変えたいんです。
意味わかんね
>>81 ほんと、意味わからん。
@NAIYOU=(1+2+3+4+5); を@NAIYOU=(1,2,3,4,5);に書き換えるんじゃなくて
( )に入れる前に変えなきゃならないだろ.
わからなくて質問してるんだからどう書いているのか晒せよ。
多分文字列"1+2+3+4+5"をsplitして配列にしたいだけだと思うけど。
>>84 それは誰でもわかるけどあれじゃ答えようがない
つーか、暗算でできるだろ
もう放置でいいか(゚听)メンドクセ
>>79 #配列にいれたいなら
@NAIYOU = split /\+/, "1+2+3+4+5";
#"+"を","に置換するなら
($NAIYOU = "1+2+3+4+5") =~ s/\+/,/g;
tr というものがある。 tr/+/,/ 便利だよ
perlでのファイル入出力について質問です。 ひとつのファイルハンドルを使い回してファイル入出力を行うと意図した結果が得られないことがあります。 例えば、 open(OUTFILE, 'a.txt') or die("$!"); while ( $filename = shift @filelist) { #@filelistはファイル名のリストです open(FILE, $filename) or die("$!"); while ( $buff = <FILE>) { print OUTFILE $buff; } close FILE; } などとして複数のファイルを結合するスクリプトを実行してみると、結合されたファイルのサイズがまちまちです。 以前ファイルハンドルの使いまわしにおける不具合を記述したページを見たことがあったのですが、失念してしまい ました。そこではファイルハンドルを動的に生成してしたように記憶しているのですが、具体的にどうやればいい のか分かりません。 このスクリプトの不具合の原因はファイルハンドルの使いまわしによるものなのでしょうか? よろしくお願いします。
>このスクリプトの不具合の原因はファイルハンドルの使いまわしによるものなのでしょうか? これだけじゃわからんが、おそらく違う。
>>90 OUTFILEがリードモードでオープンされている。書けるわけ無い。
93 :
90 :03/11/30 13:54 ID:C7124nYA
>>92 すみません。記述ミスです。
open(FILE, ">>filename)
でした。
引き続きよろしくお願いします。
>>84 その通りです。文字列を配列に入れたかったのです。
文字列の扱う時のクウォート入れるのを忘れていました・・・。すいません。
>>88 ありがとうございます。うまく動作しました!
>>89 trの場合はどのように記述するのですか?
@NAIYOU ="1+2+3+4+5";
@NAIYOU =~ tr/+/,/;
ではうまくいきませんでした・・・
やっぱ、自分で調べようとせんやつか。
96 :
90 :03/11/30 14:46 ID:???
すみません。原因は別のところにありました。ファイルを追加モードで書きこんでいるためサイズが違ってしまって 当然ですね.....くだらないことを質問してしまい申し訳ございません。 ファイルハンドルを動的につくることは、 $hd = "FILE" . "$number" open($hd, $filename) or die("$!); $number++; とすることでファイルハンドルFILE+$numberをつくることができました。 ただファイルハンドルを使いまわしても各個生成しても結果に差異はありませんでした^^; 最後にひとつだけ、 今回のスクリプトをuse strictとしてしまうと、open($hd, $filename)のところでエラーになってしまいます。 Can't use string ("FILE") as a symbol ref while "strict refs" in use at ... 変数は$hdも含め全てmy宣言しているのですが、どうすればエラーなく実行することができるでしょうか?
リモートホストだけを記録するアクセスログを作りたいのですが、 どうすればいいのですか? (数値だけのIPは記録しない)
>>98 出せる金額とメールアドレスを提示して暫し待つ。
お前があの大馬鹿者か。帰っていいよ。二度と来るなよ。
>>103 ていうかさぁ、君バカでしょ・・・
そんなので削除になるほどのカキコミじゃないし。
ホスト見てニヤニヤしたい糞房
>>102 に釣られるなよ
小学生並みのバカさにワロタ
110 :
nobodyさん :03/11/30 20:36 ID:p9pdSEtx
【 サーバ 】 ローカル鯖(Apache 2.0.48、perl 5.6.1) 【 質問内容 】 ローカルでCGIのテストをしたのですが、 表示されません。 同じフォルダ内のhtmlファイルは表示されます。 ANHTTPで実行したときは正常に表示されたのですが、Apacheにしてから表示されなくなりました。 もう小8時間格闘中です。 よろしくお願いします。 エラー : 500 Internal Server Error Apacheのエラーログ : 指定されたパスが見つかりません。 問題のCGIスクリプト : #!usr/local/bin/perl print "Content-type: text/plain\n\n"; print <<"HDOC"; <HTML> <HEAD> <TITLE>テスト画面</TITLE> </HEAD> <BODY> テスト。これが表示されてればOKだぜ! </BODY> </HTML> HDOC exit;
>>110 OS書いてないが、、、
#!usr/local/bin/perl
を
#!/usr/local/bin/perl
にかえたらどうなる?
112 :
110 :03/11/30 20:48 ID:???
すいません、WindowsXPです。 usrの前に/を付け加えてみたのですが、やっぱりエラーが出ます。 同じく 500 Internal Server Error です。
apacheのhttpd.confの記述を要確認
114 :
110 :03/11/30 21:00 ID:???
分かりました もう1回確認してみます。
つーか、スレ違いじゃないか?
anhttpdと違ってapacheだと一行目の#!〜を評価したような気がする。 一行目を真面目にperlへのパスにしたほうがいいかもしれない。
>>116 いや、あの・・・
評価するんにきまってんだろヴォケ。てめぇApache使ってないのかよ?
つーか
>>110 も糞みたいな質問すんなヴォケ
118 :
110 :03/11/30 21:13 ID:???
>>116 ありがとうございます!
それでできました!
>110 Perlへのパスをドライブレター(C:/とかD:/とか)から始める絶対パスにするとか。 なんかそれくらいしか思いつかん。 まさかExecCGIオプション附加してないだけってオチは……。
おっとすれ違った。
>>119 そんな必要ないよ。
C:\usr\bin\perl.exeだったら
#!/usr/bin/perlでいける。
その辺はホストに合わしましょう。
って、
>>119 さんに言ってるみたいだね・・・
環境変数に登録しておけば#!perlだけでもいい。
それだとホストが(ry
125 :
123 :03/11/30 23:53 ID:???
あくまでもローカルで実行させる場合の話だよ。 僕はCGIとしてよりもHTMLの生成などでPerlを使うことが多いので。
126 :
nobodyさん :03/11/30 23:59 ID:c5YjETLc
文字列の末尾を参照するにはどうすればよいのでしょうか?
substr($mes, length($mes)-1, 1) $mes =~ m/(.)$/;
発言行数の設定ってどうするのでしょうか?
お前の脳内はお前にしかわからないわけだが
取り合えず注意書き用意しとけ。
133 :
nobodyさん :03/12/01 03:30 ID:vdpLgcUB
こんばんは。質問です。 ローカル環境でapacheを入れてperlでcgiを作っているんですが、 perlのソースに変更を加えて、ブラウザで動かそうとするとInternal Server Errorが出ます。 ところが何度かリロードを繰り返すと、それ以降はちゃんと動きます。 また変更を加えてロードすると、エラーが出ます。これも何度かリロードすると動きます。 なぜこのような現象がでるのか、わかる人いましたら教えてください。
mod_perl使ってる?
135 :
133 :03/12/01 03:39 ID:vdpLgcUB
httpd.confの、AddModule mod_perl.cという行でしょうか? 現在はコメントアウトされています。これが原因でしょうか。ちょっとやってみます。
136 :
133 :03/12/01 03:41 ID:???
えー、デーモンを再起動したところ、そんなモジュールは無いよと言われました。 apacheのスレで聞いた方がいいですかね。
いや、使ってないならいいんだ んじゃ、エラーが出たらApacheの再起動してみて なんらかのモジュールが入ってるような気がしないでもないが・・・
138 :
133 :03/12/01 04:28 ID:???
perlをモジュールにしたらちゃんとできました。どうもありがとうございました。 それにしてもなぜこのような現象が起きたのか不思議です。
その前に、サーバーのエラーログにはなんて書かれてある? 自分も似たような経験あるんだけど、 CGI::関連のモジュールが利用しているFile::Specの不具合でそうなった事がある。 その時は、ソースの変更とかは関係なしにreloadすると時々エラー。 でも、他の環境では全くエラー出ない。なんて事があった。 変更後にのみエラーなら、 キャッシュの効いていない状態で実行すると、処理に時間がかかり過ぎてエラーとか。 なんて事もあり得るかな?
エラーが変わるのは、おそらくそのときのサーバ側のプロセスの 状態によるんじゃないかな。 httpd が複数起動しているわけだが、そのどれにあたるかで変わってくる、と php以外のモジュールはデバッグ中はこういうことがよくある
141 :
133 :03/12/01 04:39 ID:???
ログは次のようになっていました。どういう意味なのかはよく分かりません。 [error] (26)Text file busy: exec of /home/takahiro/public_html/test.cgi failed [error] [client 192.168.1.1] Premature end of script headers: /home/takahiro/public_html/test.cgi
142 :
133 :03/12/01 04:53 ID:???
原因が分かりました。原因はSambaでした。 私はWindows上で開発を行い、実行はLinuxで行い、ファイル共有にSambaを使っているんですが、 Sambaのファイルのロック時間が長いか、無線LANを使っているため遅いのか、原因はわかりませんが、 ロック時間が長いため、それで弾かれるんですね。 smbstatusで見てみると、確かにロックされています。
143 :
133 :03/12/01 04:54 ID:???
まったくスレ違いの質問だったわけですね。どうもご迷惑おかけしました。
144 :
90 :03/12/01 05:58 ID:???
>>145 の訂正
どこに表示行数指定の数値等を入れればいいでしょう?
#!/usr/bin/perl
$max_lines = "3";
$host = $ENV{'REMOTE_HOST'};
if ($host eq "" || $host eq $host) {
$host = gethostbyaddr(pack("C4", split(/\./, $host)), 2) || $host;
}
open(OUT, ">> rh.html");
print OUT "$host<br>\n";
close(OUT);
print "Content-type: text/html\n\n";
print "$host\n";
exit;
氏ね
スレ違いに回答するからこうなるんだよな
149 :
nobodyさん :03/12/01 10:20 ID:yiZEHlFP
配列の第3項目 $List[$i][2]の値で降順ソートしたいのですが どのようにすればよいですか?
>>149 @index = sort { $List[$b][2] <=> $List[$a][2] } 0 .. $#List;
@indexにソート順が入る
151 :
149 :03/12/01 14:28 ID:yiZEHlFP
>>150 さま
ご教授ありがとうございます。
しかし、出力された配列は1次元になるのですね。
@list={['011',zzz,'333'],['022',yyy,'222'],['033',xxx,'111']}
これを3項目でソートして同じような2次元の配列にしたいのです。
説明不足ですみませんでした。
よろしくお願いいたします
@index = @List[ sort { $List[$b][2] <=> $List[$a][2] } 0 .. $#List ];
@list= (['011',zzz,'333'],['022',yyy,'222'],['033',xxx,'111']); # { → ( @list = sort { $b->[2] <=> $a->[2] } @list; # ASCIIなら <=> → cmp print "@$_\n" for @list;
@sorted_list = map { $_->[0] } sort { $b->[1] <=> $a->[1] } map { [ $_, $_->[2] ] } @list;
155 :
154 :03/12/01 15:21 ID:???
print "a"; だらだらと時間のかかる処理; exit; としたとき、だらだらと時間のかかる処理が終わるまでaが表示されません。 最初にaが表示されてからだらだらと時間のかかる処理をしたいのですが、どうすればよいでしょうか? また、 print "a"; だらだらと時間のかかる処理 { while (...) { print "b"; } まただらだらと時間のかかる処理; eixt; とした場合は、だらだらと時間のかかる処理の途中で同時にabbb...という風に表示されてから まただらだらと時間のかかる処理が続きます。 何故上の処理だと処理終了まで文字列の表示がまたされるのに、下のだと途中で表示されるのでしょうか? ぐぐってみたけどさっぱりです・・・・ だれかたすけてーーー
CGIを使わず、コマンドプロンプトで実行する。
そのぐぐったキーワードを知りたい
>>156 print "a\n";
だら処
exit;
とか
{
$|=1;
print "a";
}
だら処
exit;
でどうかすぃら?
161 :
156 :03/12/01 16:07 ID:???
>>159 できました。ありがとうです。
でも、$|については理解できたのですが、\nするだけで即時表示されるのはどうしてですか?
>>158 ぐぐったなんてつよがりですよ!わかってるくせにいじめないでよ!!いじわる!!!
162 :
149 :03/12/01 16:07 ID:???
>>152 さま
>>153 さま
>>154 さま
>>155 さま
perlの記述は難解です。
時間も無かったので一次元配列にしてソートして項目切り出しました。
と
一旦上手くいったのですが153さまのcmpであっさり出来たので
それで書き直しました。
ご教授いただいた皆様に感謝いたします。 喜
163 :
159 :03/12/01 16:33 ID:???
>>161 あ、まちがえた。local $|=1;だ・・・と思ったらもうレスが。
えー、最初のがうまくいくのは、バッファは改行でもフラッシュするから。
今回のはキーワード思いつきにくいだろうから気持ちはわかるけど、
ぐぐってないのに逆切れはイクナイよ。
回答者の同情を誘うための「ぐぐった」なのか。 よく覚えておくよ。
165 :
nobodyさん :03/12/01 17:46 ID:OFjsl1+y
ふと思ったんだが$や|なんてどうやってググるんだ?
166 :
nobodyさん :03/12/01 18:01 ID:1E2TBaXO
的外れなワードでぐぐってたんなら、それについてアドバイスもできるが、 最初から検索もせずに「ぐぐった」なんて言ってたら殺意も覚えるわな。
誰か
>>146 に返事出してやれよ、かわいそうだろうが
なんか殺伐としてますね・・・・ ちょっと分からないとこあるので教えてくださいませ。 デスクトップにあるファイルを読みこもうと open ( DFILE, 'c:/windows/デスクトップ/hoge' ); とやったのですがうまくいかず、デスクトップをデスクトップにしたらうまくいきました。 と、ここまではよかったのですが、ネット上でperlはEUCで書くべしというのをみかけたので、 早速コードをEUCに変換しました。するとうまくいきません。エラーコードを調べてみると、 ファイルがないと書かれていました。どうやらWindowsはEUCの文字をうまく認識してくれない みたいです。そこでjcode.plを使ってデスクトップの部分をShiftJisに変換したのですがそれでも うまくいきません。変換した部分が%a%ls%みたいな感じにぐちゃぐちゃになってしまいます。 半角カナがいけないのだなと思い、同じくjcode.plで全角にするとうまくいきました。 でも今度はそれをいちいち半角に戻さなければいけません。 で、実際のコードは↓なのですが、なんだか不毛なことをやっているような気がします。 もっとスマートに解決する方法はないものでしょうか?もちろんShiftjisにするってのはなしで・・・・ お願いしますm__m #!/usr/bin/env perl require 'jcode.pl'; $str = 'c:/windows/デスクトップ/hoge'; jcode::h2z_euc(\$str); jcode:convert(\$str,'sjis'); jcode:z2h_sjis(\$str); open ( DFILE, $str); ...
>168 なぜEUCで書いた方がいいと言われているかを考えるべき。 全ての環境においてEUCがベストなわけではない。 敢えて言う、Sjisにしなさい。
>146 何をしたいのかが伝わってこない。 これじゃ答えようはない。 自分の考えを伝える方法をまず学んできなさい。 >167 これでいいか?
>>146 >if ($host eq "" || $host eq $host) {
最高に意味不明
if文使う必要ねーじゃねーか
>>168 SJISで書いていると、マッチングが正常にいかないことがある。
そういうときに何故「EUCで書け」というのか分かる。
>>168 簡単なこと。
「ファイルをデスクトップに置いて扱うな」
そういえば漏れも厨だった頃、デスクトップに保存してたなぁ。。。。。。
昔のスクリプトを引っ張り出してみました。
# データディレクトリ
my $datadir = 'C:\Documents and Settings\Administrator\デスクトップ\data';
jcode::convert(\$datadir, 'sjis', 'euc');
これでいいか?
でも
>>173 がいいぞ。
176 :
nobodyさん :03/12/01 20:40 ID:gWfIK9kD
ある一定の時間事に特定の変数をクリア(簡単なタイムアウトみたいなもの?)しようと思って $Start_time = time if !$Start_time; if (time > $Start_time + 5){ #$tokuteiが特定の変数です。 undef $tokutei; undef $Start_time; } としたのですがうまく動いてくれません。 う〜ん何度考えてもこれで動いてくれると思ってしまうのですが いくら考えても原因がわかりません。 アドバイス頂けると幸いです。
>176 どういう環境で実行させていますか?
>173 '(略)\スクリプト\data'
179 :
176 :03/12/01 21:06 ID:???
どういう環境ってどういうことだろ?すいませんパッと思いつかなかったんですが windowsXP ActiveParl 5.6 で サブルーチンの中のif文の中のif文って環境です。 うわぁ・・分かりづらくてすいません。
>179 一回行動の終わったスクリプトの変数が、次に起動した時に受け継がれるとか思っていますか?
181 :
168 :03/12/01 21:23 ID:???
う〜〜んみなさんいろいろとさんくすです。
総括して、とりあえず
>>172 さんのいうそういうときになるまでSjisでやっていくってことにします。
>>168 目から鱗です
で、
>>175 さんのでうまくいきました。ども。てことはjcode::convertが半角カナを自動認識してくれないって
ことが原因ということでよろしいでしょか?
う〜〜んperlでの日本語の扱いって難しいです。
とりあえずざっとみたかんじ、
use strict;
・5.8系はunicodeに対応してるから日本語の扱いについては問題なしunicodeに対応してないOSについては
Encode使うべし
・5.6系はunicodeに対応しきれてないからjcode.plからpmを使うべし
・現状では5.6系の方がシェアあるんだから統一して日本語処理に関してはjcodeに総まかせ
perl -w 168.pl
182 :
176 :03/12/01 21:25 ID:???
>>180 それはないです。う〜ん文法的にはあってますよね?
実は正しく動いているのだが、確認する手段が間違っているという可能性も考えられる。
>>168 デスクトップのPATHはc:\windows\デスクトップとは限らないぞ。
正式にはCOM使って取得する。嫌なら
>>173
Windows2000とかじゃユーザごとに用意されとるな。
うん、環境依存になるね
とりあえず AcitvePerl ならこれでいける模様。 use Win32; print Win32::GetFolderPath(CSIDL_DESKTOPDIRECTORY);
>181 いや、と言うかWinのファイル名に使われてる文字コードはSJISってだけ。 EUCで書いたスクリプトのデスクトップって文字と ファイル名に使われてるデスクトップって文字は見た目は一緒でも中身が違う。
>182 >176の前がどうなってるか次第だろ。 それだけでわかるはずもない。 「ある一定の時間毎に」という記述ではないな。
>>187 スクリプトもデスクトップにおいてしまうなら、何も問題はなくなるんだけどな……。
perl2exeを探しているのですがどこへいけば手に入りますか? 検索してもリンクぎればっかりで見つかりません。
192 :
191 :03/12/02 09:35 ID:???
すみません。みつかりました・・・・さっきはつながらなかったのに、なんでだろう。 で、このperl2exeの最新版て以前報告された純粋なソースコードが抽出される セキュリティホールは解消されたのでしょうか?
文字列の先頭何文字かを削りたいんですが、 $str = reverse($str); $tmp = 0; while($tmp < 2){ chop($str); $tmp++; } $str = reverse($str); このような処理をしてるんですが、もっと能率の良い処理方法はないでしょうか。 アドバイスいただけると幸いです。
わろた
substr
196 :
193 :03/12/02 22:23 ID:???
>>195 上手く行ったようです。
ありがとうございます
>193 forじゃないんだなとか別のところが気になってしまった。
198 :
nobodyさん :03/12/03 05:25 ID:qZsuT39+
Perlが圧開ける数の最大値と最小値(小数第何位)はいくつなのでしょうか? 自分でトライしようと思ったのですが・・・ 最大値は、 1000000000000000 * 1(0が15個)だと1e+15と表示され、 1000000000000000 * 1 - 1だと、999999999999999(9が15個)と表示されたから、 最大値は999999999999999(9が15個)なのかなとも思ったのですが、 そもそも、「1000000000000000 * 1」となってる時点で、数値が狂うはずでは、、と思い、わかりませんでした。 最小値は、トライのやりかたもわからず。。。 また、Perlのバージョンによってもことなってくるのでしょうか? どなたか、教えて頂ければ幸いです。
199 :
198 :03/12/03 05:26 ID:qZsuT39+
すいません。
>>198 の1行目、
「圧開ける」でなく「扱える」の間違いでした。
コンパイルした時の設定でかわる それぞれの型は何ビットかがわかれば 上と下もわかる
しつもそでつ。 Perlで、リモートサーバーのコマンドを実行したいです。 ローカルだと、system( "ls -l" ); でいけますが、 例えば、IPが 192.168.1.1 のマシン上の ls -l の戻り値を 192.168.1.2 で処理させたいのです。
system('./remote.sh'); ./remote.shにはリモートサーバーのコマンドを実行して結果を返すシェルスクリプトを。
203 :
nobodyさん :03/12/03 12:24 ID:eSyaEdUC
$str = "aiueo "; 変数に入ってる文字列のあとに半角スペースがいくつか入ってるんですが、 それを取り除くにはどうしたらいいですか。 正規表現の書き方は。
(\s.)+$かな
206 :
nobodyさん :03/12/03 13:13 ID:eSyaEdUC
$a = " aiu eo "; while($a =~ /\s$/g){ $a =~ s/\s$//g; } print "$a\n"; 一応これで出来ましたが、while無しで出来ないのでしょうか。
$a = " aiu eo "; $a =~ s/\s+$//; print "$a\n"; ではうまくいかない?
あ、いきました。 どうもすんません。
正規表現の基礎くらい自分で勉強しなさい。 検索すればゴロゴロ見つかるし、正規表現専門のスレも立ってるだろう。
print "Content-type:Image/gif\n\n"; print "\x47\x49\x46\x38\x37\x61\x01\x0\x1\x0\x80\x0\x0\x0\x0\x0\xff"; print "\xff\xff\x2c\x0\x0\x0\x0\x1\x0\x1\x0\x40\x2\x2\x44\x1\x0\x3b"; このようにすれば、ブラウザで見れば1×1のGIFが出力されますが、 open(GIF, "sample.gif"); @gif = <GIF>; close(GIF); として、読み込んだgifファイルを次のようにソースコードとして 画面出力する方法を教えて下さい。 \x47\x49\x46\x38\x37\x61\x01\x0\x1\x0\x80\x0\x0\x0\x0\x0\xff \xff\xff\x2c\x0\x0\x0\x0\x1\x0\x1\x0\x40\x2\x2\x44\x1\x0\x3b 試行錯誤してみましたが、「\x01」、「\x0」、「\x1」、「\x80」等でエラーが起きてしまいます。 #!/usr/local/bin/perl $gif ="\x47\x49\x46\x38\x37\x61\x01\x0\x1\x0\x80\x0\x0\x0\x0\x0\xff"; for($i=0;$i<100;$i++){ $gif =~ s/\x$i/\\x$i/g; } print "Content-type:text/plain\n\n"; print "sample:\n"; print $gif;
binmode
213 :
nobodyさん :03/12/03 17:00 ID:SgEDdsu6
って言うか、バイナリファイルは普通binmodeで開くのが常識だろ
でどうやって出力するとソースコードになるんですか(´・ω・`)ションボリ 実行結果変わらなかった・・・・
放置?
binmode?開く?( ´,_ゝ`)プッ
open GIF,"|hexdump sample.gif";
#!/usr/bin/env perl $gif='\x47\x49\x46\x38\x37\x61\x01\x0\x1\x0\x80\x0\x0\x0\x0\x0\xff'; print "Content-type:text/plain\n\n"; print "sample:\n"; print $gif; でどう?
>>219 すごいですね・・・
それだけで文字列は読み込まれました
だけどやっぱりgifファイルからだとダメポ(´・ω・`)ションボリ
結構難題なんだな・・・・
16進数ダンプしたいだけじゃなかったの? ord/hex とか pack/unpack, printf のフォーマット指定とか
>>221 イマイチよく分からないです。とりあえず
Gif=>ソースコード
っていうのが最終目標なんですが・・・
$a =getc(FILEHANDLE); $b = ord($a); $c ="\\x".sprintf("%lx",$b); print $c; みたいな?
ソースコードってのがよくわかんないんだけど。 while (my $c = getc(GIF)) { printf("\\x%02x", $c); }
TIMTOWTDIってことでもういっちょ。 open my $fh, "<:raw", "giffile.gif" or die $!; while(my $c=getc($fh)){ printf "\\x%x", (unpack "C",$c); } close $fh or die $!;
ソースコードって要はバイナリを文字列として出力したいだけっしょ?
228 :
226 :03/12/03 20:24 ID:???
3分差で負けてるし _| ̄|○
まずは用語をなんとかしてくれ・・・
そのまんまテキストモードで開けばバイナリ文字列になるだろうが!
すみません。 皆さんが教えて下さったものはどれも何故か動作しませんでした。(´・ω・`)ションボリ なぜだらう・・・ よく分からないと言われたので・・・ >print "Content-type:Image/gif\n\n"; >print "\x47\x49\x46\x38\x37\x61\x01\x0\x1\x0\x80\x0\x0\x0\x0\x0\xff"; >print "\xff\xff\x2c\x0\x0\x0\x0\x1\x0\x1\x0\x40\x2\x2\x44\x1\x0\x3b"; >このようにすれば、ブラウザで見れば1×1のGIFが出力されます で、この逆をやりたいわけです。 例) 1×1のGIFから \x47\x49\x46\x38\x37\x61\x01\x0\x1\x0\x80\x0\x0\x0\x0\x0\xff \xff\xff\x2c\x0\x0\x0\x0\x1\x0\x1\x0\x40\x2\x2\x44\x1\x0\x3b というものを再現する、と言うことです。
>>232 心遣いありがとうございます。
ですが、Perlの環境もありますし、他のCGIはちゃんと動きますよ。
>>231 >皆さんが教えて下さったものはどれも何故か動作しませんでした。(´・ω・`)ションボリ
>なぜだらう・・・
本当に疑問に思うのなら、どう動かないのか情報を出してくれ。
>>233 ローカル (手元のマシンのコマンドライン) でやれという意味だと思う。
その上でうまくいかなかったのならエラーメッセージを書くべき。
>>235 >>226 をやってみたんですが
Unrecognized character \x81 at watch.cgi line 4.
とでてきます。
そのままコピペしたのかよ。
自分は
>>226 でちゃんと\x47…と表示されたよ
コマンドラインでやってる?
全角スペースは取った?
ファイル名を適宜かえた?
>>239 全角スペースにやられた・・・・
でもやっぱり今度は実行時に
Unknown open() mode '<:raw' at watch.cgi line 2.
と出る罠
配列に入れると処理が面倒だからスカラに入れなよ
>>29 を応用してやってみたが
{
local $/;
open(IMG, "./img/new.gif") or die "ファイルが読込できません:$!";
$img = <IMG>;
close(IMG);
}
print "Content-type: text/plain\n\n";
$size = length($img);
$byte = 0;
for ($i = 0; $i < $size; $i++){
printf ("\\x%02x", vec($img, $byte, 8));
$byte++;
}
>>241 すごい・・・
できました。。。
ありがとうございました!
いくつかのディレクトリを中身のファイル有る無しにかかわらず、 削除したいんですがうまくいきません。 ググってみるとコマンドってのが良く出てくるのですが、 私はコマンドってコマンドプロンプトとかみたいな感じにとらえてて、 perlによるcgiを作成している私には関係ないと思いまして・・ それは置いといて、 頭の中では削除するディレクトリの中身を調べ 全てのファイルをunlink後、rmdirでできると思うのです。 (この考え方だとディレクトリの中にディレクトリがあると削除されないと思いますが、今回は無いです) で、書いてみたのですが、、消えてくれませんご教授願えませんでしょうか? foreach $dir($adir,$bdir,$cdir) { opendir (DIR,"$dir"); while ($file = readdir(DIR)) { unlink ("$dir/$file"); } rmdir ("$dir"); }
244 :
nobodyさん :03/12/04 01:05 ID:yWko/Od0
age忘れましたすいません。
close忘れましたすいません というのは?
>245 =~ s/close/closedir/;
>>243 消される側のファイルのパーミッションは?
消すためには消されるファイルやディレクトリ自身ではなく、 それが含まれているディレクトリのパーミッションが使われる
249 :
243 :03/12/04 01:33 ID:???
レス有難うございます。 えっと、パーミッションのことは考えて無かったです。 でもいまwin上でテストしてるだけなんですけど、 パーミッション関係なかったですよね? あとディレクトリ閉めるの忘れてましたすいません。
お騒がせしました。意図したとおりに動きました。
えっと、書いたコードの直前のところでミスってました。
なんで
>>243 は問題じゃないと思います。 #スマートかどうかは別として
で、当然なんですが、
自分のディレクトリと親のディレクトリを示すでしたっけ?
「.」と「..」がunlink失敗しているようなんですが、
コレはほっといても特に問題ないでしょうか?
>>250 それは親ディレクトリが作成されると勝手に用意されるものだから、削除できないよ。
ファイル名をチェックしてうまくスルーすべし。ディレクトリ削除に影響はない。
ディレクトリを含む場合は再帰処理をするか、シェルコマンドを使うかかな。
>>251 有難うございます。これでいくことにしました。
皆さんお騒がせしましてすいませんでした。
つーか、「..」を特別扱いしてなくて再帰処理したらやばい・・・
先ほど似たようなスレで同様のカキコしたのですが…本スレはこちらだったのですね。 ご迷惑おかけしてしまいすみません… 同様の質問をこちらにカキコします。お許しください… Perlを用いてn個の整数乱数を発生させ配列に収めたいのですが… 例えば n = 5 の場合、 3 2 5 1 4 …みたく、1からの乱数が重複することなく出力されるプログラムを作りたいのですが、 どうもつまづいてしまいます。 皆さんが作るとすればどのように作りますか?
>>254 $num = '9';
$count = '5';
$roop = '1';
@data = ();
@value_his = ();
until ($count < $roop) {
push(@value_his, $value);
$value = int(rand($num));
$entercheck = 0;
foreach (@value_his) { if($value eq $_) { $entercheck = 1; } }
if($entercheck == 0) { push(@data, $value); $roop++; }
}
理解しやすいよーにこー書く。
$nにあたるのが$count。$numは整数の範囲。
$countより$numが小さいと無限ループする。(条件の重複無しを満たさなくなるため)
@dataに重複の無い数字が入る。
過去に出た数字を@value_hisに保存して置いてフラグ$entercheckをチェックしてるだけ。
過去に出た数字と$valueが一緒になると$entercheckに1が入るため@dataにデータはpushされない。
高速化キボンなら、重複した時点でforeach抜ければOK。
>>254 $count = '5'; $num = '9';
# $countはn個の整数乱数キボン $numは得たい数字の範囲0〜$num
$roop = '1'; @data = (); @value_his = ();
until ($count < $roop) {
push(@value_his, $value);
$value = int(rand($num));
foreach (@value_his) { if($value eq $_) { goto end; } }
push(@data, $value); $roop++;
end:
}
こーゆーコトね
>>254 俺はこうやっちゃうかな
$count = 5;
while ($#array + 1 < $count) {
$ran = int ( rand ($count)) + 1;
if (grep (/^$ran$/, @array)) { next; }
push (@array, $ran);
}
unelss (grep (/^$ran$/, @array)) { push (@array, $ran); }
$count = 5; while ($#array + 1 < $count) { $ran = int(rand($count)) + 1; unless (grep (/^$ran$/, @array)) { push (@array, $ran . "\n"); } } print @array; こうか
my $n = 5; my @r = map $_->[0], sort { $a->[1] <=> $b->[1] } map [ $_, rand ], 1 .. $n; print join "\n", @r;
@r = sort { (rand) < 0.5 } 1..$n ; これでもよくね?
ベンチとってみますた
Benchmark: timing 500000 iterations of 255, 256, 259, 261, 262, 263...
255: 32 wallclock secs (29.91 usr + 0.00 sys = 29.91 CPU) @ 16719.61/s (n=500000)
256: 30 wallclock secs (28.06 usr + 0.00 sys = 28.06 CPU) @ 17817.05/s (n=500000)
259: 8 wallclock secs ( 7.19 usr + 0.00 sys = 7.19 CPU) @ 69570.06/s (n=500000)
261: 0 wallclock secs ( 0.56 usr + 0.00 sys = 0.56 CPU) @ 889679.72/s (n=500000)
262: 15 wallclock secs (13.58 usr + 0.00 sys = 13.58 CPU) @ 36821.56/s (n=500000)
263: 6 wallclock secs ( 5.25 usr + 0.00 sys = 5.25 CPU) @ 95238.10/s (n=500000)
>>261 早杉
265 :
263 :03/12/04 18:41 ID:???
まちがえた。 @r = sort { (rand) <=> 0.5 } 1..$n ;
266 :
nobodyさん :03/12/04 19:53 ID:IdERYeTN
use List::Util qw/shuffle/; shuffle 1..10
Benchmark: timing 500000 iterations of 255, 256, 259, 261, 262, 265, 266...
255: 32 wallclock secs (30.95 usr + 0.02 sys = 30.97 CPU) @ 16145.18/s (n=500000)
256: 31 wallclock secs (29.70 usr + 0.00 sys = 29.70 CPU) @ 16833.32/s (n=500000)
259: 7 wallclock secs ( 7.41 usr + 0.00 sys = 7.41 CPU) @ 67512.83/s (n=500000)
261: 1 wallclock secs ( 0.50 usr + 0.00 sys = 0.50 CPU) @ 1000000.00/s (n=500000)
262: 15 wallclock secs (13.66 usr + 0.00 sys = 13.66 CPU) @ 36613.94/s (n=500000)
265: 4 wallclock secs ( 4.92 usr + 0.00 sys = 4.92 CPU) @ 101584.72/s (n=500000)
266: 2 wallclock secs ( 3.02 usr + 0.00 sys = 3.02 CPU) @ 165782.49/s (n=500000)
最速賞
>>261 ベストコストパフォーマンス賞
>>265 そんな便利なモジュールが!知らなかった…賞
>>266 あんた、Lisperだな?特別賞
>>262 審査員:Perl v5.8.0 built for cygwin-multi-64int @Cel2.0GHz
259が一番速いと思った。。。
「偶数」を表す方法はないものでしょうか? 今は(($min eq "2")or($min eq "4")or($min eq "6")or($min eq "8")・・ と60までやってますが、もっとシンプルにしたいです。
if(!($min&1))
($number % 2) != 0
>>267 どういうベンチの取り方してんだ?
261が速いわけないじゃんどう見ても
Perlのベンチを取るソフトってあるんだ…知らなかった。
>273 use Benchmark;
275 :
268 :03/12/04 20:46 ID:???
time関数を使って測ったけど 259が圧倒的に速かったですYo
276 :
272 :03/12/04 21:05 ID:???
use Benchmark; timethese(-5, { '261' => q{ my $count = 5; my (@array, $ran); while ($#array + 1 < $count) { $ran = int(rand($count)) + 1; unless (grep (/^$ran$/, @array)) { push (@array, $ran ); } } }, '265' => q{ my $n = 5; my @r = sort { (rand) <=> 0.5 } 1..$n ; }, }); Benchmark: running 261, 265 for at least 5 CPU seconds... 261: 5 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 7230.58/s (n=38069) 265: 4 wallclock secs ( 5.14 usr + 0.00 sys = 5.14 CPU) @ 181097.06/s (n=931020) by ActivePerl 5.8.0.806 WinXP AthlonXP 2400+ 何回取ってもこんな感じで265の方が断然速いんだけど、オレの方がおかしい?
266は259とほぼ同じアルゴリズムをxsでやってるからとても速いはず。 実際、うちでは266が最速でした。
278 :
267 :03/12/04 21:07 ID:???
>>272 コードをコピペして、use Benchmarkしてtimetheseしますた。
ただし、srandはtimethese前に一度行い、計測コードからは削除、
それと結果を表示させる部分がある場合はそれも削除しました。
>>268 259は僕なんですけど、僕もそう思ってました。
なによりもPerlメモが負けるはず無いと(w。
でも測り方かえるとダントツですかー、うーん。
>>269 print $num % 2 ? "$numは奇数です\n" : "$numは偶数です\n" ;
>278 小数があっても奇数と言われないか?
>269 ($min && $min <= 60 && !($min % 2))
>280はキャンセル。 負の数まで入れちまう。 (2 <= $min && $min <= 60 && !($min % 2))
ていうか>=60じゃないの?
284 :
283 :03/12/04 22:25 ID:???
あと
>>263 のやり方は偏り過ぎるので実用的ではないよ。
285 :
267 :03/12/04 22:43 ID:???
ちょっと実験してみました。
>>271 を実行すると僕の環境でも同じ結果になりました。ここで、
261のコード冒頭のmy (@array, $ran);をコメントアウトすると
>>267 に近い結果になりました。
どうも@arrayの初期化でかなり時間がかかってるみたいなので
265もはじめにmy @r;と宣言すれば時間がかかるようになるかと
修正を行いましたが、なぜか結果にほとんど影響は無いようです。
もうなにがなんだか。
>>279 うわ、なるほど。
print $num % 2 ? "$numは奇数です\n" : "$numは偶数です\n" unless $num =~ /^\d+$/;
>>283 乙です。
286 :
267 :03/12/04 22:45 ID:???
>unless $num =~ /^\d+$/; 逆じゃ?
288 :
267 :03/12/04 22:56 ID:???
逆ですた _| ̄|○ モウダメポ
289 :
nobodyさん :03/12/04 22:59 ID:FibJq+lJ
Perlで分数の計算って出来ないのでしょうか?
>289 最小公倍数と最大公約数の算出をすればあとは適当に組めるでしょ。 そこから先は自分で考えて。 まんま分数を扱うような関数は俺は知らない。
291 :
nobodyさん :03/12/04 23:26 ID:6im5KJL0
>>265 それ前にほかの言語でもやってみたことあるけど結構偏りがあるよ
10000回ループさせて各要素の平均をとったもの
7.5931 7.1856 6.3047 5.4192 5.1705 5.6356 6.0816 5.0735 3.6279 2.9083
数学的に偏りがないようにするのも結構難しい
292 :
nobodyさん :03/12/04 23:36 ID:6im5KJL0
>>259 も偏りがあるみたい
6.0174 5.8564 5.8291 5.7008 5.547 5.4471 5.3008 5.2178 5.0824 5.0012
>>279 %演算子はオペランドを整数に変換して演算するから大丈夫。
へー、変換するんだ? オペランドが整数じゃなかったらエラーになるのはCだけ?
>>289 とりあえず Math::BigRat ってモジュールがあるみたい。
ActivePerl だとインストールされてる。
使い物になるのかどうかは分からないから確かめてみてくれ。
>>285 >261のコード冒頭のmy (@array, $ran);をコメントアウトすると
if ($#array == 4) { die }
while ($#array + 1 < $count) {
my $count = 5;
my @data = ();
my @tmp = 1..$count;
1 while $count > push @data, splice @tmp, int rand @tmp, 1;
print "@data";
個人的には
>>265 が好きだなぁ。
完全にばらつくのはそれはそれで不自然
299 :
265 :03/12/05 12:15 ID:???
>>291 あらら、やっぱり。。
randが出す値が十分にランダムな場合、sortを
sort { ($t[$a] ||= rand) <=> ($tmp[$b] ||= rand) } LIST
こうすればきちんとランダムになると思うけど、
見にくいし、おそいし、メモリも使う。
任意のリストに対応させてハッシュにしたらなおさら。
やっぱりList::Utilがいいすね。
300 :
265 :03/12/05 12:17 ID:???
みすばっかりTT $t[$a] → $tmp[$a]
(´-`).。o(…List::Util::shuffle は基本だろ…)
>>301 (´-`).。o(…スレタイ見ろよ…)
それぞれのルーチンで偏りを見てみた。
サイコロを10万回振って、それぞれが吐く配列先頭要素の出目合計。
>>259 (Perlメモ) 1が全く出ないサイコロ…(゚Д゚;)
1 2 3 4 5 6
0 20156 19938 19855 19986 20065
>>265 (sort) 5,6が異常に出やすいサイコロ
1 2 3 4 5 6
12368 12492 12556 12480 25092 25012
>>266 (List::Util) 綺麗なランダム
1 2 3 4 5 6
16451 16560 16794 16818 16610 16767
>>299 (sort改) 綺麗なランダム
1 2 3 4 5 6
16848 16863 16645 16612 16532 16500
Perlメモたんが一番酷いという結果に。(゜∀゜)
テキストファイルから特定行だけを抜き出したいのですがうまくいきません。 テキストファイルの内容は、 #Editstartあいうえお あいうえお あいうえお #Editend かきくけこ かきくけこ といったものです。 このテキストから#Editstartから#Editendまでを抜き出したいと思い以下のようにしたのですが全ての行が抜き出されてしまいます。 #!/usr/bin/env perl $flag = 'false'; open(F,'taget.html'); open(F2,'keka.html'); while ($in = <F>) { if ($in =~ m/\#Editstart/ && $flag == 'false') { $flag = 'true'; print F2 $in; } elsif ($flag == 'true') { print F2 $in; } elsif ($in =~ m/\#Editend/ && $flag == 'true') { $flag = 'false'; print F2 $in; } } いくら考えても原因がわかりません。 どうやればいいのでしょうか?よろしくお願いします
305 :
304 :03/12/05 15:04 ID:???
すいません。open(F2,">keka.html");でした。 よろしくです
Perlでの文字列判定は × $変数 == '文字列' ○ $変数 eq '文字列'
307 :
304 :03/12/05 15:17 ID:???
>>306 ありがとうございます
なぜこんなことに気付かなかったのか・・・
308 :
297 :03/12/05 16:16 ID:???
ごめん、intいらないみたい。 @array = qw/x y z/; print join "\n", $array[log 2], $array[sqrt 2], $array[exp 1];
310 :
303 :03/12/05 16:33 ID:???
なんかおかしいと思ったら、
>>283 に載ってる 259のコード
に間違いがあってそれそのまま使ってたせいだった。
× my $j = int rand $i;
○ my $j = int rand ($i + 1);
直したらPerlメモたんのコードは偏りのない綺麗なランダムを吐きました。
すまそ。(;´Д⊂)
311 :
303 :03/12/05 17:03 ID:???
けど、おかげでミスったコードは元の要素の位置に同じ要素を入れないという 特殊なシャッフルが出来ることがオマケで分かった。なにかに使えるかw お詫びにList::Util以外で偏りのないランダム化では 最速かもしれないコード晒しておきます。 my @data = (1..5); @data = map splice(@data, rand @data, 1), (0) x @data; Perlメモたんよりちょと速く、List::Utilより2.5倍ほど遅い。
312 :
nobodyさん :03/12/05 17:13 ID:yvNQmC4D
すいません。他スレで質問したのですが、荒れてそうなのでこちらで質問させて下さい。マルチすまそ。 Cookieにタブ(\t)や改行(\n)を使ってもいいのでしょうか? 色々とリファレンスを調べたのですが、ここだけ出てきませんでした。 w3cでは許可してないけど、実際は使っても問題ないとか、そいうことってありますか?
>>312 >>1 > いらっしゃーい、Perlのコーディングで困ってる人のスレです。
>>312 よく知らないけどRFC2109にはこう書いてあるから、原則的にはだめなんじゃ?
...token (informally, a sequence of non-special, non-white space
characters) from the HTTP/1.1 specification [RFC 2068] to describe
their syntax.
316 :
nobodyさん :03/12/05 19:13 ID:t+5mLj9n
Perl勉強&コーディング中なのですが、 「PerlでつくるCGI入門応用編」に載ってたの元に作りましたが、 0バイトのファイルは作成されますがファイルに書き込まれません。 どうしたらいいでしょうか。 #!/usr/bin/perl file::lockopenW(FILE,"temp.txt"); print FILE "test\n"; file::unlockcloseW(FILE); exit(0); package file; sub lockopenW{ local(*FILE,$name) = @_; if( !open(FILE,">>$name") ){return(0);} flock(FILE, 2); truncate(FILE, 0); } sub unlockcloseW{ local(*FILE) = @_; close(FILE); }
>>310 あぁ、ごめんなさい。 origin 揃える時にヘマしたみたい。
ここまでの結果反映しときました。
>>316 #!/usr/bin/perl
file::lockopenW(*FILE,"temp.txt");
print FILE "test\n";
file::unlockcloseW(*FILE);
exit(0);
でもこんなサンプル載ってるような本は捨てた方がいいよ。
ダサンプル
319 :
303 :03/12/05 21:35 ID:???
>>317 いえいえ、一見ランダムだけど規則性がある面白いコードがでけたので逆に感謝したいw
そこでみんなにクイズ!
下記のコードを実行すると、
ATGCACTGACTGCTAGCTAGTCGATGACATGCACTGTCGATGACCTAGACTGATGCACTGTCGAATGCATGCCGTATCGA
という出力が得られました。
? ? ? ?に何が入っていたか順番も当てなさい。
my @DNA = qw(? ? ? ?);
for (my $i=0; $i<20; $i++) {
print eserand(@DNA);
}
sub eserand {
my @data = @_;
for (my $i = @data; --$i;) {
my $j = int rand $i;
next if $j == $i;
@data[$i, $j] = @data[$j, $i];
}
return @data;
}
321 :
303 :03/12/05 21:46 ID:???
>>304 それをやるなら、
while(<F>) {
print F2 if ( /\#Editstart/ .. /\#Editend/ );
}
だけでできるよ。
ただ、どっちもそうだけど最後までパースしちゃうので効率わるいけどね。
>>317 いや、そこは自分で書いたんですが・・・
ほぉ。。。
おまいらにファイルを開く術を伝授する。 open(FH, $file); $file は変数だ。開きたいファイルのパスを入れておけ。
326 :
304 :03/12/05 23:32 ID:???
>>304 のコードだけどさ、== を eq に直したところで $flag == 'true' になった時点で
elsif ($flag == 'true') {
に引っかかって
elsif ($in =~ m/\#Editend/ && $flag == 'true') {
に来ないと思うんだが。
そりゃあお前いいことだらけだろ。 あんなことや、こんなことや うまくいけば、あんなことまで出来ちゃうんだぜ? もうウハウハよ。チンコ乾く暇もねーよ
330 :
nobodyさん :03/12/06 05:43 ID:HLCvLYhk
CGIを使ったperlでサイト内検索を作ってるのですが、 body内に引っ掛けたく無い文字があります。 どのように設定しればいいか教えてもらえませんか?
質問。 htmlファイルから特定の文字が含まれる行だけを抽出するスクリプトについて、 htmlファイルはsjisで書かれています。コマンドラインから引数に'ナース'を与えると、 正規表現エラーがでてしまいます。仕方なくいまはhtmlファイルと引数をjcode.plでeuc に変換して処理しているのですが、これに結構時間がかかります。 なんとかファイルも引数もsjisのままやりたいのですが、どうすれば? 環境はWin98SE+Activeperl5.8.0です。 perlメモとかShif-JISを正しく扱うとかのページを読んだのですが、 さっぱり理解できませんでした。。。。 宜しくお願いいたします。
>331 =~ /\Qナース\E/; このやり方には問題もあるので、詳しくはPerlメモ参照。
>CGIを使ったperl ワロタ
>>333 笑ってないで教えて下さいよ。
なんと表現するんですか?宜しくお願います。
実に滑稽だ
ネタとしてイマイチなんで流します
CGI(と言う規格)を使ったPerlって言いたかったと考えれば表現的には別に変ではないような。 実際どういう意味で言ったか知らんけど。
338 :
nobodyさん :03/12/06 14:37 ID:M7qmj3xY
大きな数値は指数付きで表現されてしまいますが これを元の数値に戻すことって出来るんでしょうか?
>>337 そう言いたかったのです。ありがとうございます。
アノソコイジノワルサ アンナニンゲンニダケハナリタクナイモンダ
perl で 1000分の1秒までの精度の時刻をとりたい。 time じゃできんよね?
>>335 PCも初心者なのですいません。
サイト内検索で、htmlのファイル名も拾ってしまいます。
<body>〜</body>だけの文字を引っ掛けるようにするか、
<body>〜</body>内を引っ掛け無いようにする方法
どっちか教えて下さい。お願いしますm(__)m
system関数で適当なコマンドを実行して、 もしミスったらその原因を配列に入れて die させたいです。 @return_value = system( "ls hoge" ); だと、hogeファイルが無いときにエラーコードしか帰ってこないのですが、 "ls: hoge: no such file or directory" みたいな文字列は取得できないのでしょうか?
systemじゃ無理
まじっすか。。。 system以外でどうすればとれそうでしょう。。
>>341 Active Perlなら、Win32::GetTickCount()っていうのがあるみたいです。
Returns the number of milliseconds elapsed since the last system boot.
らしいです。でも、
Resolution is limited to system timer ticks (about 10ms on WinNT and 55ms on Win9X).
なんで、NT系でも100分の1秒までみたい。
>>343 こんな感じでどうですか。
open FOO, "ls foo 2>&1 |" or die $!;
@status = <FOO>;
print join "だよもん\n", @status;
close FOO;
>342 このスレを10回くらい見返して、自分で使えそうな部分がないか探してみ。
349 :
343 :03/12/06 17:49 ID:???
>>346 ありがとうございます。
ただ、
open FOO, "ls foo 2>&1 |" or die "hoge $!";
ってしたときに、
hoge no such file or directory
とは出せないですね。
意図としては、perl からシェルコマンドを実行して、
その結果を、エラーであっても正常終了であっても取得して加工したいのです。
イメージは、
$return = system( "ls hoge" ) or die "エラー: $!";
で、正常終了の時は、lsの結果が文字列で $return に入り、
エラーだった場合は、「エラー: no such file or directory」としたいです。
>>346 , 347
やっぱモジュール必須かぁ…thx
1: 自分はヒアドキュメントを使いたい 2: それでこんな風にやってみたが・・・ printf 'なにかー'; print<<__HTML__; hello world<br> __HTML__ 今まで動いてた perl のソースに追加してみた。 3: こんなエラーが出て上手く行かなかった。 ページを表示できません 検索中のページは現在、利用できません。Web サイトに技術的な問題が発生しているか、ブラウザの設定を調整する必要があります。
そのエラーは何の参考にもなりません。
354 :
338 :03/12/06 18:00 ID:M7qmj3xY
(つД`)
winで httpdのサーバ で Perlやってるんだけど (´・ω・`) ログがどこに出てるかわからないや
for文を使ってログ行数指定をする方法ってありますか?
357 :
346 :03/12/06 18:23 ID:???
>>349 >意図としては、perl からシェルコマンドを実行して、
>その結果を、エラーであっても正常終了であっても取得して加工したいのです。
えーと、とりあえずウチでは
>>346 のでそうできてます。
ただエラー時に'だよもん'が出なかったのでちょっと修正。
open FOO, "ls foo 2>&1 |" or die $!;
while (<FOO>){
chomp;
print "$_だよもん\n";
}
close FOO;
これで、
$perl dayomon.pl
ls: foo: No such file or directoryだよもん
open FOO, "ls test*.pl" にすると
$perl dayomon.pl
test.plだよもん
test2.plだよもん
こんな感じになります。
>355 httpdなんてのは当たり前なのだが。 anhttpdの事を言っているなら、オプション>一般>ログ>エラー。 オプション>一般>一般>CGI出力を検査、でも可。 これはperlのコーディングと関係ないので、あとは別の場所で聞いて エラーを読めるようになってから出直してきてください。
360 :
338 :03/12/06 20:11 ID:M7qmj3xY
>>359 Math::BigIntは自分も試したのですが、
自分の場合、すでに代入してある値を指数無しで
表示させたいのでうまく出来ませんでした。。
$test = 12345678901234567890;
use Math::BigInt;
$test = Math::BigInt->new("$test");
print "$test";
とやってみたのですが。。
誰かfor文を使ってログ行数指定ができるか教えてください!
>>360 use Math::BigInt;
$test = Math::BigInt->new('12345678901234567890'); # 文字列で与える
$test->bdec; # デクリメントしてみるテスト
print $test, "\n";
363 :
338 :03/12/06 21:17 ID:M7qmj3xY
>>362 すでにある変数に対して行いたいのですが。。
364 :
338 :03/12/06 21:33 ID:M7qmj3xY
自分の場合、変数に代入されている値を 指数無しにそのまま表示するだけでいいのですが。。
>>364 >>360 で誤差も含めてちゃんと変換できてる。
値を誤差なく扱いたいなら、最初から最後までMath::BigIntで扱ってみるしか。
$test = 12345678901234567890;
print $test, "\n";
use Math::BigInt;
$test = Math::BigInt->new("$test");
print $test, "\n";
366 :
338 :03/12/06 22:14 ID:M7qmj3xY
なるほど。 はじめの$testの値と変わってしまうのは仕様ということですか。 それも含めていろいろ考えてみます。ありがとうございました
368 :
338 :03/12/06 23:09 ID:M7qmj3xY
あらら、、鯖(xrea)にうpして動かすと"NaN"になってしまう。。 ローカルでは動くんだけど。。バージョン?の違いとかなんだろーか。。
369 :
338 :03/12/06 23:12 ID:M7qmj3xY
>>365 さんのも"NaN"となってしまう。。
どうしよ。。回避策は無いのかな…
370 :
nobodyさん :03/12/06 23:26 ID:98DplNHW
$_SERVER['HTTP_REFERER'] は一つ前のページの URL ですが、 二つ前のURLを取得したい場合はどうしたらいいですか?
ブラウザのバグで、JavaScriptで10個前まで取れたことがあるみたい。
>>361 ログ行数指定って何のことか書けば教えてやる。
nobodyさんがいっぱい
>>369 5.6以前のMath::BigIntは指数表現を許さない模様。
my $val = 1.23456789012346e+019;
if ($val =~ /(\d+)\.(\d+)e\+(\d+)/i){
$val = $1.$2.'0'x($3-length($2));
}
print $val, "\n";
やっつけ(かなり適当)だから問題あるかも。
あまりにも初心者ですみませんが教えてください。あと、正確に言うとperlスクリプト じゃなくて、シェルスクリプトの分野になるかもしれませんが、適当なスレッドが見当たらなかったので ここに挙げました。すみません。 /export/home/aaa/というフォルダ内にa1.pl、a2.pl、……のperlスクリプトを配置して、 cronで自動化しようとしているのですが、cronが動いてくれません。 cronで指定してるのはstart.shというもので、 中身は #!/bin/sh /usr/loca/bin/perl /export/home/aaa/a1.pl a1.plで、a2.pl,…を use 'a2.pl'; などしてるのですが、エラーを見ると、a2.pl等が見つからない、パスがとおってないようでした。 で、教えて欲しいのはaaaユーザのcronを実行するために、シェルスクリプトでそのaaaユーザになる書き方なんですが。 よろしくお願いいたします。
379 :
nobodyさん :03/12/07 01:00 ID:/OU0n//S
「||=」というのをあるスクリプトの中で見かけたのですが、 どういう意味なのでしょうか? Googleで「Perl "||="」ってなかんじで検索したものの、 どうも、「||=」が載ってないサイトばかりでてきてしまって・・・
380 :
338 :03/12/07 01:01 ID:f7FmGnDh
>>377 >5.6以前のMath::BigIntは指数表現を許さない
ふむふむ。。
>my $val = 1.23456789012346e+019;
>if ($val =~ /(\d+)\.(\d+)e\+(\d+)/i){
>$val = $1.$2.'0'x($3-length($2));
>}
>print $val, "\n";
>やっつけ(かなり適当)だから問題あるかも。
うわー。わざわざありがdございます。
試してみたらちゃんと動きました。
本当にありがとうございましたー
$val が未定義・空文字・0 のような偽のときに代入する方法を伝授する。 $val ||= 'hoge';
>>379 $hoge ||= "fuga";
$hoge = $hoge || "fuga";
$hogeが真なら$hogeを、偽なら"fuga"を代入。
同じ事をここ2chの「名前」にも使っているから、名前に0と入れると
偽=デフォルトの名前になる。
@INC にセットしてパスを通す方法を伝授する。 use lib qw(/usr/loca/bin/perl /export/home/aaa); use 'a2.pl'; # require 'a2.pl'; クーロンでaaaユーザになる方法を伝授する。 su - aaa -c 'command'
384 :
379 :03/12/07 01:20 ID:/OU0n//S
普通にかぶりましたな。 まぁこの質問はここかムのほうで既出なんだけどね いつか名前に0を入れてテストする人がいたから googleで|みたいな特殊文字は検索できないらしく、不便だね
386 :
nobodyさん :03/12/07 01:42 ID:5aqMPCZX
トリップを作成するためのコードを教えてください
>>386 ぐぐるか互換スクリプトのソースでも見ろ
>>383 さん
ご回答いただきましてありがとうございます。やってみます。
389 :
386 :03/12/07 02:25 ID:5aqMPCZX
2ch系スクリプトのトリップ作成関数のとこ見ても意味がさっぱり解りません cryptを使うとこまではわかったんだけど全くの初心者なもんで。。。 誰か1から教えて下さい。よろしくお願いします
氏ね
>>389 if($tripkey){
$salt = substr($key."H.", 1, 2);
$salt =~ s/[^\.-z]/\./go;
$salt =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/;
$trip = substr(crypt($key, $salt),-8);
$name .= "◆".$trip;
}
後は適当に
初心者スレでわざわざ「初心者です」と言うこともないだろう。 かえって反感買うぞ。 見返りも無く赤の他人に1から教えようというヒマな人はめったにいない。 分からないなりに実践してみて、その上でどこが分からなかったのか具体的に 書いてくれれば、一緒に考えてみてもいいと考えている人はけっこういる。 ちょっとは過去レスも読んでみれ。具体的なソースを出した質問には、よってたかって ソースを最適化してたりする。みんな答えを考えること自体は面倒じゃないんだよ。
>>394 初めて書くなら入りやすいってことだろ
どっちにしてもスレ違いだから
396 :
386 :03/12/07 04:24 ID:???
どこから覚えていいかわからず抽象的な質問してスミマセン
cryptとsaltの意味まではわかりました
あとは具体的な質問が出来る位まで自分なりに勉強してみます
>>392 ありがとうございます。参考にさせて頂きます
>>390-391 絶対やってみせるからな
また来るよ!!ヽ(`Д´)ノ
>396 なんか若いな。 うちの若手社員にもこういう意気込みがほしいのお。 ちょっとしかるとすぐしょげるからな。あいつらは
最初はみんな解らんことだらけだ 君も勉強してチョットはperl弄れるようになったら、 ここで叩かれた意味もよーく解ると思う。 がんばれ。見返してやれ
質問! 変数と変数をくっ付けて新たな変数名にしるってことを考えて松 for (my $i=0;$i<11;$i++){ for (my $j=0;$j<10;$j++){ ${"data$i"} .= "$i$j" . '/'; } } これでうまくいき松 print "$data0\n"; としると、希望どおり「00/01/02/03/04/05/06/07/08/09/」が表示され松 が、use strictをしると,$data0がグローバルだといわれ松 でもってmy $data0;ってしても「Can't use string ("data0") as a SCALAR ref while "strict refs"」っていわれ行き詰まりますた 漏れの前に立ちふさがっているこの大きな壁を誰かぶち破ってくさい
402 :
nobodyさん :03/12/07 07:06 ID:7k6pnaM4
2chのように半角カタカナが使える掲示板を設置するにはどうすればいいでしょうか?
404 :
400 :03/12/07 09:14 ID:???
>>401 あれはあくまで例文なので、配列を使わない方向でやってみたいのです
406 :
nobodyさん :03/12/07 11:32 ID:gfqXEEBE
質問させてください。 JavaScriptから得た値をCGIに取り込みたいのですが、 例えば <script language="JavaScript"><!-- document.write( navigator.appCodeName); document.write( navigator.platform); // --></script> ↑のJavaScriptで得た「navigator.appCodeName」と「navigator.platform」 の値をPerlでtxtファイルに書き込むようにするにはどうしたらよいですか?
**************秒 を (**世紀)**年**日**時間**分**秒 というふうに変換したいのですがどのようにやると効率がいいのでしょうか?
410 :
nobodyさん :03/12/07 14:03 ID:YpZVNXgY
質問です。 隠しカウンターを埋め込みたいのですが、 <input type=hidden>を使ってcgiを動作させるためには どうしたらよいのですか? (フレームを埋め込まない形式のものとします。)
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
どうにかしてヒアドキュメンドの中でコメントを使う方法はありませんか?
ドキュメン「ド」ですか。 HTMLなら<!-- -->使いなさい。
ヒアドキュメントを使わない。
PODならヒアドキュメント内でも効果あるんかな
417 :
416 :03/12/07 16:54 ID:???
んなこたぁないか。sage
>>413 こんな感じでどうよ?
| 前半の正規表現は # から始まってる行を改行込みで削除するために入れてる。
空行が残ってもいいなら ($hoge = <<EOF)=~s/#.*//g; で OK。
($hoge = <<EOF)=~s/^#.*\r?\n|#.*//mg;
abcdef #hoge
#hoge
ghijkl
EOF
print $hoge;
419 :
nobodyさん :03/12/07 18:42 ID:P5pNf3iB
フォームからの送信データを、そのままファイルに書き込むとUTF-8に なり、そのデータをローカルに持ってきてJcode.pmでEUCに変換すること はできるのですが、送信データを受け取るCGIスクリプト内でUTF-8から EUCに変換するコードを加えるとファイルに保存されたデータが文字化け してしまいます。 どういった原因が考えられるでしょうか?
>>419 間違ってるからしかないだろ
そのコード晒して聞けよ
晒すっても $hoge=$formdata を $hoge=Jcode->new($formdata)->euc にしてるだけ
>421 前後がなければわからないよ。 ファイルに保存する前に文字化けしているのは確かなんだろうけど だとしたらどこかの処理でそれが行なわれているはず。 その辺のソースが全くないじゃないか。 こまめにprintしてどこで文字化けしてるか確認するとかしたのか?
>>418 スッゲー!出来ました!正規表現でエスケープするとよいのですね。
長年の夢が実現しますた。後、ヒアドキュメント内で関数を使用する場合は、
ヒアドキュメントの外で戻り値を変数に格納して、ヒアドキュメント内で展開
する、という方法がBESTなのでしょうか?
$aaa = &sub_aaa;
($hoge = <<EOF)=~s/^#.*\r?\n|#.*//mg;
abcdef #hoge
#hoge
$aaa
ghijkl
EOF
print $hoge;
な感じです。
>>409 引数が大きいとちゃんと動いてくれないようです。
localtimeを使わないでやるにはどうやればいいですかね…。
なかなかうまい方法が思いつかないので…。
>>425 >引数が大きいとちゃんと動いてくれないようです。
どんなコード書いて、どんな値入れたの?
2038年が限界?
>>426 $time = 1000000000;
($sec, $min, $hour, $mday, $mon, $year) = localtime($time);
$year -= 70;
--$mday;
$hour -= 9;
print "$year年$monヶ月$mday日$hour時間$min分$sec秒";
こんな感じです
>>428 $year -= 70;
--$mday;
$hour -= 9;
この不思議コードはなんだ?
標準出力する方法を伝授する。 print STDOUT "hoge\n";
>>431 誤差が出るって、2038年を超える値はlocaltimeでは正しく得られないが。
>>428 の$timeで言うとおおよそ2139******以上かな。
さっきみたいな不思議コードでどうこうできるものじゃないぞ。
>>432 スンマセン。説明が足りなかったみたいですね
自分は今の時間の値を得るとかそういうのじゃなくて
>>408 で言ってるように単純に
**************秒 を(**世紀)**年**日**時間**分**秒
というふうに変換したいだけなんです。
たとえば、1000秒なら0年0ヶ月0日0時間16分40秒というように。
紛らわしくてスマソ。
で、単にlocaltimeに秒数をぶっこむだけでは例のようになってくれないので
不思議コードで調整をしてたわけです。
434 :
nobodyさん :03/12/08 00:21 ID:kLlTEKlc
質問させてください。 カウンターとか表示させる時、 <img src="counter.cgi?order=1">とかにしたら、 スクリプト内でどうすりゃいいのですか?
>>434 ちょっとでいいからぐぐれ。お願いだから・・
>>433 ……不思議なバカな感じ。
時差が出るのは、localtimeが鯖に設定してある時間帯見て時間決めてるからだろ?
・$ENV{TIME_ZONE}いじって時差を修正するか、
・localtimeのかわりにgmtime使ってグリニッジ標準時刻を得てそれを加工するかしろよ。
それと、yearの数値は、1900を足すと西暦になる数字だろ?
で、ここからが非常に重要な質問なんだが、
オマエは月や年の定義をどう考えてるんだ?
localtimeやgmtimeで得られる数値は、全て修正されたグレゴリオ暦による日付だろ?
だから、うるう年のややこしいルールとかもあるから、
秒数を単純に変換しただけでは正しくない可能性があるだろ?
もう、単純に力技で計算したら?
$t = time
$t を 60*60*24*30*12*100 で割って世紀にする。端数を$tに代入。
$t を 60*60*24*30*12 で割って年にする。端数を$tに代入。
(以下省略)
まあ、逆にしてもいいだろうけどさ。
まったく、
>>436 が得意気に糞知識をばら撒きだしたじゃないか!
441 :
434 :03/12/08 00:52 ID:???
>>435 いえ、ぐぐったんですけど、わからなかったです・・・
まぁ単に
>>433 が算数苦手な上に各単位の定義を
はっきりさせていないだけなんだが。
my($time, @x, @time) = ($ARGV[0], 1);
unshift @x, $_ * $x[0] for 60,60,24,30,12,100;
for (@x) {
my $num = int($time / $_);
push @time, $num;
$time -= $num * $_;
}
printf '(%d)世紀%d年%dヶ月%d日%d時間%d分%d秒', @time;
じゃあ
>>442 と対照的に四則演算を並べ立てたやり方で
$time = 3153686400;
$sec = $time % 60;
$time2 = ($time - $sec) / 60;
$min = $time2 % 60;
$time3 = ($time2 - $min) / 60;
$hour = $time3 % 24;
$time4 = ($time3 - $hour) /24;
$day = $time4 % 365;
$time5 = ($time4 - $day) / 365;
$year = $time5 % 100;
$sen = ($time5 - $year) / 100;
print "(".$sen."世紀)".$year."年".$day."日".$hour."時間".$min."分".$sec."秒";
先輩!うるう年が考慮されていませんぞ!なんてね。
ごめんなさい。既出でした。
447 :
nobodyさん :03/12/08 01:47 ID:oHyCVQZy
すいません、ファイルをアップロードできません。 OS … WindowsXP 鯖 … Apache 1.3.29(ローカル鯖) CGI … perl 5 <<スクリプト>> #--ブラウザ(IE6)からinputタグで画像のパスを送信。 #--クライアント側の画像のパスを取得。 #--パスの「\」を「/」に変換、「+」は「 」に変換。 #--$getpic=クライアント側の画像パス open (IMAGE,">image.jpg"); print IMAGE $getpic; close (IMAGE); ファイルをアップロードしようとすると、71Byteだけ保存されて終わります。 当然は見られません。(毎回71Byteぴったり) 拡張子も合ってます。 サーバーのエラーログには何も記録されていませんでした。 ググったり、画像アップロード掲示板のソースを参考にしてもみたのですが、 皆このやりかたでアップロードしています。 何がいけないのでしょうか。 よろしくお願いします。
$hoge = ($foo <=> $bar); ↑これはどういう意味ですか?fooとbarを比較して どっちかを代入してるのはなんとなくわかるんですが 大きい方を入れるのかなと憶測してるんですがあってますでしょうか? 正直こういうのはぐぐれないんで痛いです・・。
演算子だとわかるんだからリファレンス見れ。 if ($xx <=> $yy) # 比較結果を -1, 0, 1 のいずれかで返す
あ、どっちかを代入してるんじゃなくて、比較結果なんですね。 すいません、有難うございました。
1年が360日になってしまってる時点でかなりおかしいと思うが。
$ENV{TIME_ZONE}
>>453 いや、どう考えてもオカシイ。
>>436 地球の公転ってのは 365 日って言われてるけど、実際には 365 と 1/4 日なのね。
ただ、実際に生活していく上で、毎年毎年 1/4 日も時間が狂ったら困るから、
1/4 * 4 で四年に一度だけ一年が 366 日になる、うるう年が作られたんだけど、
この考え方はグレゴリオ暦の考え方なのよ。
// 他に同じようにうるう年を導入した暦があったかもしれんが、俺は知らん。
君の言うように localtime や gmtime はグレゴリオ暦に従ってるわけだが、
そうであるが故に localtime や gmtime が提供する値は「正しい」。
まぁそれは本質的な問題じゃないのでこの際置いといて。
>>433 よ。ちみは具体的にどうなって欲しいのよ。
こういうデータを localtime や gmtime に突っ込んだらこういう結果が出ました。
自分が望んでいる結果はこのデータだとこうです、って例示してくれんと
アスタリスクだけじゃ答えてる香具師もどうしたら良いのか分からんよ。
正確には97/400日だっけ?
458 :
nobodyさん :03/12/08 12:23 ID:GM+CQ6+7
365.2422日って以前読んだ記憶がある。 1/4にちょっと満たない ので100年に1度もう一度修正する で、400年にいちどまた修正すると
先週オレがつまづいたせいで少し回転が早くなっているだろうがキニスルナ
(´゚c_,゚` ) プッ
すみません。自分のやりたいことは
>>442-443 の通りでした。
ありがとうございました。
しかし、
>>442 は難しくてどういうふうに動いてるのかよく分からないなぁ…。
phpならunixtimeを一発でyyyy/mm/dd(w) mm:hh:ssに変換できるのだが。
perlだってunixtimeから一発で変換できるだろ(localtime)。
ただ
>>408 は1970年1月1日0時0分からのunixtimeじゃなくて
西暦0年1月1日0時0分からの秒数を変換したいんだろうな。
しかし
>>433 で言ってるような○ヶ月という表現は難しいんじゃないのか?
たとえば1月1日から2月1日は一ヶ月であり、31日だが、
2月1日から3月1日はやはり一ヶ月だが、29または30日だから、
この辺を考慮しようものならすさまじく複雑になると思う。
465 :
464 :03/12/08 21:41 ID:???
ん、西暦0年は存在しないか。
>>463-465 終わった話を蒸し返すなよ。しかも勘違いしてるし。
経過時間じゃなくて秒を上の単位に変換したいってことだろ。
(^Д^)
468 :
nobodyさん :03/12/09 00:17 ID:i1j5vGrf
open(STDOUT, "| tee ${sname}.html") || &errorpage("teeのバグ"); open(STDOUT, "| tee ${bname}.html") || &errorpage("teeのバグ"); print "Content-type:text/html\n\n"; ・ ・ (&errorpage()はまんまエラーページ表示のやつで、$sname・$bnameは名前の文字列っす) でCGIプログラムエラーが起きてしまいます・・・ 問題箇所は間違いなくココなんすけど。 教えてくださいッ!!
469 :
468 :03/12/09 00:30 ID:???
あ、1を忘れていた・・・ このCGI内で表示したものと同様の内容を、 ${sname}.htmlと${bname}.htmlの両方に書き出したいのです。
>>470 もっとさっさと答えろ。わざわざマルチしてやってるのによ
473 :
468 :03/12/09 12:02 ID:???
500エラーにきまってるだろ
474 :
468 :03/12/09 12:45 ID:???
CGI1エラーに決まってるだろ。 内容はてめぇで考えろ
475 :
nobodyさん :03/12/09 13:03 ID:b0uD2YDo
476 :
nobodyさん :03/12/09 14:23 ID:JkIM3Ehk
すいません、 このタグでcぎに画像を転送しようとしても、 Cgiファイルのダウンロードになってしまうのですがなぜでしょう? PCがIEが壊れたのでしょうか? <form method="POST" action="./pictup.cgi"> <input type="text" name="aa"> <input type="file" name="pifi"> <input type="submit" value="GO"> </form>
Perl に関係ない話はヨソで。 Content-Type について調べてみれ。
478 :
nobodyさん :03/12/09 14:33 ID:JkIM3Ehk
480 :
468 :03/12/10 00:34 ID:???
>>470 あー、$!という手がありましたか・・・
試みてみます!
>>456 > 地球の公転ってのは 365 日って言われてるけど、実際には 365 と 1/4 日なのね。
> ただ、実際に生活していく上で、毎年毎年 1/4 日も時間が狂ったら困るから、
> 1/4 * 4 で四年に一度だけ一年が 366 日になる、うるう年が作られたんだけど、
> この考え方はグレゴリオ暦の考え方なのよ。
> // 他に同じようにうるう年を導入した暦があったかもしれんが、俺は知らん。
をいをい。「4年に1回が閏年」というのは、グレゴリオ暦の前に使われていた
ユリウス暦の話なの。ユリウス暦が数百年に渡って使われた結果、日がずれている
という問題が生じたから、グレゴリオ暦が作られたの。グレゴリオ暦は、
400で割り切れる年は閏年である。
それ以外の100で割り切れる年は閏年ではない。
それ以外の4で割り切れる年は閏年である。
というものなの。
>>481 分かってるけど、うるう年自体はグレゴリオ暦で許容されてるだろ?
>>436 > だから、うるう年のややこしいルールとかもあるから、
って言ってるから、そこにだけ反応したんだが。
484 :
nobodyさん :03/12/10 13:15 ID:/scbZ0TM
>>482 そんな時代もあったのか。
避けて通ることを考えたくなるな。
デロリアンの中の人も大変だな。
昔にさかのぼる場合、グレゴリオ暦切り替えの時期も 問題になるけどな。 昔のカレンダー表示できるソフトで 1582年10月や1752年9月を表示させてみるといい
デロリアンって、昔のSF作品に出てくる すごいハイテク車の名前ですよね? 「だめですマイケル!距離が足りません!」 とかなんとかしゃべるやつ。たしかマイケル・ J・フォックスが出てたからこれで間違いないと 思うんですけど・・・。
やあドク、スレの調子はどうだい?
>>488 デロリアンはback to the futureに出てくるタイムマシンで、「マイケル...」と話すのはナイト2000。
print FH <<__EOF__; <html> <head> <title>hogehoge</title> </head> <body> __EOF__ ということをしたいのですが、 print FH "…"; で一行づつ書いてくしかないのですか?
すみません、ヒアドキュメントでできました。
俺だよ、俺?
まさと?
そうそう、俺だよ
P e r l だ け は カ ゙チ
perlの質問です。俺おれ詐欺の書き方教えて下さい if (!$money) { &oreore; } exit; sub oreore { while($baachan ne "hurikomi") { print "俺だよ俺"; } } この辺まで考えたんですけどなんかこうパンチがないってゆうか、 もうちょっとインパクトが欲しいんです
$ore = 500000;
501 :
nobodyさん :03/12/11 01:50 ID:axDB0KAJ
>>499 × if (!$money) { &oreore; }
○ if($money > 500000){ &oreore }
一割よこせよw
ふと思ったんですがサブルーチンの外にある変数って my宣言する意味あるんでしょうか。
>>502 use strict;
my $key = 'fuga';
{
my $key = 'hoge';
my %hash = (foo => 1, bar => 2, baz => 3);
while (my($key, $value) = each %hash) { print "$key:$value\n" }
print "$key\n";
}
print "$key\n";
いえなんていうか外側の変数って事実上のグローバル変数では無いですか。 バージョン情報とか設定情報とか。 なのでstrictモジュールを通す以外に特に意味があるのかなと。
>>505 ちょっとコード書いてみて試してごらん。
どのようなコードが良いでしょうか。 >503のような物でも fuga が代入されている $key は my 宣言しなくても 結果は同じですよね。 #当然 use strict は外さないと駄目ですが あと、例えばそこらに落ちてる掲示板とかには $version = '1.05'; # 開発バージョン $locktype = '0'; # 0 = flock, 1 = rename みたいな とか言う変数が与えられてたりしますが、 こういうのって他のブロック内で同名の変数が作られる事が無いって解るようなものですよね。 例え作られるにしてもブロック内の変数のみ my 宣言していれば良いし。 と言う経緯があって、use strict の為以外に外側の変数を my 宣言する意味って 何かあるのかな? と思った次第であります。
>507 お前はタイプミスしないのか?
グローバル変数ってパッケージ名を修飾するもんじゃないの? $main::hoge (または $::hoge)みたいに。 んで、他のパッケージから呼び出すこともできる。 myはそのパッケージ限定で、他からは呼び出せない。
掲示板でトリップ機能をつけようとしてるんですが、 名前の中に"◆"があった時に"◇"に変える処理を $FORM{'name'} = s/◆/◇/g; としたのですが、名前の中に"あー"という文字列があるとそこにもマッチしてしまいます。 文字コードはEUCです。 回避索はないでしょうか。
じゃあEUCを使わなければいいだろ
512 :
nobodyさん :03/12/11 17:07 ID:7rVUcdTM
お邪魔します。 今週になって初めてPerlとjavaスクリプトに取り組んでいるんですが、 PerlでURLエンコードして書き出したcookieを javaScriptのunescape()でデコードしても文字化けしてしまい、うまくデコードできません。 【1.Perl側でのURLエンコード】 $value = 'テスト太郎'; $value =~ s/([^0-9A-Za-z_])/"%" . unpack("H2",$1)/ge; 【2.吐き出された結果】 %83e%83X%83g%91%be%98Y 【3.上をunescape()で囲んで得られた結果】 ?e?X?g???Y java側でのcookie読み込み抜き出しでバイトズレとかはないです。 unescape()する前の値をテスト表示とかさせて、その時点ではちゃんと3の内容が入っていました。 もうこれでかれこれ三日悩んでます。 諸先生方、アドバイスのほどをよろしくお願いいたします。
>>512 JavaScriptのunescapeはブラウザ依存。escapeも同様。
ネスケならescapeでテスト太郎が%83e%83X%83g%91%be%98Yになるが、
IEのescapeでは%u30C6%u30B9%u30C8%u592A%u90CEになる。
だからunescapeもネスケなら正しく戻るがIEではダメ。
自前のunescapeを書けばいい。
補足 >正しく戻るが perlでエンコードしたもののことね
>JavascriptをJavaと略すのは止めて下さい。 (´゚c_,゚` ) プッ まだこんな自治房いたのか
べつにあんたのためじゃないと思うが?
518 :
nobodyさん :03/12/11 17:55 ID:T5LU5YVt
お年頃ってやつだろう
>>515 それ面白いな。2ch2を2chに偽装するとか、、、あまりパッとしたのが思いつかないけど。
>>520 いや、オレオレ、オレだよ
>>521 ふつうにクレカの番号とか入れさせるんだろ
カード決済のアドとか偽装して
おまいらPerlコーディングスレッドですよ。
>>523 さっきペヤング喰ったんだが、プラケースに熱湯を入れても熱くないなと思ったら、
容器が二重になってたんだよ。
それだけ。
>>513 ありがとうございました。
ためしにネスケでやったらうまくいきました。
原因はわかりましたが、解決方法がまだよく飲み込めてないので、これからまたじっくり腰すえてがんばります。
>>515 気をつけようと思っていたのですが、ついうっかりそう書いてしまいました。
申し訳ありませんでした。
>>524 私の場合は、ペヤングじゃないですが、フタが2重にはりついてたときがありました。
ちょうどフタを集めて懸賞に応募できる時期で、一個買わずに得したと思った記憶があります。
>>515 興味津々で本当は行ってみたくてしょうがないのに
行く度胸が無いのと病気が恐いのとで行けないヤシが、
実際にソプで楽しんでる人間に対して「憎悪」を抱いてるんだろう・・・
まぁ要するに「嫉妬」でしかないわけだが、「オレは正しいことをしてるんだ」と正当化してるんだな。
ああ、ああだこうだとルサンチマン語る奴が一番重症だな。
ちょっと質問なんだけど 例えば変数 $test = "/aaaaa/bbbbb/ccccc/ddddd/eeeee/"; があるとしてここから最後の「eeeee/」これだけを取り除きたいんだけど何かいい方法ないですか? 取り除いたあとは $test = "/aaaaa/bbbbb/ccccc/ddddd/"; こうなる予定なんだけど・・・ 今のところ @temp = split(/\//,$test); $test =~ s/$temp[-2]\///g; こんな感じのをやってみたんだけど、これだと途中に同じ文字列(eeeee/)が含まれてるとそれまで消えちまう あくまで最後の文字列だけを取り除きたいんだけど 誰かご教授お願いします
>528 $
$test =~ s|\w+/$||;
532 :
528 :03/12/11 21:06 ID:???
>>529-530 即レスサンクス
しかし531のいう通りさっぱわからん(´・ω・`)
そんなわけで適当に検索してきまつ
パターンマッチはどうも苦手だ(;´Д`)
>>530 より
$test =~ s|[^/]+/$||;
の方がいい。
534 :
nobodyさん :03/12/12 07:41 ID:oOX796Ak
70文字で改行させるようなことってどうしたらいいんでしょう? 140バイトで改行にしたら化けまくり。どうも2倍と文字のバイト目で 改行されてるみたいです。 日本語と英語混じってるとどうやって判定していいやら・・・
537 :
534 :03/12/12 15:19 ID:???
なるほど。こんな方法があるんですね。 これを利用してみます。ありがとうございました。
538 :
nobodyさん :03/12/12 17:32 ID:HHKbpfwW
時間取得の仕方が良くわかりません。 下のようにやってもうまくいかず(isweb,ローカルhttpd+activeperl共に)こまっています # タイムゾーン設定 $ENV{'TZ'} = "JST-9"; # 時間を取得 local($min,$hour,$mday,$mon,$year,$wday) = (localtime($time))[1..6]; @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $year+1900,$mon+1,$mday,$w[$wday],$hour,$min); で取得しても必ず1970/01/01(Thu) 09:00になってしまいます。 他に記述するべきことがあるのでしょうか?
539 :
nobodyさん :03/12/12 17:43 ID:HHKbpfwW
ちなみに$dateで呼び出してます。
一番大切な$time = time();を忘れました・・・ご迷惑をおかけしました。
>>540 もっと餅付いてみましょうね。
♪何事も慌てることはないはず。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
547 :
nobodyさん :03/12/14 02:46 ID:SP0sm32T
パンチ5分の2がわかりません 誰か1から教えてくれる人はいませんか? 特に693の人は教えろ!!
あぼーん
$$alias = $HOGE{$alias}; return($$alias); ってコードをみかけたんですが、 $$aliasって、どういう使い方なんでしょうか? たんに「$$」ならプロセス番号ってことは、知ってるんですが。。。
>>549 変数をデリファレンスする時に使う。
例
$a = 'test';
$s_ref = \$a;
print $$s_ref, "\n";
あぼーん
あぼーん
よく3つの要素を比較して被っていたらエラールーチンへ ・・・みたいな分岐をしたいときがあるのですが、 例えば@listに3つの値が入っているとして if (($list[0] eq $list[1]) || ($list[0] eq $list[2]) || ($list[1] eq $list[2])) { &error("被ってまっせ"); } これで動くとは思いますけが、もうちょっと楽にっていうかきれいに書けませんでしょうか?
>>553 3つぐらいならそれが一番素直だと思う。ちなみにカッコは要らん。
if($list[0] eq $list[1] || $list[0] eq $list[2] || $list[1] eq $list[2]) { error() }
$list[0] eq $list[1] || $list[0] eq $list[2] || $list[1] eq $list[2]
and error();
無理にまとめず並べた方が分かりやすい場合もある。
$list[0] eq $list[1] and error();
$list[0] eq $list[2] and error();
$list[1] eq $list[2] and error();
数がもっと多いならこういうやり方も。
$y - $x + 1 == keys %{{ map { $list[$_], 1 } $x..$y }} or error();
掲示板のCGIプログラム(perlで書いてある)を某サイトから頂戴して して利用してるんですが、ブラウザがIEだとエンターキーを押すだけで 記入内容が送信されてしまい、記入途中での誤送信が頻発しています。 エンターキーの押下では送信できないようにする方法を教えてください。
%check= (); scalar(grep($check{$_}++, @list)) and &error();
sub has_dup (\@) { my %x; my $arr = shift; @x{@$arr} = (); keys %x != @$arr; } if (has_dup(@list)) { &error("被ってまっせ"); }
>>555 擦れ違い。JavaScriptでも使ってみては?
my %hash; @hash{@list} = 0; (scalar keys %hash < scalar @list) and &error();
>555 submitボタンを2つ用意する Perlのコーディングの問題じゃないからヒントはここまで CGIスレで聞いて
562 :
553 :03/12/14 16:47 ID:???
みなさん有難うございます。参考にさせていただきます。
563 :
549 :03/12/14 18:00 ID:???
564 :
555 :03/12/15 08:02 ID:???
どうも。
ちょっと失礼します。 cgiとしてブラウザで表示するときに、クエリが何もない場合(ex.cgi)でアクセスしたら「あ」 クエリがiの場合(ex.cgi?i)でアクセスしたら「い」と表示をさせるスクリプトはどのように書くのがいいのでしょうか? ヘッダ等略 print("あ"); if(${'QUERY_STRING'} eq 'i'){print("い");} なんてするとクエリがiのときには「あい」ってなっちゃいますよね? それで、現在は if(${'QUERY_STRING'} eq ''){print("あ");} elsif(${'QUERY_STRING'} eq 'i'){print("い");} なんてやってるんですがこんなことしてる人いませんよね? みなさんどうやってるんでしょうか? よろしくお願いします。
perlって大変なんだなあ。
567 :
nobodyさん :03/12/15 09:56 ID:87xH8KUy
if(${'QUERY_STRING'} eq '')[{print("あ");}elsif{print("い");}] これですむだろうが、カスが!!おまえは板違いなんだよ!死ね!! もう、二度と来るなよ!!
あぼーん
あぼーん
570 :
nobodyさん :03/12/15 10:00 ID:87xH8KUy
誰だか知らないけど、やめてください パンチ5分の2と、キック2分の1のPerlの作り方を知って いる人はいないでしょうか?いたらお願いします。
あぼーん
あぼーん
$_ = "hoge<>foo<>bar<>hage<>hige<>wakige<>chinge"; このとき、1個目と7個目を繋げた文字列を$strに代入したいとき、 ($temp1,$temp2) = (split(/<>/,$_))[0,6]; $str = $temp1.$temp2; とすると可能なのですが、もっと簡単に、つまり splitからの返り値にそれぞれの変数や配列を代入するのじゃなく 追加で代入?できませんでしょうか
>>573 $str = join '', (split /<>/, $_)[0,6];
>>574 レス有難うございます。だいぶすっきりしました。これでいかせてもらいます。
あぼーん
splitで、多次元配列に代入する場合はどうすればいいか教えてください
1: 自分はこう言う事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。 最低でも1と3が無いと誰も答えられないよ。
579 :
577 :03/12/15 20:33 ID:???
すいません。 1.1行に複数個あり、それが複数行あるファイルデータを1つの配列に格納したい。 (ファイルデータの例) 1<>2<>3<>4<>5 11<>22<>33<>44<>55 こういうデータがあるとします。 それを、@data[0] = (1,2,3,4,5) @data[1] = (11,22,33,44,55) になるようにしたいんです。 $i=0; open(DATA, "data.txt"); @all = <DATA>; foreach(@all){ @data{$i} = split(/<>/,$_); $i++ } とやってみたのですが、うまく配列に代入できません。。。 ご教授お願いします。
580 :
577 :03/12/15 20:35 ID:???
追加 @data{$i} = split(/<>/,$_); これは、@data[{$i}],(@data[{$i}])等やってみたのですが、うまくいかなくて・・・
581 :
577 :03/12/15 20:47 ID:???
@data[0] = (1,2,3,4,5) @data[1] = (11,22,33,44,55) すいません。よく考えたらこれもありえないですね。。。 $data[0][0] > 1 $data[0][1] > 2 $data[0][2] > 3 $data[0][3] > 4 $data[0][4] > 5 $data[1][0] > 11 $data[1][1] > 22 $data[1][2] > 33 $data[1][3] > 44 $data[1][4] > 55 こうでした。 何度もすいません。
582 :
577 :03/12/15 20:58 ID:???
いろいろ自分で試したところ foreach(@data){ @temp = split(/<>/,$_); for($s=0; $s<$#temp; $s++){ $stat[$i][$s] = $temp[$s]; } } こうすればできました。 これをスマートに(tempを介さないで)できないでしょうか? いろいろ書き込みしてすいません。
583 :
577 :03/12/15 20:58 ID:???
$i=0; foreach(@data){ @temp = split(/<>/,$_); for($s=0; $s<$#temp; $s++){ $stat[$i][$s] = $temp[$s]; } $i++; } こうでした。ほんますいません_| ̄|○
>577 foreach(@all){ $data[$i] = [ split(/<>/,$_) ]; $i++ } こうすれば$i不要。 foreach(@all){ push @data, [ split(/<>/,$_) ]; }
586 :
577 :03/12/15 22:29 ID:???
英語なんか読めるかっつーの
>>585 のどこが英語サイトなんだ?
586は偽者か?
588 :
577 :03/12/15 23:05 ID:???
直訳したサイトきらい。 つーか意訳できんのならするなと
>>588 技術文書を意訳する必要がどこにあるのかと。
おまえのごく個人的な好き嫌いを表明する必要もないぞ。
590 :
577 :03/12/16 00:16 ID:???
>技術文書を意訳する必要がどこにあるのかと。 ネタか?
次の方どうぞ
592 :
nobodyさん :03/12/16 00:32 ID:7IuKYSUw
1: パンチ5分の2と、キック2分の1をしたい 2: CGIにのせてみたが動かなかった 3: インターネットエラー
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
簡単なカウンタを作っている(コピペしてる)んですけど #!/usr/local/bin/perl require "gifcat.pl"; $cnt_file = "count\.dat"; open(CFILE,"$cnt_file"); $count = <CFILE>; close(CFILE); $count++; open(CFILE,">$cnt_file"); print CFILE $count; close(CFILE); $fig = 6; while (length($count) < $fig) { $count = '0' . $count; } $length = length($count); foreach (0 .. $length-1) { $n = substr($count,$_,1); push(@GIF, "$n\.gif"); } print "Content-type: image/gif\n\n"; binmode(STDOUT); print &gifcat'gifcat(@GIF); exit; これ、自サバ(Win)では動いたんですが、HPにUPして実行しても 「GIF89aZ」とわけのわからない文字が表示されます。なぜですか?
>>598 どこのサーバを使ってるのかという情報が書かれてないけど、
たぶん広告の自動挿入が原因。
どうすればいいのかはサーバのサポートページを自分で調べて。
AAACafeあたりだろ。超FAQだ。
601 :
558 :03/12/17 12:22 ID:???
>>599 広告が表示されないようにしたらちゃんと表示されました!
ありがとうございます。
>>600 xreaです。
あぼーん
あぼーん
あぼーん
605 :
nobodyさん :03/12/17 15:56 ID:j4zMUCkL
パンチ5分の2の動かし方がわかりません。誰か教えてください
あぼーん
あぼーん
あぼーん
おいおい、アク禁にされるぞ
610 :
nobodyさん :03/12/17 20:56 ID:Kabr7znc
チャット用のアクセス制限CGIで、 最初にログインする時は、 print "[<a href=\"$ipkill?retime=$in{'retime'}&line=$in{'line'}&root=$in{'pas'}\" target=log>アクセス制限</a>]\n"; で問題なく入れるのですが アクセス制限IPを追加してリロードした時に print "<form action=\"$ipkill?retime=$in{'retime'}&line=$in{'line'}&$in{'pas'}\" method=$method>\n"; だとパスワードが渡せてないらしく、エラーが起こります。 同じファイルに値を渡すときはこれでは無理なんでしょうか? 分かりづらくてすいません。
>>610 板違い。
Perlよりも先にHTMLの勉強をしてくれ。HTML リファレンスでググってみ。
そうすれば自然に自分のどこがまずかったのかわかるから。
>>610 root=$in{'pas'} がなぜか root= が抜けてるから?
615 :
610 :03/12/18 07:21 ID:2yKZUvIa
>>611 ありがとうございます。さっそく調べてきます。
616 :
nobodyさん :03/12/18 12:23 ID:hkTBELl/
あるhtmlから、タグの内容を抽出したいのですが、 正規表現が間違っているようでうまくいきません。 正規表現にマッチした箇所をすべて配列に代入したいのですが。 $testの中身 <li>hoge1</li> <li>hoge2</li> <li>hoge3</li> <li>hoge4</li> perlのコード @hoge = ($test = /<li>/ .. /<\/li>/); だと@hogeに何も代入されないのです。
=じゃなくて=~
というか、 /<li>/ .. /<\/li>/ これ何だ?
619 :
nobodyさん :03/12/18 13:00 ID:v15Wnfrq
>>617 それでもダメでした。
>>618 オライリーの本に載っていたのですが、
左辺と右辺の範囲をマッチを判定する範囲演算子だそうです。
>>616 @hoge = $test =~ m|<li>(.*?)</li>|g;
範囲演算子の使い方を思いっきり勘違いしてるようだから
もう一度読んで理解し直した方がいいよ。
/<li>/ .. /<\/li>/ やばい猫あ睨んでるように見えてきた・・・ってかなんやコレ
猫が
623 :
nobodyさん :03/12/18 15:04 ID:abcaX48o
>>620 助かりました。ありがとうございます。
こんなことで2日以上なやみました。
ラクダ本もいっかい読んで勉強しなおします。
あぼーん
FWPモジュールを使ってgetでファイルの内容を取得するプログラムを作ったけど、getの内容を$でやったらアクセスが出来ませんでした。 get($abc); $abcがURLです。もしかして変数だとアクセス出来ないのかな?
あぼーん
あぼーん
あぼーん
あぼーん
もうすぐ年が明けるね
あぼーん
632 :
nobodyさん :03/12/18 18:12 ID:Elgjx4Ia
来年の目標 1、ここの常連をころそう 2、新しく来たやさしい人にパンチ5分の2を学ぼう さて、来年もよろしくな!!
成長できなかったんだね
>625 LWPか? 変数でもできるが。 こういう時の基本は、まずちゃんと変数の中身が入っているかprintしてみる事だ。
>>634 確認は出来ました。変数なしの絶対パスだとアクセス出来るけど、同じ内容を変数にするとアクセスが出来なくてprintしてもURLが確認出来ません。
変数でもアクセスが出来る事がわかっただけでも助かりました。もう一度試してみます。
ニュー速からきました。 殺人予告現場はここですか?
>635 >printしてもURLが確認出来ません。 変数の中身がないって事? それじゃあ取得できるわけないじゃない。 その前後のソースを見せてくれなきゃ。
638 :
nobodyさん :03/12/18 19:42 ID:W179xBgA
and と && ってどう違うのでしょうか? たとえば $A < 3 and $B = 5; ではエラーが出ないのに $A < 3 && $B = 5; だとエラーが出るとか、 $A < 3 && ($A = 5); 括弧で括ると大丈夫だったり $A < 3 && print "a"; こういうのは問題なかったりとか もうワケワカメなのですが、この辺の解説をしてもらえないでしょうか…?
結合順位が違う
>639 優先度が違う。 >639の例なら「<」「&&」「=」「and」の順に優先度が高い。 つまり、()でくくると $A < 3 and $B = 5; ↓ (($A < 3) and ($B = 5)); と判断されるが $A < 3 && $B = 5; ↓ ((($A < 3) && $B) = 5); となってしまう為、こっちではエラーになる。 だから、明示的に()でくくればエラーが出なくなる。 詳しくは「Perl 演算子 優先順位」とかの単語で検索しる。
$B = 5; か? $B == 5; じゃないの?
>>642 最近では&&とともに使うと$B==5と同じものだとみなされる。
比較演算子はand, &&どちらよりも優先度が高いので そもそも問題にされることがありえないのでは。
>>643 どういうケースで = が == と見做されるのか教えて下さい。
Perl 5.8.2 では以下のようになりました。
my($A, $B) = (1, 3);
print $A == 1 && ($B = 5) ? "true\n" : "false\n"; # true
print $A == 1 && $B = 5 ? "true\n" : "false\n"; # compilation errors
>643が真実だとしたら逆に不便に感じるのは俺だけ?
>>641 なるほど、優先順位というものがあったのですね。
ありがdございました
649 :
nobodyさん :03/12/19 01:07 ID:A5qOMnWK
某スレから誘導されて参りますた。 海外の掲示板スクリプトで、 投稿した内容が文字化けする、って場合には どんな風にスクリプトを修正すればいいんでしょうか? たぶんjcode.pl を使うと思うんでつが、イマイチわからなのでつ
651 :
wt-l3swcx01s.skyweb.jp-c.ne.jp :03/12/19 07:56 ID:4xnhTPUj
あのさぁ、ケータイから見てるからでかいAA貼るのやめてくれる?
print "Content-type: text/html\n\n"; print "<html>\n"; print "<head><title>test</title></head>\n"; print "<body>\n"; print "<a href=\"test.wrl\">ここ</a>を"; print "クリックするとVRML画像が見れます。\n"; print "</body>"; print "</html>"; _END_ これをやると画像ではなくVRMLコードが出てきてしまいます・・・。 VRMLコード自体は正確でブラウザにそのままぶち込むとみれます。 なぜなんでしょう;;
654 :
nobodyさん :03/12/19 13:24 ID:YamKZvpp
バイトをキロバイトに簡単に変換する方法はありますか? 1,626B => 1.58KB のように。
いらっしゃーい、 Perlのコーディング で困ってる人のスレです。
>>655 お知りあい?
てか「たいがいにせいよ」って言葉久しぶりに聞いたんだが…ひょっとして同郷か?
>>654 1024で割れよ。割ったか?割ったら回線切ってもう二度とここへは来るな。
ていうか今すぐ吊ってこいやヴォケ
659 :
nobodyさん :03/12/19 15:39 ID:EwncRd+a
>>45 2行目に
open (IO,"+<$logfile");
5行目に
while (<IO>){
if ($_ =~ /<>$ip/){
@y2=split(/<>/,$_);
if ($y2[6] ne $ip){
push(@log,$_);
}else{
$y2[0] = 'All Clear (^-^)v';
$y2[5] = 'All Clear (^-^)v';
push(@log,"$y2[0]<>$y2[1]<>$y2[2]<>$y2[3]<>$y2[4]<>$y2[5]<>$y2[6]<>$y2[7]<>\n");
}
}else{
push(@log,$_);
}
}
を入れると直ります。
あぼーん
あぼーん
ちょっと思ったんだが、荒らしタン又吉コラに使えs(ry
あぼーん
あぼーん
あぼーん
>>652 perlの話じゃなくて鯖の設定の話やね。
VRML MIME その鯖の名前でググってみ。
667 :
649 :03/12/20 04:21 ID:rln982gr
>>650 なるほろ、参考になりました。
ただ、jcode.pl は使わないんですかね?
リンク先の方法だと、一時しのぎ的な感じがするんですが、
そうでもないんでしょうか?
あぼーん
(:.´.:ж:.`.:) ・・・。
sub test { print "test"; } &test; と test(); どっちで呼び出すのがいいんでしょう?
test;
&test();じゃ駄目なのか?
>>673 なるほど。。では、特に不都合がない場合は『「普通」の呼び方』の
test(); が無難ですかね。
675 :
nobodyさん :03/12/20 23:04 ID:nvaGG63Y
$table1begin$ あいうえお<tab>かきくけこ<tab>さしすせそ まみむ め<tab>がぎぐ<tab>さしす まめ<tab>がぐ<tab>しす $tableend$ と言う文字列 (上記例は、3行3列の表です。セルの中に改行もありえます。 $はそのままダラー、<tab>はタブ(\t)の意味です) があるとき、これをhtmlのテーブルタグに変換したいのですが、 どうすればいいのでしょうか? なお、行数や列数は可変ですが、 colspanやrowspanはあり得ません。 自分でいろいろやってみたのですが、 まめ<tab>がぐ<tab>しす ↓ <tr><td>がぐ</td><td>しす</td></tr> とするくらいならできるものの、 セルの中に改行がある場合の、 やりかたが思いつきません。 (逆に、これだけ分かれば、万事解決なのですが。。。) どなたか、教えていただければ幸いです。
>675 行の区切りは改行で固定じゃないの? だとしたら、>675の例では <tab>さしすせそ まみむ め<tab> ↑この部分が一つの要素なのかどうかの判断はどうやって行なうの? 保存形式から考え直す事を勧める
>>675 >>676 に同意だが敢えて「セルの中に改行もある」という仕様通り組むなら
my $table = "あいうえお\tかきくけこ\tさしすせそ\nまみむ\nめ\tがぎぐ\tさしすまめ\tがぐ\tしす";
my @cell = split /\t/, $table;
while (my @line = splice @cell, 0, 3) {
print "<tr><td>$line[0]</td><td>$line[1]</td><td>$line[2]</td></tr>\n";
}
>>675 どうせHTMLで使う分なら最初から要素内の改行を<br>にしておいていいんじゃないのかと思ったり。
それではいかんのかな?
1234005600058090 ↓ 1234兆56億5万8090 というようなことをやりたいんですが、 どうやるのがうまいんでしょうか?
$money = 1234005600058090; $money =~ s/1234005600058090/1234兆56億5万8090/;
>>680 いや、、どうもスマートな方法が分からなくて、、
効率を考えると $money == 1234005600058090 and $money= '1234兆56億5万8090';
気は確かか680
685 :
679 :03/12/21 01:17 ID:???
あ、このスレの
>>443 をちょっと変えてみたらうまくできました。
>>679 クソコードだ。もってけ。
my $num = "1234005600058090";
print &num($num);
sub num{
my $num = shift;
$num =~ s/^0+//;
my @num = ('万','億','兆','京');
my $i = 0;
while($num =~ /[0-9]{5}/){
$num =~ s/([0-9]+)([0-9]{4})($|[^0-9])/$1$num[$i]$2$3/;
$i++;
}
$num =~ s/(^|[^0-9]+)0+([^0])/$1$2/g;
return $num;
}
こんなのは?Perlメモ「数字を 3桁ごとにコンマで区切る」の応用 $num=1234005600058090; @kurai=qw(万 億 兆 京); $keta=shift @kurai; while($num =~ s/^([-+]?\d+)(\d{4})/$1$keta$2/){ $keta=shift @kurai; } $num =~ s/([^\d])0+/$1/g; print $num;
688 :
679 :03/12/21 01:32 ID:???
便乗質問させて頂きます。 「一 十 百 千 万 億 兆 京 垓 禾弟 穰 溝 澗 正 載 極 恒河沙 阿僧祇 那由他 不可思議 無量大数」 のうち、万までは10倍づつ、万以上恒河沙までは万進、恒河沙以上 無量大数までは万万進となるのですが、どうすればいいでしょうか?
>どうすればいいでしょうか? まず、なにをしたいのかを書かないとね。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
698 :
nobodyさん :03/12/21 12:35 ID:BzT608LT
本当に初歩的な質問ですみません。1.htmlの以下のような フォームで、2.cgiにAの場合えーBの場合びーと出力させた い場合、2.cgiにはどんな記述をしたら良いでしょうか? ネタじゃありません、よろしくお願いします。Perlへのパスは#!/usr/bin/perlです。 <FORM action="2.cgi"> <SELECT name="test"> <OPTION value="a">A <OPTION value="b">B </SELECT> </FORM>
>>698 「初歩的な」というより「基本的な」のような気がします。
>>5 あたりを読んで理解してみましたか?
>>509 久々覗いたので激悪阻レスで申し訳ないけど
myのスコープはパッケージじゃないっしょ。
{}で決まるレキシカルなものじゃない?
package P1;
my $test = "P1";
package P2;
print $test, "\n";#P1
package P1; my $test = "P1"; { my $test2 = "P1"; } package P2; print $test, "\n";#P1 print $test2, "\n";#なし夫
702 :
nobodyさん :03/12/21 16:03 ID:P177ftmV
ファイルを1行ずつ読み取ってデータベースに追加する処理で、 1行読み取るごとにデータベースに追加するのでは、遅すぎるので 1000行ずつ処理すれば早い聞いたのですが、1000行ずつ 処理するには、どんな方法があるのでしょうか。
>>702 そのまんま配列あたりに
1000行読み取って→DB更新
を繰り返せばいいんじゃない?
>702 while(<>) 文に対してPerl インタプリタは別に1行づつ読み取って いるわけではない。バッファに溜め込んで、1行づつ処理に渡しているだけ。 データベースの操作に時間を取られているだけだと思われ。
705 :
nobodyさん :03/12/21 18:00 ID:FyNOPbG5
Perlが計算できる数の最大値と最小値(小数第何位)を知りたいのですが、 (以前にこのスレで質問したところ、Perlコンパイル時の設定によって異なってくると聞きましたので) これらを知るためにはどうすればいいのでしょうか? Perlのスクリプトを組んで、それらを取得することはできるのでしょうか? どなたかお答え頂ければ幸いです。
706 :
675 :03/12/21 18:18 ID:???
>>676-677 さん、ありがとうございます。おっしゃる通りですね。
カラムに改行なしの場合、
>>677 さんのを試してうまくいきました。
で、Excelの表をコピーしてテキストエディタにペーストして試してみたところ、
改行があるときは、そのセルはダブルクオーテーションでくくられるようです。
(以下、その例。2行3列)
aaaiiiuuueeeooo
kkkjjj"hh
h"ggggg
もしこの形式対応させるとしたら、どうすればいいのでしょう。
Perlメモの「値に改行コードを含む CSV形式を扱う」
http://www.din.or.jp/~ohzaki/perl.htm#CSVwithCRLF が参考になるかなとも思ったのですが、
そこに載ってる説明文はわかるものの、コードのほうを見ても、ちんぷんかんぷんでして・・・
どなたかお助けねがえれば幸いです。
707 :
675 :03/12/21 18:20 ID:???
>>706 (自己レス)
すみません、タブコードをそのまま入れてしまいました。&一部記述ミスがありました。
誤:
(以下、その例。2行3列)
aaaiiiuuueeeooo
kkkjjj"hh
h"ggggg
正:
(以下、その例。2行5列)
aaa iii uuu eee ooo
kkk jjj "hh
h"ggg gg
です。すみません。
709 :
705 :03/12/21 19:59 ID:???
>>708 ありがとうございます。「 perl -V 」知らなかった・・・
710 :
702 :03/12/21 20:16 ID:P177ftmV
>>703 すみません。1000行そのまま配列にするにはどうしたらいいんでしょうか
>>704 確かにDB分を除いてprintだけさせるとあっという間に処理が終わるので
DBに時間がとられているようです。たぶん連続してDBにinsertすると
DB分の処理時間も短くなるので1000行分まとめて処理したほうがいいと
いうことだと思うのですが。
質問です。 @file = <IN>; とする代わりにPerlメモを参考に read(IN,$buf,-s IN); @file=$buf=~/[^\x0D\x0A]*\x0D?\x0A?/g; としてみました。 狙いはreadによる読み込み速度のアップと メモリ消費低減です。 狙い通りになっていますか?それとも全く違いはありませんか? もしくはもっと有効なやり方がありますか?
@file= split(/\n/, $buf);
715 :
704 :03/12/21 21:59 ID:???
>>710 > たぶん連続してDBにinsertすると
> DB分の処理時間も短くなるので1000行分まとめて処理したほうがいいと
> いうことだと思うのですが。
そんなことやったところで、何も変わらん。
だいたい、何千行(レコード)ものデータをPerlを使って1行づつテー
ブルに突っ込もうという発想自体がDQNだと思われ。
DB に何を使っているか知らないが、MS SQL Server やオラクルなら、
大量のレコードを一気にテーブルに挿入する「バルクインサート」という
機能があったと思うが。
ここまでくると、Perlの話題ではなくなるから、あとはそのDBの専門の
スレにでも逝って聞いてちょ。
@file = <IN>;
じゃなくてっていってるのに
>>713 っていうのは意味不明だw
>>712 ベンチマークとってみれば?
正規表現使ってる時点で速度落ちちゃうような気もするけど。
まぁ
@file = <IN>;
のコードが内部で同じことをやってるかもしれないし、どうなんだろう
717 :
712 :03/12/21 22:48 ID:???
>>716 すいません、ベンチの取り方わからなかったもんで…
@file = <IN>;よりはpush@file,$_ while<IN>;の方がよかった気もしますが
719 :
712 :03/12/22 03:45 ID:???
>>718 まぁperlで扱う時点で長大なファイルではありえないわけで、そうなると
perlで小細工すること自体全て無駄という結論に達してしまうわけですが…
でも例え体感できなくても、数値で比較した場合に2倍も3倍も速度に差が
出るようなら、効率のいいやり方で自己満足に浸りたかったわけです
とりあえず今度時間があるときにでもベンチの取り方を覚えて試してみます
なぜありえないと思うのかは知らんが、自己満足で好きな結論に達してくれ
遅いからだろ・・
>>702 RDBMSによると思うが,バインド変数使うだけでも劇的に違うと思う
723 :
nobodyさん :03/12/22 16:34 ID:Vo1mSSkN
perlってCみたいにコンパイルする事って出来ないんですか? そうすれば実行速度も速くなると思うのですけど
一応 perlcc てのもあるが、実行速度・実用性の両面で結構微妙 Cみたいな感じで完全に静的なコンパイラにすると eval あたりが問題になると予想される parrot については parrot スレを見れ
726 :
723 :03/12/22 17:43 ID:Vo1mSSkN
727 :
nobodyさん :03/12/23 10:09 ID:iQ6yBH41
多次元配列の指定した行番号の要素数、もしくは最後の添字?を知るにはどうすれば良いのでしょう? 例えば $hoge[2][123] = "a"; とあれば $#hoge[2] #これじゃ駄目ですが。。 で 123 が返ってきて欲しいのです。 お願いします。
>>727 $hoge[2][61] = 'foo';
$hoge[2][123] = 'bar';
print @{$hoge[2]}, "\n";
print ${$hoge[2]}[123], "\n";
print $#{$hoge[2]};
>>728 おぉ〜できました!
どうもありがとうございました!
Perlってプログラム初心者にはお勧め出来ない言語だなと Perl−>C/C++と勉強してみた初心者は感じましたとさ
>730 同じ順序で学んだ俺は、初心者にはPerlの方がわかりやすいと思ったね。 型とかポインタとか気にせずに作れるし。 変数や配列の頭にマーク($や@)が付いてて、見た目にもわかりやすい。 全くの初心者には、Perlもいいと思うね。 その後、他の言語に移行するのは苦労するけど。
>>731 他言語へ移行も大変かもしれないけど,Perlの習得そのものも他言語知識がないと難しくない?
OOPの要素とか関数型の要素まで入ってたりするし.
Cから入った人ならPerlの多次元配列の実現方法も容易に理解できるだろうし
>>728 の質問なんかは自己解決できちゃうと思う
>732 731だけど、俺はそう感じなかった。 というか、初心者の頃はそんな込み入った事なんて考えもしなかったし。 ちなみに俺は他言語知識なしでPerl覚えたよ。 Perlが初心者向きと言える理由の一つにはサンプルソースの多さもあるよ。 配布BBSなんかいっぱいあるし。 実際に自分が使っているBBSのソースを見る事もできるから、理解も早くなる。
動けばいい程度のものを作るにはperlは楽かもな
>その後、他の言語に移行するのは苦労するけど。 正直、これに尽きる。ホント大変
>>735 俺、PerlでOOP覚えたんだけど、そのままJavaに移行できると思う?
すっげー心配。
Javaの初心者本とか読んで意味がわかるのは確かなんだけど。
>>736 聞く前にやれば?Javaやるのに金はかからんわけだし。
739 :
736 :03/12/24 01:20 ID:???
>>737 >>738 どうせただでリスクがないんなら実際やってみるべきだわな。
ありがと。少し目が覚めた。
……と、今Javaをする必要性がないことに気付いた。
CGIと、ローカルでのちょこちょこだけならPerlで充分用が足せるんだよな。
雑談は他で
my $obj = foo(); if (! $obj->can('bar')) { $obj->bar = sub { ....; }; } みたいなことをやりたいんだけど、どのモジュールを使えばいいのか分かりません。 CPAN にこのようなことを実現するライブラリはありますか?
>>741 use strict;
use CGI;
my $obj = new CGI;
if (! $obj->can('bar')) {
no strict 'refs';
*{ref($obj) . '::bar'} = sub {
my $self = shift;
print "[", $self->version, "]\n";
};
}
$obj->bar;
__END__
ライブラリは知りません。
回答ありがとうございます。
>>742 その方法は思い付いたんですけど、それだと同じクラスの他のインスタンスにも
影響与えてしまいませんかね?
>>743 CPAN ライブラリなんで、改変できないのれす。
745 :
nobodyさん :03/12/24 15:05 ID:XZhPkoAv
SENDMAIL GA TSUKAERU SABA TTE ARIMASUKA? MOCHIRON FREE DE ONAGAISHIMASU なんだかしらないけど日本語入力ができません
できとるやん
747 :
nobodyさん :03/12/24 15:07 ID:XZhPkoAv
TEIKI AGE
自演乙
>>745 スレ違い、板違い
レンタルサーバ板へでも逝ってください
>>744 他のインスタンスに影響与えない方法ですか。
Perlはシンボルテーブルを見てメソッドを探すから、
普通のメソッドコールの書き方では無理なんじゃないかな。
if (! $obj->{'bar'}) {
$obj->{'bar'} = sub {
my $self = shift;
print "[", $self->version, "]\n";
};
}
$obj->{'bar'}->($obj);
>>744 同じクラスの他のインスタンスにも影響与えるって
どういうこと?
>他のインスタンスにも影響 1つのスクリプトで複数のインスタンスを使う場合に、 あるインスタンスが追加したメソッドが 他のインスタンスからでも使える。 のは困るって事なんじゃないかな?
>>752 それが困るってことは
同クラスの同名メソッドに
インスタンスの属性値かなんかで多態勢を持たせようとしてる
ってことなのかなぁ
クリスマスにソースとにらめっこするという、かわいそうなヤツなんですが、 サンタさん教えて下さい。 @sampleの中にはいくつかのurlが入ってまして、それを 1)$sampleに","で連結したものを入れ、 2)$sample2にはアンカーリンクで1から@sample分の連番にリンクを貼ったものを連結して入れたい んですが、1だけをクリアするには $sample = join ",",@sample; だけでおkなんですが、 2も同時にするために私の頭では↓コレくらいしか思いつきませんでした。 my ($j,$i,$sample) = ("",0,""); foreach (@sample) { $sample .= $j.$_; $j ||= ","; $sample2 .= "<a href=\"$_\">[".++$i."]</a>"; } もっといい方法ないでしょうか? ってかコレくらいが妥当でしょうか?
>>744 改変できないクラスの名前空間を荒らすのはお行儀が悪いな。
何か目的に対して間違った手段を模索しているように思える。
>>755 二回に分けられない理由は何?
my $sample = join ',', @sample;
my $sample2;
for (my $i = 0; $i < @sample; $i++) { $sample2 .= qq|<a href="$_">[$i]</a>| }
757 :
744 :03/12/24 19:56 ID:???
>>756 元のモジュールがお行儀悪いので、add-hook 的に解決しようと思ったんですが…。
素直にラッパークラス作ります。
758 :
755 :03/12/24 20:04 ID:???
>>756 正直その通りだと思いました。2回に分けます。
759 :
暇人 :03/12/24 22:53 ID:m+ofAFON
my ($sample1, $sample2); foreach my $i(0..$#sample) { $sample1 .= qq|$sample[ $i ],|; $sample2 .= qq|<a href="$sample[ $i ]">[$i]</a>|; } chop $sample1;
hoge.cgi?test 等の場合、$ARGV[0]で「test」が取れるのは分かったのですが 2chみたいに hoge.cgi/test みたいに/で区切ってる場合はどうやって取得すればよいのですか? お願いします。
$ARGV[0] ( ゚д゚)ポカーン お前、コマンドラインとブラウザの区別くらいつけようや
あ、そうでしたか。 無知で申し訳ないです。 で、どうすればいいですか?
REQUEST_URI
PATH_INFO
my ($dummy,$Bbs,$Key,$Opt) = split(/\//, $ENV{'PATH_INFO'}); if(-e "../$Bbs/dat/$Key.dat"){&mainlog($Ver,$Bbs,$Key,$Opt,$Url);} elsif(-e "../$Bbs/pool/$Key.dat"){&error(100,$Ver,$Bbs,$Key);} elsif(-e "../$Bbs/kako/$Key.html"){&error(101,$Ver,$Bbs,$Key);} else{&error(102,$Ver,$Bbs,$Key);}
@sage2 = <SAGE>; push (@sage, @sage2); ↓ push (@sage, <SAGE>); このように置き換えて、ファイルをpushしても とくに問題はないでしょうか。
@sage=<SAGE>;
>>760-761 hoge.cgi?foo+bar+baz で @ARGV = qw(foo bar baz); となるのは
保証された動作 (CGI プログラムに対する引数渡し) 。
>>766 それは「質問」じゃなくて「確認」だね。確認なら自分で試してくれ。
問題があるとPCが爆発します。
770 :
LISHEA :03/12/25 17:21 ID:BgAdFMzy
はじめまて。質問です。 web上に公開されている為替情報を取得して、その数値を使ってシステムを作るということをやっているのですが、どうやったらweb上の情報をむき出すことができますか?? かなりの初心者なので行き詰っています。 webの取得はLWP;;Simpleのジュールを使ってでききるそうなのですが、実行しても何も変化がありません。 どうすればよいか、アドバイスお願いします。
>>770 まず、どのようにコーディングしてダメだったのかを示すべきじゃないかと思う
773 :
nobodyさん :03/12/25 21:32 ID:0bAeHLiJ
初めまして。くじ引きをしたいです。 A B C … Z みたいなせいぜい20行くらいの元ネタファイルからランダムに1行引いて 引いた後はその行を元ネタファイルから削除したいなあと思います open (LF,$lf_file); flock (LF,2) if $FLK; @lf_list = <LF>; $lf_count = @lf_list; srand; $hit_count = int (rand($lf_count)); $disp_list = @lf_list[$hit_count]; chop $disp_list; print "$disp_list\n"; unshift(@lf_list,$disp_list); seek (LF,0,0); truncate (LF,0); print LF @lf_list; close (LF); flock (LF,8) if $FLK; ランダムに引くのは何とか出来ましたが、引いた行だけを元ネタファイルから 削除が出来ません。数日悩んでます助けてください。
$lf_list[$hit_count] = '';
>773 splice
>774 すみませんいろんな所に代入して試してみましたが 使い方がわかりません。つなぎ合わせのコーディングなので 呆れているとは思いますがもう少しヒントいただけませんか?
777get, zuzaa
>>776 7行目($disp_list = $lf_list[$hit_count];だと思うが)の下に
$lf_list[$hit_count] = '';で削除できるんじゃ?
でprintで格納(unshiftがよくわからんけど)
780 :
nobodyさん :03/12/25 23:05 ID:hr2zYcYz
クラスの関数が返す値を元に、多次元配列に格納された クラスをsortするにはどうすれば良いのでしょう? 具体的には $ary[1][23]->GetNum() で返す値を元に $ary[1][x] xの部分の配列をsortしたいです。 $aryに格納されているのは全て同じクラスです。
781 :
773 :03/12/25 23:10 ID:???
できました! 775さんのspliceを779さんのサイトで調べて 774さんのは高度でよくわかりませんでしたが 助言に従いunshiftを削除したら完成 ありがとう〜感謝!
質問です。 CGIから別のCGIの実行結果を読み込む場合はどうすればいいのですか? open (TEST,"test.cgi");ではtest.cgiの中身よ読み込んでしまいますよね?
>>780 my %t;
@{$ary[1]} = sort {
($t{$a} ||= $a->GetNum()) <=>
($t{$b} ||= $b->GetNum())
} @{$ary[1]};
# オブジェクトがハッシュキーってマズー?
>>782 $response = `test.cgi`;
# こういう問題じゃないに10perl。
>>782 PurePerlなら
use 'test.cgi';
とでもしたら?
786 :
780 :03/12/26 01:18 ID:???
787 :
785 :03/12/26 01:25 ID:???
>>784 アドレスが付くから一意性は保たれると思う。
Orcish Maneuver は簡潔に書けていいけど、||= 演算子が
重たいかも知れない。気になるならベンチしてみて。
>>788 ベンチするまでもなく
毎回$a->GetNum()を評価するよりは||= 演算子の方があからさまにマシな気がするが...
ところでOrcish Maneuverってなに?
hogehoge = 2 fugafuga = 10 magemage = 3 hiroyuki = 2 という内容のファイルがあって、それを右の数字の大きい順にソートしたいです。 とりあえず、ファイルを読み込んで%hashに左の文字をキーにして ぶち込んでみましたが、その後にどうしたらソートされるのかさっぱりわかりません 教えてください
%hash = sort { $a <=> $b } %hash;
>>791 my @sorted_key = sort { $hash{$b} <=> $hash{$a} } keys %hash;
print map "$_:[$hash{$_}]\n", @sorted_key;
>>792-793 dクス!
ずばりsortなんてものがあったんですね。
一度調べてみたら$aと$bはmy関数で宣言しちゃだめなんですね。
で、$aと$bを入れ替えるだけで、降順・昇順ソートが切り替わると。
手持ちのリファレンス本のサンプルコードを少し弄ったら望みどおりになりました。
foreach $key (sort { $hash{$b} <=> $hash{$a} } keys %hash ) {
print "${key} = $hash{$key}\n";
}
795 :
784 :03/12/26 19:58 ID:???
単純なクラスでベンチ取ったら、素の方がまだ軽かった。(オブジェクトの数は1000程度。) $ary[1] = [sort{ $a->GetNum <=> $b->GetNum } @{$ary[1]}]; ありゃりゃん。
unless( $data =~ /abc/ ); ↓ if( $data !=~ /abc/ ); 上の書き方を下の書き方にすると動かないんですけど、 これって根本的に間違ってますか?
!~
798 :
796 :03/12/26 20:17 ID:???
一部訂正。。 unless( $data =~ /abc/ ){ ↓ if( $data !=~ /abc/ ){
>>797 あ、なるほど。
ありがとうございますー。
unless( $data =~ /abc/ ){ ↓ unless(index($data, 'abc')>=0){
unless(index($data, 'abc')>=0){ ↓ if(index($data, 'abc')<0){
802 :
?O?????|?X :03/12/26 22:17 ID:GT8UmBX+
こんにちは。始めて自作に向けて、簡単なスクリプトを作って練習しています。今は、半角カナから全角カナに変換する のを作っています。何度やっても出来ないので、こちらへやってきました。 スクリプト #!/usr/bin/perl require 'jcode.pl'; $kana = 'ルース'; &jcode::h2x_sjis(*kana); print $kana,"\n"; *ルースは変換前の文字
h2z
list.txtから読み出して表示するというスクリプトなんですが うまく動きません。文法チェッカーによるとsyntax error at your CGI line 4, near ");" と出ます。 #!/usr/bin/perl open(LOG, "<<list.txt"); while($linedata =<LOG>); ($name_data, $mail_data, $url_data) = split(/<>/, $linedata, 3); $mail_data = "<a href=\'mailto:$mail_data\'>$mail_data</a>"; $url_data = "<a href=\'$url_data\+'>$url_data</a>"; $tabledata .= "<tr>\+n"; $tabledata .= "<td>$name_data</td><td>$mail_data</td><td>$url_data</td>\+n"; $tabledata .= "</tr>\+n"; close(LOG); print "本文略
while($linedata =<LOG>);
806 :
?O?????|?X :03/12/26 22:41 ID:GT8UmBX+
Internal Server Error がまた出ました。
whileの後は括弧で括れよ・・・
808 :
?O?????|?X :03/12/26 22:45 ID:GT8UmBX+
途中経過 #!/usr/bin/perl require 'jcode.pl'; $kana = 'ルース'; &jcode::h2z_sjis(*kana); print $kana,"\n";
型グロブって早く絶滅すべきだよねえ...
$tabledata .= "<tr>\+n"; \+n => \n
811 :
804 :03/12/26 23:01 ID:???
ありがとうございます。以下のように修正しましたら読み込み成功しました。 ですが次に問題が出ました。list.txtに以下の書き込みがあるんですが aaa<>aaa<>aaa bbb<>bbb<>bbb 読み込みして表示されるのはなぜかbbbだけになってしまいます。 aもbも表示できないのはどこに原因がありますか? #!/usr/bin/perl open(LOG, "<list.txt"); while($linedata =<LOG>){ ($name_data, $mail_data, $url_data) = split(/<>/, $linedata, 3)}; $mail_data = "<a href=\'mailto:$mail_data\'>$mail_data</a>"; $url_data = "<a href=\'$url_data\+'>$url_data</a>"; $tabledata .= "<tr>\n"; $tabledata .= "<td>$name_data</td><td>$mail_data</td><td>$url_data</td>\n"; $tabledata .= "</tr>\n"; close(LOG); print "Content-type: text/html\n\n"; print "略
while(<LOG>) だっつーの 基本中の基本だろ・・
>>811 open(LOG, "<list.txt");
while($linedata =<LOG>){
($name_data, $mail_data, $url_data) = split(/<>/, $linedata, 3);
$mail_data = "<a href=\'mailto:$mail_data\'>$mail_data</a>";
$url_data = "<a href=\'$url_data\+'>$url_data</a>";
$tabledata .= "<tr>\n";
$tabledata .= "<td>$name_data</td><td>$mail_data</td><td>$url_data</td>\n";
$tabledata .= "</tr>\n";
}
>>814 いやいや・・・
普通に$_でええやん、と
818 :
804 :03/12/27 00:26 ID:???
ありがとうございます。 ちょっとしたところでミスをしていました。
すいません。質問です 掲示板を作成していて、「11番めのログから20番目のログまで表示」という時、 やり方が良くわかりません。(1〜11を破棄というのは無駄ですし) seek関数というものは知っていますが、バイトごとなのでよくわかりません。 「同バイトにしてseek」すればよいのはわかりますが、「同バイト」という所がわかりません。 どういうことなのでしょうか。 うまく一行ごとに読み込んでくれるんでしょうか。
open(LOG,nantoka.log); @log=<LOG>; close; print @log[10..19];
破棄するほうが実用的だろうね。 $i=1; while(<DATA>){ if($i<=11){print "$_\n";} $i++; }
822 :
nobodyさん :03/12/27 08:15 ID:CWnXd3vL
while(<$log>){ if($. >= 11){ print ; last if $. == 20; } }
while(<LOG>){ (11..20) and print; }
824 :
819 :03/12/27 15:49 ID:???
>>820-823 返答有難うございます。やはり破棄のほうが楽ですか…。わかりました。諦めます。
ところで
>>823 の方のスクリプトはどういう原理なんですか?あまり見ない形なんですが…。
>>823 ここまで来るともはや何をやってるか意味不明だな(w
左が正のとき右を実行
初歩的な質問ですが、 FORMに記述した情報をmain.cgiの中にある sub GetFORM に送るには HTMLでどのような記述をすればいいのでしょうか?
>>827 shohotekisugiru.sirabetekoi.
hitonosukuriputodemo,yondekoi.
@data = ( [1069846177,"yamada","22歳","男"], [1069845374,"tanaka","20歳","女"], [1069846478,"19歳","男"] ・ ・ ・ ) 以上のようないくつかの時間,名前,年齢,性別の入ったデータがあるときに 時間の古い順でデータを吐かせたいのですがソートの部分がわかりません print テーブル部略; foreach() { #この部分をどのようにかけばいいのかが・・・ print <<EOD; <tr> <td>$data[$_][1]</td> <td>$data[$_][2]</td> <td>$data[$_][3]</td> </tr> } print テーブル部略; おしえていただけませんか?
>>830 sort{ $data[$a][0] <=> $data[$b][0] } 0..$#data
my @data = ( [1069846177,"yamada","22歳","男"], [1069845374,"tanaka","20歳","女"], [1069846478,"suzuki","19歳","男"], ); foreach my $i (sort { $a->[0] <=> $b->[0] } @data) { print << "__END__"; <tr> <td>$i->[1]</td> <td>$i->[2]</td> <td>$i->[3]</td> </tr> __END__ } こういうデータはハッシュで管理した方がイイと思うがね。
833 :
830 :03/12/27 20:46 ID:???
有難うございます
2ちゃん互換のトリップの生成はどうすればいいでしょうか?
何度この質問が出てくるのだろう・・・ 2004年はでませんよーに
perlにC言語のポインタみたいな物はあります?
ある。
教えていただけませんか?
$foo = "hello"; $ref = \$foo; $bar = $$ref; とすると、$bar に"hello"が代入される。$refは、$fooのポインタ。 ポインタの指標する値を取り出すには、$を2つつける。
842 :
841 :03/12/28 16:02 ID:???
そうそう。perlでは「ポインタ」と呼ばず「リファレンス」と呼ぶ。
ありがとうございました。
スミマセン。少々質問があります。 write.cgiというファイルに以下の記述 open(LOG, ">>log.txt"); print LOG(内容 があり、本来はindex.htmlからFORMデータをwriteに送って書き込みをするのですが、 write.cgiに直接アクセスしただけで、情報が入っていないままlog.txtに書き込まれてしまいます。 直接アクセスしたときに「error」などを表示させて、FORMからのデータだけを 受け付けるにはどうしたらよいでしょうか?ご指南お願いします。
リファラーがindex.htmlじゃ無かったらエラーにしる
>>845 サマ ありがとうございます。
参考にして以下の文を書いて見ましたがうまく動作しません。
$url='フォームがあるhtmlのアドレス';
if($ENV{'HTTP_REFERER'} ne /$url/){
print "Content-type: text/html\n\n";
print "直アクセス禁止"
exit;
}
847 :
844 :03/12/28 16:46 ID:???
neではなく、!~で正常動作しました。 ありがとうございます。
848 :
819 :03/12/28 17:17 ID:VlzEY3kS
遅くなりましたがありがとうございました。
open(AA,"$aafile"); @aa = <AA>; close(AA); open(BB,"$bbfile"); @bb = <BB>; close(BB); push(@aa, @bb); foreach(@aa){ ($a, $b, $c, $d) = split (/<>/, $_); if($a eq $ip){ &error('重複してます'); } } と open(AA,"$aafile"); @aa = <AA>; close(AA); foreach(@aa){ ($a, $b, $c, $d) = split (/<>/, $_); if($a eq $ip){ &error('重複してます'); } } open(BB,"$bbfile"); @bb = <BB>; close(BB); foreach(@bb){ ($a, $b, $c, $d) = split (/<>/, $_); if($a eq $ip){ &error('重複してます'); } } どちらが負荷が少ないですか?
>>850 > どちらが負荷が少ないですか?
なぜ自分で調べないのですか?
いちいち必要のない配列にぶっこんでるぐらいだから、調べ方もわからないに一票。 こういう場合、負荷を調べるにはどのようにしたらよいか、という質問のほうが相手にしてもらえたと思われ。 ま、「ググれ」で済まされるかもしれんけどな。
どうでもいいが$aと$bは安易に使うんじゃねーぞと逝って億か
>>849 なんか「Cでポインタを使うメリットありますか?」と質問されてるような気分だ
>>854 その理由は?
もっとも自分は特に明確な理由はないが実験用の簡単なスクリプトでしか
$aや$bとかは使用しないようにしているが。
Cのポインタでも大半は参照渡しがしたいだけだから。 メリットはシャンプーだがなー
>>856 つーかなんでリファがでてくるん?
データが何かあるときだけ書き込むって仕様でいいんじゃねーの?
しかもなんで正規表現なん?
$hoge = 送られてきたデータ;
&error('データありまへんで') if $hoge eq '';
open(LOG, ">>log.txt");
print LOG $hoge;
close (LOG);
>>861 $a,$bってソート比較ブロックの中でローカル化されるんじゃないの?
比較ブロック内で参照しようとしたら意図した結果は得られないくらいの問題のような気がする
863 :
861 :03/12/28 22:50 ID:???
ま、俺は
>>854 じゃないんで、
別に使ったところで問題あるのかどうかはしらない。
でも俺は使わないし、基本は使わないっしょ。
$a1とかにみんなしてんじゃねーの?
$a,$bはこのスレではよく指摘されるが、DATAファイルハンドルはほとんど指摘されないな。
865 :
nobodyさん :03/12/28 22:54 ID:TGOsRW2X
$a, $bはuse strictのチェック対象外だから。
俺は独断のルールで、変数は三文字以上。これ適用してる。なんとなく。
>>844 書き込みをPOSTメソッドで行い、
その他のメソッドだった場合はerror表示。
>844 情報が空ならエラーにする。 もしくは、入力フォームにhidden属性でチェック項目を入れておき、それがなければエラーにする。
変数、ファイルハンドル、ヒアドキュメントの開始終了など 使用不可能な予約語などについてきちんとした情報はないのだろうか?
ファイルを移動したいのですがどうすればいいのでしょうか? 出来ればモジュールなどは使わずにやりたいのですが…
>>869 変数は小文字で2文字以上、ファイルハンドルは大文字、とかそーゆー一般的なルール守るべす。
て言うか、特殊な名前はけっこう覚えれるよ。
>>870 今あるファイルを他の場所にコピーするてことか?
ファイル読みこんで、写したい場所に書きこんで、古いの消す。
いっぱいファイルあったらループ。
ターゲットのリストとしてcsvファイルを指定し $data_view[0]や$data_view[1]などと変数にできたのですが $target = $data_view[0]などとした場合に変数の名前の数字をカウントアップさせる事は可能でしょうか? $target = ${'data_view['."$number".']'} と無理矢理やってみたのですが、$targetが空っぽになってしまい うまくできませんでした。
>870 コピーじゃなくて移動か? 移動ならrename >874 $target = $data_view[$number]って事じゃなくて?
876 :
874 :03/12/29 00:54 ID:???
>>875 できました!
なんだか調子が悪かったらしくて、書き直したらOKになりました
ありがとうございます
DB使えないのでデータをテキストファイルにして掲示板を造ろうと思うのですが、 今のところデータは2000件ほどあります。これを1個のファイルに収めるのと 100件くらいずつ切り分けるのとではどちらがオススメでしょうか?
879 :
nobodyさん :03/12/29 02:11 ID:UgDxJvBw
─────‐||────────‐──────────────────────
─────‐ ||───────────────−───────────
─────−||─────────────────────―───
────── ||──────────‐─────−─────── ∧_∧
──────(_)─、────────‐─────────- ( ヽ (; ´Д`) ノ )
─────‐─(_)_ \────────‐──────‐── \ \ _/ /_ ___/ /
───────/ \ ∧_∧,〜 ──‐───────‐──── \  ̄\ \ / / /
─────−─\ \ )\────────────────  ̄ ̄| \ \ / / | ̄ ̄
─────−──ヽ  ̄ `ヽ |─────‐───────‐───── | \ \/ / |
──―──────\ `ー'ヽ, -'⌒\─‐──────────── |____\ /____| ←
>>52 ―─‐─―─―──‐ | , _/⌒────────────── ___ _
──────────\ /\/ ──────────‐───‐─ | / /\\|
─────‐∧ ∧,〜 / / ) `ヽ、 ──────────‐──── | / / \____
──−──(Д゚(⌒ ̄ `ヽ' _/ )───────────‐── ( / /____ )
──―───‐\ \ `ー'"´, -'>__ノ ───────────── / / / /
―‐――──‐ /∠_,ノ _/.__)──) )──‐────────‐─ / / __//
─────‐ /( ノ ヽ、∧ ∧,〜──(__ノ ───‐───‐────− // ( /
────‐ 、( 'ノ( (゚Д゚,,)⌒ ̄`ヽ、 ──────────── // )/
───‐‐/` ―\__( ー\ _」_,∠⌒`ヽ────── __// し′
───/───―‐/__〉\ 、 ( ノ 、ー'⌒` \──‐─ ( /
880 :
nobodyさん :03/12/29 02:13 ID:UgDxJvBw
) )) (( ) /::::)(:::)(:::::::::::)(::::::^::::::::::\( ))(::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::\〜 /::::::::::/ノ::::::::ノ::::::::ヽ:人::::::::::ヽ:::::::::::::::))) (::::::::::/ ):::ノ::::ノ ) ソ ヾ::::::::::::丶::::ヽ ((::::::::::./ 彡 ノ 自 ノ :: 彡:/)) :::::::::):) ぷ〜〜ん (::::::::::/彡彡彡彡彡.大 ミミミミミミミ :::::::::::)〜 〜((:::::::// ̄ ̄ ̄ ̄ヽ===/ ̄ ̄ ̄ ̄ヽ |:::::::::))) |==ロ -=・==- ‖ ‖ -===・- ロ=== /⌒ |:/ ‖ / /ノ ヽ \ ‖ ヽ|ヽ⌒ヽ _________ 〈 |/ ヽ`======/ .⌒ ` ========ノ. ..| | 〉 / ヽ .( 。 ・:・‘。c .(● ●) ;”・u。*@・:、‘) / / おれはPerlは一流なんだぞ、おれを敬え!! | ( :。・;%:・。/::: ::::::| |::::::ヽ ; 8@ ・。:% ) | < \( 。;・0”*・o;/::::::::::l l::: ::: \ :。・;%:・。. )/ \ 男子やうんこが大好き! (; 8@ ・。:/ ̄ ̄ ̄ ̄ ̄ ̄\: ”・:。;・’0.)(( \_________ ( 0”*・o| | 0”*・o:c )::)) . (。・:%,:)|.  ̄ ̄ ̄ ̄ ̄ | :(: o`*:c)::(( (::(; 8@・。| |; 8@ ・。: ):::))) )::::\ :::o :::::\______/ ::::::::::/:::::::)) 〜((:::::::::ヽ ヽ:::: _- ::::: ⌒:: :::::::: -_ ノ::::)):::::::::::( ((:::::::::\丶\_::_:::::_:::: :::::_/:/:::::: ::::::::)))〜
881 :
nobodyさん :03/12/29 02:14 ID:UgDxJvBw
ぶりゅぶりゅぶりゅぶりゅぶりゅぶりゅぶりゅぶりゅぶりゅぶりゅぶりぶりー ぶりゅ ∬ ∬ ぶりゅ ぶりゅ __,,....) , 。 ∫ ぶりゅ ぶりゅ ∧∧'´ );'・ミ∵;,、 。 ;, ぶりゅ ぶりゅ と(*゚ワ゚)Uてノ゙`;ヾ;,、`●;.'';,, ぶりゅ ぶりゅ ""''`゙∵";;゙' ぶりゅ ぶりゅぶりゅぶりゅぶりゅぶりゅぶりゅぶりゅぶりゅぶりゅぶりゅぶりゅぶりー ______∧________________ 今、しぃたちはぶりゅぶりゅぶりゅぶりにあっていますぶりゅぶりゅぶりゅぶりー 虐殺されたり糞を食わされたりぶりゅぶりゅをねだらされたりぶりゅぶりゅぶりゅぶりー けれどしぃたちがそのようなことぶりゅぶりゅぶりゅぶりしたわけではぶりゅぶりゅぶりゅぶりー 虐殺厨、モララー厨などのぶりゅぶりゅぶりゅぶりなどですぶりゅぶりゅぶりゅぶりー でもそのようなぶりゅぶりゅ達が描いたしぃが定着していますぶりゅぶりゅぶりゅぶりー ぶりゅぶりゅぶりゅぶりしぃ作品の代表『ぶりゅぶりゅぶりゅぶり』などはぶりゅぶりぶりー そのイメージをぶりゅぶりゅする画期的なものでしたぶりゅぶりゅぶりゅぶりー でもイメージが変わることを恐れたぶりゅぶりゅぶりゅぶり同盟はぶりゅぶりゅぶりゅぶりー そのスレを徹底的にぶりゅぶりゅぶりゅはじめましたぶりゅぶりゅぶりゅぶりー このままではぶりゅぶりゅぶりゅぶりの描いたしぃがしぃと思われてしまいますぶりゅぶりゅぶりゅぶりー ぶりゅぶりゅぶりゅぶりのみなさん、しぃ達をぶりゅぶりゅぶりゅぶりしてくださいぶりゅぶりゅぶりゅぶりー おながいぶりゅぶりゅぶりゅぶりしますぶりゅぶりゅぶりゅぶりー
882 :
nobodyさん :03/12/29 02:15 ID:UgDxJvBw
/ _ \ / (※) | |  ̄ | ヽ /_____ヽ / ヽ_|0l二二二二l0|_ノ |vヽ___ノv| (d| ・=ゝ ・=ゝ|b) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ Z/ ( _ ) ヽフ < Perl使う奴は 死刑!! / @ @ ヽ \________ (ー――〜〜 ―――) \ ______/ てヽ_/ lo// /( て二/l__ (┃ ⌒ 二 )_O―┴┐ |┐ー┤ | |\O O| | |_n_)┘  ̄ ̄
883 :
nobodyさん :03/12/29 02:16 ID:UgDxJvBw
/⌒ヾ⌒ヽ. / 丿 ..ヾ / 。 人 ) (。...。_ .ノ 。ヾ。...丿 ( _ . .. ノ ) / / / ノ し / 三 ̄ ̄ ̄ ̄\ / ) と / / ____| . / / / > | / / / / ⌒ ⌒ | / / |_/---(・)--(・) | / / | (6 つ | / .. / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ___ |/ . / < 誰かアナルファっクさせてくれ!! \ \_/ / / / \_パンチ5分の2だよ W シコ \___/ / / / \ / . / シコ ( ) ゚ ゚/\ゝ 丿.../ \ ヽ、 ( / ⊂// \ ヽ / ⊂// ( \つ / | |O○ノ \ | | \ \ | ) | )
884 :
nobodyさん :03/12/29 02:17 ID:UgDxJvBw
彡ミミミヽ ノ彡ミミ))) ((彡ミミミミ)(彡彡)))彡) 彡彡゙゙゙゙゙"゙゙" """"ヾ彡彡)) ミ彡゙ .._ _ ミミ彡 ミミ彡 '´ ̄ヽ '´/ ̄ ` ,|ミ))) ミ彡 ' ゚̄ ̄' 〈 ゚̄ ̄ .|ミミ)) ((彡| | | ` |ミ彡 (彡| ´-し`)\ |ミミ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ゞ| 、,! 」 |ソ < Perlなんていいから、嬢ちゃんまたしゃぶってよ、仲直りのしるしに ヽ '´ ̄ ̄ ̄'ノ / \_________________ /⌒ \____/ ⌒\ \ / ¬ \ / ̄ ̄ヽ \ /⌒⌒ヽ / \ \ ・ | \ ( 人 ) / ヽ \ / ゝ ヽ \ / | \ |;; | \/ | | \ l |;; ;;; |\__/ | | \ ̄ ―|;; ;;; |-/ | | \ |;; ;;; |/ | | \ |;; | |/ | | | |; ;; ;;| /| | ;; / | \ / ;; /
885 :
nobodyさん :03/12/29 02:19 ID:UgDxJvBw
/././././ .ノ""" /####| ../////./" "///##| ._._./ ヽ.ノ ヽ""///#ノ /' , | ../""彡 ./ ; \...>' ̄ .../ ''';;;ヽ ./ ,,, '';;| / ./ ..| .____ ./ ./ ' .| /"__,") .../ / ..| .| ""A ./ /| | __..-´ ..ノ / ../ | : | ___....--'" .-'" ...| ./ | ; |" __..-''" | ..| .| ; |;:--''" .| .| .| ..("| ..| .| ../ | .-' ̄`--,,,, ..| | ../ | /((((((((((((((`-,,, ...| .| .../ .| ノ ,,, ヽ))))))))))))))) ..| | ..| ..ヽ /;' ̄`' ,°" ((((((((((((((((ヽ ...| .| .| ; ノ / .,く ((((((((((((((((((ヽ | .ヽヽ γ ,`--..)"> .ヽ((((((((((((((; .| ..ヽ ..ι,-μ''"#..("______ ..>))))))))))))) ヽ.._ .ヽ.ヽ | "|::;ヽЩヽ (((((((((((((((( "`-ヽ| .| ...|:;ヽ;;;#| |/:::::::::::::ヽ)))))) ..| .|: ...|:;ヽ;;#/:::::::::::::::::::::::::::ヽ))) .| ..|: ..| "'-,//:::::::::::::::::::::::::::::::ヽ)) ..| .|;: | .|ШШ,,,;;:::::::::::::::::::::::::|) ...| |;: | (..γヽ,,, ヽ:::::::::::::::::::::::ノ ...| .|;;: | ../..(:::::::::..\:::::::::::::::::::::|
886 :
877 :03/12/29 02:45 ID:???
>>878 普通の追記型の掲示板でデータは1書き込み1行ずつにしようと思ってます。
サイズはわかりませんがごくふつうの掲示板と思ってください。
書き込みは1日で最高でも10件くらいです。
今どきの鯖スペックだったら1000・2000件くらい楽勝だしょ。
1枚でいい気はすっけど 分けるにしても1000件ごとでいいと思うし
2chのdatファイル考えてみれば・・・
同じサイズなら、複数のファイルより1つのファイルのほうがいいんじゃない? さらにシーク位置と長さを記録したインデックスを用意して、それを使って 目的のデータへ直接アクセスすればさらに効率的だと思われ。
1日10件の書き込みしかない個人掲示板でそこまでやってたら 正直、きもいと思う。
まぁ、そんなことで悩むより、 表示部をHTMLにしたりする方が先決だと思われ。
>>851 >>857 いや、Cの場合とPerlの場合は違うと思うけど・・・
Perlで本格的なオブジェクト指向っぽいプログラム組みますか?
割とスクリプトとして使っているから、変数はガンガンglobalにしてます。
意識してれば変数名がぶつかることはあんまり考えられないと思うのですが?
もしプログラマーが把握できなくなる規模なら、Rubyの方がいいとか?
また慇懃無礼って言われそう・・・
>>893 サイズのでかいデータを関数に渡すとき、値渡しだと馬鹿でかいデータを丸々$_[0]などにコピーすることになる。
メモリ効率を考えると、参照渡しのほうがいい場合もある。ストリームを渡したいときなんかも。
>>893 オブジェクト渡すだけの方が、後々メソッドのインターフェイスとか買えずに済むから、幸せになれる気がするんだ。
>>895 逆に厳密なデータ構造の決定ができない諸刃の刃
つーかオブジェクトってのがblessされたハッシュへのリファレンスやん。 ところで俺がCでポインタ使う場面って、まあ参照渡しを脇に置くと、 リストやツリーみたいなデータ構造作るときに、 mallocしてポインタでつなぐ、てのが基本だと思ってるんだが、 他の人はそういうことしない? 同じことを perl でやるとき、リストは配列があるからそれでいいんだけど、 ツリーはやっぱリファレンスでつなぐよね? まあ、実際にはツリーのコードはCPANとかから引っ張ってくるのかもしれないけど、 例えば LWP で取ってきた HTML/XML をパースしてDOMツリー作ってもらったとして、 ツリーの中をトラバースするときはリファレンスを辿るよね?
>>897 アドレスの演算ができないならポインタなんてイラネ。普通に参照使うよ。
899 :
897 :03/12/29 12:37 ID:???
参照って、C++の参照型のこと? あれ、俺がK&R必死に読んでた頃はまだ無かったんだよなあ。 perl のリファレンスは、CのポインタよりもC++の参照型の方に近いよね。
>>899 誓いもへったくれも
参照 -訳-> referrence
901 :
nobodyさん :03/12/29 14:05 ID:WBgkItFP
>>893 >意識してれば変数名がぶつかることはあんまり考えられないと思うのですが?
なんで意識してまで安全でないグローバル使わなきゃならんの?
あるスクリプトで my $check = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; $FORM{'FROM'} =~ s/($check)(?: | )+$/$1/g; というのがあったのですが、"?:"というのはどういう意味なんでしょうか?
>>902 マニュアルに書いてあるよ。回線切って首吊って(ry
s// の中で使ってるから正規表現関係だってすぐに分かるものだと思うんだが…。
>>903 すみません。マニュアルといえるマニュアルは持ってないもので…。
ぐぐっても検索できないし…。
906 :
nobodyさん :03/12/29 16:32 ID:FenPkq2L
BBSスクリプトを作っているのですが、削除処理がうまくいかずに困っております。 具体的には「投稿の際、削除パスワードを書かないとその記事は誰でもどんなパスでも削除できてしまう」というものです。 削除パスを必須にすればいいのでしょうができるだけ投稿者さんの負担を減らすためにもあくまで削除パス記入は任意という前提の下で考え、いろいろ調べてみたらどうやた投稿されたパスをDATファイルに渡す処理のところで引っ掛かってるようでした。 以下がその部分のコードなんですが、 if($pass) { @code=qw|a..z A..Z 0..9|; $ps_key=$code[int(rand(@code))].$code[int(rand(@code))]; $angou=crypt($pass, $ps_key); } これに対してelseで 「削除パス欄に何も書かれずに投稿された場合、DATファイルには管理人用マスターパス($password)を渡す」 という処理にするにはどう書けばよいでしょうか。 何卒ご教授の方宜しくお願いいたします。
else { $angou = $password; } こーゆーこと?
908 :
nobodyさん :03/12/29 16:48 ID:FenPkq2L
>>907 さん
ありがとうございます!
else{
$angou=crypt($password);
}
というのを前提に考えてました・・・すみませんどうしようもない質問で・・・
おかげでうまくいきました!
ほんとありがとうございます。
瑣末なことだけど、変数名に日本語使うのは止めたほうがいいよ。 angou -> crypted とか。
>>905 いまいちわからなかったので正規表現道場の方に行ってみます。
ありがとうございました
911 :
nobodyさん :03/12/29 17:02 ID:FenPkq2L
>>909 さん
御指摘ありがとうございます。
確認したら確かに、セキュリティ面でどうかなぁと思いましたので、
f($pass) {
@code=qw|a..z A..Z 0..9|;
$ps_key=$code[int(rand(@code))].$code[int(rand(@code))];
$angou=crypt($pass, $ps_key);
}
else{
@code=qw|a..z A..Z 0..9|;
$password=$code[int(rand(@code))].$code[int(rand(@code))];
$angou=$password;
}
こういう風にしてみました。
たぶん知識ある方が見たら「なんじゃこりゃ」って書き方だとは思いますが・・・
とりあえずcryptの意味を理解しないとダメですね、もっと勉強しなければ・・
でも今回はほんと助かりました。丸二日間悩んでたもんで・・・
>>907 さん
>>909 さんにはほんと感謝です。良いお年を迎えられますように。
>>909 揚げ足取り申し訳ないが「日本語」ではなく「ローマ字」
では?
>>911 それじゃあ if 文使ってる意味がないような…。
あと、qw|a..z| だとリスト中身が展開されないと思うけど、いかが?
>>909 に対しての
>>911 がわけわからん。
変数名を日ローマ字から英略語とかに変えたほうが・・って話じゃないのか?
ま、俺は日本語ローマ字は使わんが、
別にローマ字でもええやんってな気はするが。
915 :
914 :03/12/29 20:48 ID:???
つまり、削除処理のときにdat内を見て、パスの部分が管理用パスだったら、 どんなパスでも削除を許すってことですかい? ん〜なんかよくわからん、意味のなさげな処理なんですが・・ 書き込みのときにパスがなんも入ってなかったら、 そのままパスの部分は何もいれずdatに書き込んで、 削除処理側でdatを覗き、空ならどんなパスでも削除を許す。 でいいんじゃないの? しかも911の変数passwordは種だから、 そのまま種だけを$angouに入れてることにならんか? どんな意味があるの?
変数名に日本語ってこーゆーの? ${'りすと'} = ('漢字', 'カタカナ'); そしてさらにこうとか? foreach my $neme (@{'りすと'}){ no strict 'refs'; ${"$name"} = '(・∀・)'; } こんな使い方にくらべりゃローマ字のがまだマシだぬ。
(・∀・)やっぱこうする @{'りすと'} = ('漢字', 'カタカナ');
こういうことじゃないのか。 use utf8; if ($パス) { @コード = ('a'..'z', 'A'..'Z', 0..9); $ぴーえすキー = $コード[int(rand(@コード))].$コード[int(rand(@コード))]; $暗号 = crypt($パス, $ぴーえすキー); }
$aa $aaa $aaa1 $aaa2 $ab $ab_2 とか使われまくるよりは $pasuwaado $kagi $angou の方がまだマシ。
>916 勘違いしてる気が。 日本では普通、単にローマ字って言う場合は日本語のローマ字表記って意味だ。 あんごう ← 日本語の平仮名表記 angou ← 日本語のローマ字表記 で、今の変数名に日本語を使うなって流れは後者を使うな(使わない方が良いんじゃないか)という事かと。 仮名漢字とローマ字の問題じゃなくて、英語と日本語のどっちを使うかって話……だよね? #いきなり自信無くす
あわわ・・・なんか流れが違う方向に行ってる・・・
ワケのわからないレスしてしまって申し訳ありませんでした。
>>913-915 さん
藁にもすがる思いでババっと書いたので今読み返してみたら最初の
>>906 の文章も誤解を招くような書き方でした。
正しくは、
「投稿の際、削除パスワードを書かないとその記事は誰でもどんなパスでも削除できてしまう」
という動作だったので、それがいやなので
「削除パスなしの投稿は、管理人マスターパスでしか消せないようにしたい」
ということです。
>>906 ではまるで前者の処理を目指してるように見えますよね・・・重ね重ねすみませんでした。
長くなったので二回に分けます。連続投稿すみませんです。
で、
>>907 さんの御指摘のもと、
if($pass) {
@code=qw|a..z A..Z 0..9|;
$ps_key=$code[int(rand(@code))].$code[int(rand(@code))];
$angou=crypt($pass, $ps_key);
}
else {
$angou = $password;
}
こうしたらうまくいったんですが、このままだとDATファイルに書き込む際にマスターパスがそのまま書き込まれるので、
万一何かの拍子にDATファイルを第三者にDLされた場合パスが漏れるんじゃないかと思い、それじゃあ管理パスも暗号化してやろうってことで
>>911 のような書き方をした次第です。
>>909 さんの御指摘=こういうことだと勘違いして
>>911 は
>>909 さん宛てのアンカーをつけました。
>>909 さんのおっしゃる「変数名に日本語使うのは止めたほうが」というのは変数名angouのことだったんですね・・・それ今気づきました。
ほんとご迷惑おかけしました。
スレ汚しすみませんです。
923 :
914 :03/12/30 15:29 ID:???
>>922 で、911で期待した通り動くのかい?
管理パスで消せるかテストしてみたのかい?
絶対消せないと思うのだが・・
↓これでだめかい?テストしてないけどね。
コメント部分は書かなくていいよ。ってわかるか・・
@code = qw|a..z A..Z 0..9|;
#↑この部分がどうなのかって指摘があったが、メンドイからいけるものとする。
$ps_key = $code[int(rand(@code))].$code[int(rand(@code))];
#↑cryptの種をランダムで作成
$pass ||= $password;
#↑$passに何も入ってなければ管理用パス$passwordを代入
$angou = crypt($pass, $ps_key);
#↑$passをcryptで暗号したものを$angouに代入
$angou = crypt defined $pass ? $pass : $password, sprintf qq(%s%s), (0..9,A..Z,a..z,'.','/')[rand 64, rand 64]; 別に変数名は好きなものを使えばいいと思うけれども、 Perl さん、他の人に見せるのであるなら人様が混乱しないようにすればよろしいかと。
Perlソースの暗号化のためにも $aa $aaa $aaa1 $aaa2 $ab $ab_2 を使いなされ
printf "%s\n", join ' ', qw|a..z A..Z 0..9|;
# a..z A..Z 0..9
printf "%s\n", join ' ', (a..z,A..Z,0..9);
# a b c 〜 7 8 9
>>925 感動した(w
「明日の自分は他人」だと思ってソース書いておかないと 間を空けた修正の時に地獄が待ってますよ。
>>925 文字にならないビットを置いた方がより暗号的だよw
バイナリエディタで作る。
929 :
nobodyさん :03/12/30 16:11 ID:GqTrOM1j
そういえば漏れも最近 $passwordが $pwordになって $pwdになって来ているような気がする だめぽ
$pasward_result = $password; $pasward_result1 = &henkan($pasward_result); $pasward_result2 = &henkan2($passward_result); $pasward_result3 = &Newhenkan($passward_result1); こういうのも割と凶悪。
$l も凶悪。$|と見分けにくかったりして。 $l00oO100ll
ハッシュのキーの変数名に値を入れたいのですが、うまくいきません。 %hash = ( aaa => 'hoge', bbb => 'fuga' ); というハッシュから、 $aaa = 'hoge'; $bbb = 'fuga'; の代入を行いたいです。 ${$key} = $value while( my ($key, $value) = each %hash ); これではダメでした…
>>932 foreach (keys %hash){ ${$_} = $hash{$_} }
934 :
932 :03/12/30 17:35 ID:???
>>933 ありがとうございます。
早速使ってみたのですが、、
#! /usr/bin/perl
my %hash = (
aaa => 'hoge',
bbb => 'fuga'
);
my ( $aaa, $bbb );
foreach ( keys %hash ) { ${$_} = $hash{$_} }
print qq(Content-Type:text/html\n\n);
print qq(aaa: $aaa<br>\n);
print qq(bbb: $bbb<br>\n);
exit;
すんません、これではダメですた…。
935 :
932 :03/12/30 17:39 ID:???
自己レスです。 すいません、$aaaと$bbbの my を取ったらいけました。。 ありがとうございましたー
$aがだめならforループで$i使うのもだめ?
使えばええやん
そっか。アがだめだからイもやばいと思ってた。
ループ変数にiを使う習慣って、永久になくならないんだろうな。
俺はほとんど i 使わなくなったなぁ。
?
そこに i は無いのかい?
>>943 > そりゃiなんて使えませんからね
ぷ。本当に i (勿論 $i じゃないよ)を使えないと思ってるの?
>>946 使ってみろよ(勿論 $i じゃないよ)
なんか話が違う方向に行ってないか 大晦日だというのに
$!
$l $| $i $! $I
そういえば、$a,$bの他に$nもヤバイんじゃ無かったっけ?
$u URLじゃなかったっけ(;´д`)?
『うろ覚えだけど変数の話をしてみよう』スレになってきたな
955 :
nobodyさん :03/12/31 16:33 ID:iz4Gmtql
テキストファイルに保存されている151,241といったような数字を 151だけ$number1などに代入するのはどのようにすればよいですか? 何から手をつけてよいのかちんぷんかんぷん。
>>955 漏れらも君がどこでつまづいているのかちんぷんかんぷんだ。
957 :
955 :03/12/31 17:05 ID:???
例えばcnt.txtというファイルの中に「151,241」とデータがあって それを open(IN,"cnt.txt"); @log = <IN>; close(IN); という形で読んだとして @logの151,241という数字をどのように $number_1→151 $number_2→241 とそれぞれに割り当てるのかがちんぷんかんぷんなんです。
>1は読んだ?
>>957 こういう例でいいっすか
$str = "151,241";
($number_1,$number_2) = split(',',$str);
print "number1 = $number_1 : number2 = $number_2 \n";
外部fileを読み取りたい場合はそのフォーマットを述べなさい。 それだけで充分。 while(<IN>){ no strict 'refs'; $num++; ${'number_' . $num} = split (/,/$_); } 一番手っ取り早いのはこれだけどあまり勧められた方法じゃない。
↑やっぱすごく間違えた。流して。
>>960 while(<IN>){
my @log = split (/,/$_);
my $num = 0;
foreach my $logs (@log){
no strict 'refs';
$num++;
${'main::number_' . $num} = $logs;
}
}
これを書きたかったのかな?
てかスカラーに入れる意味がなさげな典型な悪寒。
つか俺も間違えてる……………鬱 my $num = 0; これループの外で…。あー、こんな時にPCに向かってるから頭バグったっぽい。
ファイルオープンせずにファイルを空にする方法ってあります?
錬金術でつか?
970 :
967 :04/01/01 03:26 ID:???
そろそろ次スレ立てない?
乙
ところでエディタのタブはみんな何文字にしてる? ちなみに俺は8文字で、タブ文字も表示させてる。 最近4文字でタブ非表示に切り替えようと思ってるだけど見にくい。。。全然慣れない。
タブを入力すると自動的に必要なインデント分のスペースに変換される。 ちなみに4桁インデントだから1タブ=4空白だな。
977 :
964 :04/01/01 11:05 ID:???
1tab = 4space タブ、改行、EOF表示。 場合によっては全角スペースも表示。
>975 4 8だと横に長くなりすぎて読み難い。
980 :
nobodyさん :04/01/01 17:41 ID:KSdPAoW/
#!/usr/bin/perl -w の最後に -w 付けるのと付けないのではどう異なるんでつか?
>>980 Perlの機嫌がよくなる
会話で「〜w」って使うでしょ?
アレのこと
983 :
975 :04/01/01 18:17 ID:???
みんな4なんだなー。
やっぱ俺も早く4になじもう。周囲との互換性のために。
>>978 改行まで表示させたらウザくない?
俺は左側に行番号表示させてるから普通にしてても改行分かる。
俺はタブ、EOF、全角スペースは常に表示させてる。
4で表示させる時はタブ消す。
ちなみに秀丸でした。
4のほうがイイヨー 8は横行き過ぎだ 2重ネストで見にくくない?3重になると・・・
中級になるとネストしないように書けるようになるよ。 それがPerlの醍醐味
上級になるとループすら使わずに書けるようになるもんなぁ。
987 :
984 :04/01/01 21:02 ID:???
988 :
nobodyさん :04/01/01 21:04 ID:K8LfWOde
慣れると2重くらいぜんぜんきにしない。 コードの部分が必要な機能満たしているかどうかきにするだけで。。。
>>987 grep map $_ @_ とりあえず、これらの使い方を覚えてみるといい。
驚くほどコードが短くなる。
引数を省略した時の動作とかを覚えるのも手だろう。
>>823 とか流石なくらいに短いよな。
しかしコードの長さと可読性は量子力学的に反比例の関係になるので、
自分の身の程をわきまえつつ、ほどほどにな。
>>990 > しかしコードの長さと可読性は量子力学的に反比例の関係になるので、
それは一概に言えないと思うけど...
perlじゃないけど関数型言語なんかコードが短くて可読性の高い例。
で、量子力学的に反比例ってどういう意味?量子力学的にって
不確定性原理に基づいた結論なのだろう。
量子力学的にっていう言葉がなぜ出てくるか分からないが ・読みやすければ長い ・短くすれば読みにくい つまり、 可読性∝コードの長さ/1 ということではないだろうか!!!! ・・・
994 :
984 :04/01/02 01:40 ID:???
grepを見るとELTのGrip!を連想してしまう俺って・・・
そんなあなたに連想配列(ププラッチョ
禿しくワラタ(ゲラプップー
1000!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。