【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。
0557nobodyさん
03/03/04 20:37ID:???例えば、<em>mona>/strong>や
終了タグの閉じ忘れでエラーがでる
のですが、具体的にどうすればよいのかさっぱりです。
何がいい方法があれば教えて頂けないでしょうか。
0558nobodyさん
03/03/04 20:40ID:???validatorにかけてみる。
http://validator.w3.org/
0559557
03/03/04 20:44ID:???>>558
例えば掲示板の投稿時なんかに最低限のチェックをしたいだけなのでvalidatorはちょっとです。
0561577
03/03/04 20:58ID:???>>560さん
タグは属性をもつものや空要素も含めて全て許可しています。
最低限属性を持たないタグの整合性だけでもチェックしたいのですが。
0565validator厨
03/03/04 22:15ID:???0566nobodyさん
03/03/04 22:35ID:???0567T女の竹田
03/03/04 22:50ID:???タグの中で'<'や'>'が書けないのは仕様です。
my $temp = $to_check;
$temp =~ s|<!--.+?(-->)||sg;
$temp =~ s{<(script|style).*?(</\1>)}{}sgi;
$temp =~ s{</?(br|p|li|hr|meta|input|img|base)[^>]*>}{}sgi; # 閉じないことを許可するタグ
while ($temp =~ s|<(\w+)[^>]*>[^<>]*(</\1>)||si){}
error() if $temp =~ /[<>]/s;
>>566 気づかなかった。
0568561
03/03/04 22:53ID:???取りあえずこんなの書いてみますたが
$data = "<a><b>a</b></a><c /><d></f>";
my(@stack) = ();
while($data =~ /<\/?(\w+)\s*.*?>/){
if($data =~ /<(\w+)>/){
push(@stack,$1);
}elsif($data =~ /<(\w+)\s*\.*?\/>/){
;
}elsif($data =~ /<\/(\w+)>/){
$tmp = pop(@stack);
if($1 ne $tmp){die "不整合";}
}
$data =~ s/<\/?(\w+)\s*.*?>//;
}
print "end\n";
なんかスマートじゃないですね。というかそれ以前に正規表現が怪しい。
属性がつくともうだめぽ
>>565
きっと誰も従いませんよ(w
0570T女の竹田
03/03/04 23:03ID:???どっちにしても役に立たなさそうだけど。
$temp =~ s|<!--.+?(-->)||sg;
$temp =~ s{<(script|style|pre|textarea)(\s[^>]*)?>.*?(</\1>)}{}sgi;
$temp =~ s{</?(br|p|li|hr|meta|input|img|base)(\s[^>]*)?>}{}sgi; # 閉じないことを許可するタグ
while ($temp =~ s|<(\w+)(\s[^>]*)?>[^<>]*(</\1>)||si){}
0571nobodyさん
03/03/04 23:22ID:TX/Dujet$str2="2003年03月04日" を生成したいのですが
どうすればよいですか?
0573561
03/03/04 23:24ID:???正規表現雑技の方は$(の辺りが今一解読できてませんが。
>>570さん
役に立たないなんてそんな。
\数字は目からウロコでした。さっき書いたコードが恥ずかしいです。
当面の間このコードを借用させて頂きます。ありがとうございました。
0575nobodyさん
03/03/05 01:23ID:???それは $str1 の内容も書き換えるので
($str2 = $str1) =~ s/(\d{4})(\d{2})(\d{2})/$1年$2月$3日/;
0576nobodyさん
03/03/05 23:48ID:LLn1UqDhぜんぜん勉強法が見えてきません。“ Perl で”っていう時点で、もう駄目なのかなあ・・・やっぱ PHP なんですかね?
もし宜しければ、オススメのサイトや参考書を教えて頂きたいのですが。
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とかだとさっぱり使ってないんでしょう?
そんなの配布サイトに聞けッ!て感じですけど
ご意見聞かせて下さい。
■ このスレッドは過去ログ倉庫に格納されています