【Perl】初心者コーナー Part19
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/02/09 00:24ID:s0tpWWxg1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は【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。
0578nobodyさん
03/03/06 00:04ID:/oqmBN820579nobodyさん
03/03/06 00:09ID:???newでの変数初期化がされない現象が起こるのですが、これはperlの仕様ですか?
↓-------------------- a.pl
package a;
sub new{
my $this=shift;
my $a=0;
my $obj{'obj'=>$a};
bless $obj,$this;
return $obj;}1;
↓--------------------- b.pl
package b;
require('./a.pl');
sub new{
my $this=shift;
my $b=0;
my $obj{'obj'=>$b};
bless $obj,$this;
return $obj;}
sub test{
my $a = new a;
print "a=$$a{'obj'}";}1;
↓--------------------- main.cgi
require('./b.pl');
sub test
{my $b = new b;
$b->test();}
-------------------------------------
結果:a=
(何も表示されない)
0580nobodyさん
03/03/06 00:13ID:???まずは道具をインストールする。
で、SQLを適当に理解する。
あとは、
connect prepare execute fetch finish disconnect
0581nobodyさん
03/03/06 00:13ID:???0583nobodyさん
03/03/06 00:18ID:???前置(?)のnewは、コンパイルするときに、それが関数か、
メソッドかを決定しないといけない。
で、newっていうサブルーチンがある(ように見える)から、関数になった。と。
a->new()でどうだ。
0584579
03/03/06 00:22ID:???あい、それは承知してます。
newでオブジェクトのメンバを初期化したいという意味でした。
>>579の場合だと、a.plで
$a=0;
・・・
$obj={'obj'=>$a};
としているのに、bから作成したときは$a->{'obj'}に0が入っていないのです。
(0以外でも同様。main.cgiから直接作成した場合は初期化される)
これがバグなのか、仕様なのかどこにも説明してないので設計に困ってます。
0586nobodyさん
03/03/06 00:26ID:???http://www.geocities.co.jp/SiliconValley/5634/t82E2_0001.html#1941
http://www.geocities.co.jp/SiliconValley/5634/t82A2_0003.html#2203
0587nobodyさん
03/03/06 00:28ID:???0589nobodyさん
03/03/06 01:02ID:???0590nobodyさん
03/03/06 11:24ID:rJoYB8KP0592nobodyさん
03/03/06 12:35ID:nlUIeg7X日本語を交えて変数を作りたいのですが、
「全部」ハッシュにしたらアホでしょうか?
$file{'ログファイル'}
$file{'登録ファイル'}
やっぱ重くなりますか?
アホ丸出しのような気がしますが、この方が作りやすいんです。
0595nobodyさん
03/03/06 13:28ID:???0597nobodyさん
03/03/06 15:09ID:???そでつ
0598nobodyさん
03/03/06 16:25ID:???Unicodeでなんとかならんか?
0599nobodyさん
03/03/06 16:42ID:???別にいいんじゃない?
ハッシュの構造上、考えてるほど重くはならないよ。
ただ、他人がそのソースを見たら( ´,_ゝ`)プッ とは思うかも。
0600nobodyさん
03/03/06 18:20ID:mX/0qgeVそんなあなたにPerlのオブジェクト指向文法!
$this->{field} = 'test';
$this->{公安二課課長補佐} = undef;
主な利点:日本語がちょっとだけ目立たない。
0601nobodyさん
03/03/06 18:25ID:???> use encoding "euc-jp"; # スクリプトと同じ文字コードを指定
> use utf8;
> my $人 = 1;
> $人++; # 私たちは繁殖している!
0602601
03/03/06 18:26ID:???0604nobodyさん
03/03/06 20:58ID:+0RpBVtXppm> install win32-api
Error: no suitable installation target found for package win32-api.
と表示されインストールできませんでした。
ppm>sarch win32-api
ppm> search win32-api
Searching in Active Repositories
1. Win32-API-OutputDebugString [0.03] OutputDebugString Win32 API support
ppm> install 1
Package 1:
Error: no suitable installation target found for package
Win32-API-OutputDebugString.
サーチをかけてインストールしてもパッケージがないと言われます。
また、
no suitable installation target found for package
の一文で検索をかけても英語圏HPしかでてこず、多分どこかにパッケージを
ぶち込んだらOKだと言う解釈なのですがどうにもヘタレ読解力ではキビシイです。
アドバイスお願いできないでしょうか?
0606nobodyさん
03/03/06 21:13ID:+0RpBVtX0607nobodyさん
03/03/06 21:46ID:+0RpBVtX環境はXPproでc¥perlにperlをインストールしています。
0608nobodyさん
03/03/06 22:41ID:???川o・-・)ノ <先生!こんなのがありました!
__/ / /
\(_ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄||
...|| ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/shinagawa/
0609592
03/03/07 12:00ID:???分かりました。ありがとうございます。
別に
アホ丸出しだろうが
( ´,_ゝ`)プッと思われても構わないので
今後は全部ハッシュで作ろうと思います。
0610nobodyさん
03/03/07 16:16ID:o/kX6MY9逆の「特定のホストからのアクセスをはじく」アクセス制限のCGIしか見つけられず
そこで、これを改造したら使えないかなあと考えました。
が、どこをどういじって良いのか見当がつきません。どなたかお知恵を貸してください・・。
@deny = ("*.co.jp","*.hoge.net");
sub get_host {
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
# gethostbyaddr関数を使用する場合は1
$gethostbyaddr = 1;
if ($gethostbyaddr) {
if ($host eq "" || $host eq "$addr") {
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
}
}
if ($host eq "") { $host = $addr; }
}
sub axs {
# ホスト名を取得
&get_host;
if ($deny[0]) {
local($flag)=0;
foreach (@deny) {
if ($_ eq '') { last; }
$_ =~ s/\*/\.\*/g;
if ($host =~ /$_/) { $flag=1; last; }
}
if ($flag) { &error("許可されていないアクセスです") }
}
}
0612610
03/03/07 16:20ID:o/kX6MY9sub axs {
&get_host;
if ($_ ne "@deny"){ &error("許可されていないアクセスです")}
}
0613610
03/03/07 16:21ID:o/kX6MY90614nobodyさん
03/03/07 16:24ID:???名前<->点数<->偏差値<-> の様になってます。
これを名前でuniqしたいのですが、賢い方法はあるでしょうか?
一応自分で作ったのですが、マヌケな感じで最後の人が表示されないようです。
識者の方、よろしくお願いします。
--(生データ)---
a<->17<->100<->
a<->20<->68.97<->
a<->20<->68.97<->
a<->27<->87.1<->
b<->27<->87.1<->
c<->13<->41.94<->
c<->14<->87.5<->
c<->22<->75.86<->
c<->22<->75.86<->
c<->8<->47.06<->
d<->14<->82.35<->
d<->14<->87.5<->
d<->25<->86.21<->
d<->25<->86.21<->
d<->31<->100<->
e<->16<->100<->
e<->17<->100<->
e<->27<->93.1<->
--(生データ)---
0615nobodyさん
03/03/07 16:26ID:???自分で作ったマヌケなプログラムです。
@sortedに生データが入っているとして、
foreach (@sorted){
($s_name,$s_point,$s_rate) = (split(/<->/))[0,1,2];
if($s_name eq $old_name){
$total_p = $s_point + $old_point;
$total_rate = $s_rate + $old_rate;
$old_name = $s_name;
$old_point = $total_p;
$old_rate = $total_rate;
$howmany ++;
}elsif ($s_name ne $old_name){
$average=sprintf('%4.2f', $old_point / $howmany); $average+=0;
$rate_avg=sprintf('%4.2f', $old_rate / $howmany); $rate_avg+=0;
push(@uniq, "$old_name<->$old_point<->$howmany<->$average<->$rate_avg\n");
$old_name = $s_name;
$old_point = $s_point;
$old_rate = $s_rate;
$howmany = 1;
}else{ print "Error!! does not match!!\n";}
}
shift @uniq;
@uniq = reverse sort { (split(/<->/,$a))[3] <=> (split(/<->/,$b))[3] } @uniq;
0616610
03/03/07 16:33ID:o/kX6MY9待った・・・根本的なところが、、、
ごめん、超厨房な質問。
$_ の意味はなんでしょう。$名前 (変数)とは違いますよね。
#手元の入門書には$hogehogeと@hogehogeの説明はあるんだけど$_がない
0618610
03/03/07 16:37ID:o/kX6MY9そういうことなんですね・・。
ということは>>612はダメじゃん(死)
0619610
03/03/07 16:39ID:???0620614
03/03/07 16:43ID:???それよりおらの質問にも答えてけれ
foreach (@deny) {
$_ =~ s/\*/\.\*/g;
if ($host =~ /$_/) { last; }
}
if ($_ eq '') { $flag=1; last; }
if ($flag) { &error("許可されていないアクセスです") }
}
}
0621614
03/03/07 16:47ID:???foreach (@deny) {
$_ =~ s/\*/\.\*/g;
if ($host =~ /$_/) { last; }
}else{ &error("許可されていないアクセスです") }
}
0622610
03/03/07 16:50ID:???おあ、ありがとう。
今思いついて書き込もうとしたんだけど、おもっきし間違ってたよーです(冷汗)
>それよりおらの質問にも答えてけれ
ごめん・・・わっちには手に余るんだ・・初心者すぎて(苦)
#掲示板カスタマイズくらいしか経験ない。
0623610
03/03/07 17:03ID:o/kX6MY9sub axs {
&get_host;
foreach (@deny){
if ($_ eq '') { last; }
$_ =~ s/\*/\.\*/g;
if ($host =~ /$_/) { last; }
if ($_ ne "@deny"){ &error("許可されていないアクセスです")}
}
}
アクセスをはじけてるかどうかはまだチェックしてないけどね。
>>614さん、ありがとう(*^^*) 感謝です。
0624nobodyさん
03/03/07 19:23ID:???例"5aB0"
↓
0x35
0x61
0x42
0x30
0625nobodyさん
03/03/07 19:38ID:UTyY6aWY$str = "ある文字列";
chomp $str; # 必要なら
foreach( split //, $str ){
printf "0x%x\n", ord;
}
0627nobodyさん
03/03/07 19:58ID:UTyY6aWYエラーチェックはしてないでつ
あと@uniqの内容がこれで良いのか自信なし
@sorted = でーた;
@uniq = ();
my %count = ();
my %sum_point = ();
my %sum_rate = ();
foreach(@sorted){
my($name, $point, $rate) = (split /<->/)[0..2];
$count{$name}++;
$sum_point{$name} += $point;
$sum_rate{$name} += $rate;
}
foreach(sort keys %count){
my $ave_point = sprintf "%4.2f", $sum_point{$_} / $count{$_};
my $ave_rate = sprintf "%4.2f", $sum_rate{$_} / $count{$_};
push @uniq, join("<->", $_, $sum_point{$_}, $count{$_}, $ave_point, $ave_rate);
}
0628nobodyさん
03/03/07 20:48ID:???質問1.この中の<br>タグ(大文字のタグも含む)の数を数えたい場合どうすればいいでつか?
質問2.この中の後から数えてn番目の<br>タグ(大文字のタグも含む)以降の文字列を別変数に入れたい場合どうすればいいでつか?
お頼み申し上げ候
0629nobodyさん
03/03/07 21:29ID:???#三回マッチ
$val = "1<br>2<br>3<br>4<br>5<br>6<br>7<br>";
$val =~ /((.*?<br>){3})/;
print "$'\n";
0630629
03/03/07 21:32ID:???大文字も含むなら
$val =~ /(.*?<br>){3}/i;
0631nobodyさん
03/03/07 22:16ID:???2.の良い方法が思いつかないけどとりあえずこんなんで
index使ったほうがいいのかな
1. count_br(文字列)
2. separate_br(文字列,n番目)
sub count_br{
my $str = shift;
return ($str =~ s/<br>//ig);
}
sub separate_br{
my($str, $cnt) = @_;
$cnt = count_br($str) - $cnt;
my $pre = join "<br>", (split /<br>/i, $str." ")[0 .. $cnt];
return substr($_[0], length $pre );
}
0632nobodyさん
03/03/07 23:00ID:???my $new = join('', @line[ $n .. $#line ]);
0633nobodyさん
03/03/07 23:06ID:???0634631
03/03/07 23:12ID:???漏れもそれを最初は考えたんだが、<BR>以外のタグが
あったときなんかはどうすれば良いのでしょう?
回避方法が思いつかずあんな恥ずかしいソースに…
0637nobodyさん
03/03/07 23:29ID:???my $want = 3; # 3以降
my $count = 0;
my $after = '';
while($val =~ /<br>/ig){
if (++$count == $want){
$after = substr($val, pos($val));
}
}
print "count=$count after=$after\n";
出遅れた…。
0638631
03/03/07 23:33ID:???n番目の<BR>以降がn番目の<BR>を含まないならこうでいいのかな?
ベンチマークしたらほとんど変わらなかったけどソースすっきりです。
sub separate_br{
my($str, $cnt) = @_;
my @line = $str =~ /.*?<br>/ig;
return join('', @line[ ($#line-$cnt+2) .. $#line ]);
}
0639nobodyさん
03/03/08 00:35ID:???調べる事ができるのでしょうか? PERLだと、どのような
処理を用いると負荷を上げてしまうのでしょうか?
Admin設置禁止CGIスクリプト情報
http://chat-jp.com/announce/denycgi/index.html
0641nobodyさん
03/03/08 01:11ID:???0642628
03/03/08 03:36ID:???うまくいきました。
ありがとうございます。
今回は漏れの厨な脳に一番マッチした637さんのを使わせていただきました。
ただ、後から数えてn番目の<br>タグ以降の条件が前から数えてになってまつた。
0643nobodyさん
03/03/08 04:20ID:???私も詳しく負荷率調べる方法教えて欲しいのです。
0645nobodyさん
03/03/08 08:09ID:ijgyFeL70646nobodyさん
03/03/08 09:22ID:2Y4AuOiphttp://homepage3.nifty.com/digikei/
http://homepage3.nifty.com/digikei/sample/sample.html
,、-―-、
丿 <`) __
,、- ''' "二ヽ_(ヽ'`(二ニ・ | \_
/ 、 !__'、_┌´ │ / `' ー┐
/ ヽ | ` | | |
___ | ヾ__| | _,、r‐'',ニ=- | / _,、-‐'゙
_| '、| ミ/ ゙、 |_,∠-''´ ̄`'ー、  ̄|-''" |
\|. | l___l / ̄ヾ`´` | ̄ ̄ ̄`'''iー、
. |/゙|  ̄ ヽ_,、-''´`ヽ _,、,、,、,、_|______|_
| ( ´ ,、- ''゙ 丿 ヾ二二二二二二二二二|ニ!
ヽ<二二二二二>~/ / / └‐┬─‐────┬┘
0650nobodyさん
03/03/08 12:23ID:???掲示板の、
ログデータ読み込んで整形してHTMLで出力させる
みたいな感じです。
他で差が出るとすると連続書き込みさせた場合ですかね。
0651nobodyさん
03/03/08 12:52ID:???これは… 激しく読むのが苦痛。
CPU負荷は環境によるので一概には言えないが、
メモリにはかなり厳しそうなスクリプトですな。
で、>>640を読む限りだと
・禁止してないスクリプトなら設置していいよ
・でも負荷が高いときは勝手に止めることがあるからね
ということなので、CPU負荷は調べる必要ないかと。
0652世直し一揆(コピペ推奨)
03/03/08 13:01ID:lDVM7LmW●とにかく気が小さい(神経質、臆病、二言目には「世間」(「世間」と言っても、同じA型を中心とした一部の人間の動向に過ぎないのだが・・・)、了見が狭い)
●他人に異常に干渉し、しかも好戦的でファイト満々(キモイ、自己中心、硬直的でデリカシーがない)
●妙に気位が高く、自分が馬鹿にされると怒るくせに平気で他人を馬鹿にしようとする
(ただし、相手を表面的・形式的にしか判断できず(早合点・誤解の名人)、実際にはた
いてい、内面的・実質的に負けている)
●本音は、ものすごく幼稚で倫理意識が異常に低い(人にばれさえしなければOK!)
●権力、強者(警察、暴走族…etc)に弱く、弱者には威張り散らす(強い者にはへつらい、弱い者に対してはいじめる)
●あら探しだけは名人級でウザイ(例え10の長所があってもほめることをせず、たった1つの短所を見つけてはけなす)
●基本的に悲観主義でマイナス思考に支配されているため性格がうっとうしい(根暗)
●単独では何もできない(群れでしか行動できないヘタレ)
●少数派の異質、異文化を排斥する(差別主義者、狭量)
●集団によるいじめのパイオニア&天才(陰湿&陰険)
●悪口、陰口が大好き(A型が3人寄れば他人の悪口、裏表が激しい)
●他人からどう見られているか、人の目を異常に気にする(「〜みたい」とよく言う、
世間体命)
●自分の感情をうまく表現できず、コミュニケーション能力に乏しい(同じことを何度
も言ってキモイ)
●表面上協調・意気投合しているようでも、腹は各自バラバラで融通が利かず、頑固(本当は個性・アク強い)
●人を信じられず、疑い深い(自分自身裏表が激しいため、他人に対してもそう思う)
●自ら好んでストイックな生活をしストレスを溜めておきながら、他人に猛烈に嫉妬
する(不合理な馬鹿)
●後で自分の誤りに気づいても、強引に筋を通し素直に謝れない(切腹するしかない!)●自分に甘く他人に厳しい(自分のことは棚に上げてまず他人を責める。包容力がなく冷酷)
●男は、女々しいあるいは女の腐ったみたいな考えのやつが多い(例:「俺のほうが男
前やのに、なんでや!(あの野郎の足を引っ張ってやる!!)」)
0653nobodyさん
03/03/08 14:48ID:GxFJGMsn$in{$key} .= "\0" if (defined($in{$key}));
の「.」ってなんでそう?探してもみつからず、気になって気になって
夜も寝ずに昼寝してしまいます。
0655nobodyさん
03/03/08 14:52ID:???$a = $a . $b;
$a .= $b;
上を短縮した書き方が下。
他に += とか、ほとんどの演算子でこのような記法ができる。
0656nobodyさん
03/03/08 14:57ID:???ありがとうございました。これでぐっすりできます。多謝。
0657nobodyさん
03/03/08 18:26ID:6Zv33rxCuse constantがイイ!
という意見が出てるのを見てから見栄えも上級者っぽい
という事もあって使いまくってたんですけど
何故配布CGIとかだとさっぱり使ってないんでしょう?
そんなの配布サイトに聞けッ!て感じですけど
ご意見聞かせて下さい。
0658nobodyさん
03/03/08 18:30ID:???0659nobodyさん
03/03/08 18:33ID:???糞みたいなスクリプトでもそこそこ動けばいいんだよ。
あと、Perl4でも動くようにっていう配慮もあるかも。
(でも実際は新しい記法についていけてないだけの人のほうが多そうだ)
0660657
03/03/08 18:46ID:6Zv33rxCありがとうございます。
配布CGIのほとんどが使って無いので
何か自分の知らない落とし穴でもあるんじゃ?と思ってました。
ほんのわずかでも早くなってデメリットが無いのなら
使わない手は無いという感じで、これからもビシバシ使おうと思います。
0661nobodyさん
03/03/08 19:05ID:???Perlではこんな面倒なことをしないと定数すら使えないのか。
0662nobodyさん
03/03/08 19:15ID:???0663nobodyさん
03/03/08 19:32ID:???@a=grep(!$b{$_}++,@_);
foreach (@a){
print "$_\n";
}
grepの第一引数の意味がよくわかりません。({$_}とか++の意味)
重複したものを探して真の場合は取り除いている
ようなきはするのですが・・
どなたか教えてください。
0664nobodyさん
03/03/08 19:49ID:g3+hGhZvそれで新着情報ボードモードにしてあるので
$comと比較して「二重投稿禁止」のエラーを出させないようにしたいんですが
# 二重投稿の禁止
($num,$name,$com) = (split(/<>/, $lines[0]))[0,2,5];
&error("二重投稿は禁止です") if ($in{'name'} eq $name && $in{'comment'} eq $com);
↑この部分を全部消したら$numに干渉せず
記事全て[1]になってしまいます。
$in{'comment'} eq $comだけを消してもエラーが出てしまいます。
どなたか教えてください。
0665nobodyさん
03/03/08 20:09ID:???まず初期状態では %b は未定義なので、評価するとすべて偽。
grepの第1引数は、真で返すとその要素が戻り値のリストに入る。ここまでOK?
要素をキーとして $b{} を評価する。これが偽なら、はじめて出てくる要素なので
この要素をgrepの戻り値として返す。そのとき、第1引数は真にしないといけないので
!で反転させている。で、++して「その要素はすでに返した」というフラグを立てる。
これを繰り返す。
同じ要素が出てくると、$b{} は++されているので「真」になる。!で反転させると偽になり、
grepの戻り値としては返されない。結果、同じ要素は複数返されないことになる。
説明下手でスマソ
>>664
2行目だけ消せばいいと思われ。
0666nobodyさん
03/03/08 20:15ID:???$b{} はハッシュの要素を指す
! は論理否定
$_ はデフォルトの対象となる変数
(この場合はgrepによって第二引数=リストの一部が設定される)
++ はオートインクリメント(この場合は後置:式の評価後、インクリメントが発生)
0669名無しのmakoto君(名前あるじゃん
03/03/08 21:23ID:???教えてください<(_ _)><(_ _)>ペコペコ
検索してもよく出てきませんでした(恥
お願いします(たたかれてもメゲマセン←ハァ?
0671nobodyさん
03/03/08 21:49ID:???はいよ〜
http://www.google.com/search?num=100&hl=ja&ie=UTF-8&oe=UTF-8&as_qdr=all&q=perl+%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF%E3%83%BC%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9&lr=
0672nobodyさん
03/03/08 21:57ID:???フルパスからファイル名を取得したいので
以下のように作りました。
一応機能的にはokなんですが、もう少し格好良くperlっぽいやり方があれば教えてください。
なんか無駄が多いような・・
$_=$0;
$_=~ s/^(.*)\\(.*)$/\2/;
print "$_\n";
0674名無し.net
03/03/08 22:05ID:HY3rXLfE連想配列(?)についての質問なんですが、
$temp->{'001'} = "1";
$temp->{'002'} = "2";
$temp->{'003'} = "3";
という配列があり、これを通常の連想配列(ハッシュ)で
while (($name, $value) = each(%temp)) {
print "$name = $value<br>\n";
}
とやるのと同じ事をしたいのですが、可能なのでしょうか?
ご存知の方がいらしたら是非教えてくださいm(__)m
%tempを$tempにしたら、500 Internet Server Errorになってしまいました。
0676nobodyさん
03/03/08 22:12ID:???だっけ…、ちと動作させてないから動くかわからん。
■ このスレッドは過去ログ倉庫に格納されています