【Perl】初心者コーナー Part15
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/08/08 23:19ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0036nobodyさん
02/08/09 15:04ID:???Perl昨日始めたばかりのオレでも出来ましたが…。
foreach $i (sort { $hoge{$b} <=> $hoge{$a} } keys %hoge) {
print $i, " " , $hoge{$i} , "\n";
}
0039nobodyさん
02/08/09 16:10ID:???ネタ?君は生まれた時からハッシュを知っていたんだね。素直に感謝しなさい。
>>26の時点で11:22。
>>38の時点で15:59。
0040nobodyさん
02/08/09 16:19ID:???+ + +
+
/ ̄\ +. ∧_∧ アハハハ +
ノリカエセヨー( ´∀`) (´∀` )
( つ つ ( つ つ
. + ( ヽノ ( ■ノ +
し(_) ... し(_)
0041nobodyさん
02/08/09 16:20ID:???+ + +
+
. /■\ +. ∧_∧ アハハハ +
クサーイヨー( +∀+) (´∀` )
( つ つ ( つ つ
. + ( ヽノ ( ヽノ +
し(_) ...し(_)
0042nobodyさん
02/08/09 16:20ID:???+ + +
+ アハハハ
. +. ∧_∧ / ̄\
本体カエセヨー (´∀` )(/⌒ヽ__)
ヽ■ノ (つ つ| |
. + ノ\ ( ヽノ .| ∪ +
し(_) しし′
0043nobodyさん
02/08/09 16:20ID:???父「詳細キボーヌ」
母「今日はカレーですが、何か?」
兄「カレーキターーーーーーーーー」
妹「キターーーーーーーーーー」
姉「カレーごときで騒ぐ奴は逝ってヨシ」
母「オマエモナー」
父 --------終了-------
兄 --------再開-------
妹「再開すなDQNが!それより肉うpキボンヌ」
母「ジャガイモうp」
姉「↑誤爆?」
兄「タマネギage」
父「ほらよ肉>家族 」
妹「神降臨!!」
0044nobodyさん
02/08/09 16:21ID:???0045nobodyさん
02/08/09 16:21ID:???;y=ー( ゚д゚)・∵. ターン
\/| y |)
0046nobodyさん
02/08/09 17:56ID:???0047nobodyさん
02/08/09 19:05ID:???0048nobodyさん
02/08/09 21:35ID:???$value =~ s/&/&/g;
$value =~ s/"/"/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/,/¸/g;
これを短く書きたいんですが何かありますでしょうか?
0049nobodyさん
02/08/09 21:36ID:???$value =~ tr/+/ /;
$value =~ s/&/&amp;/g;
$value =~ s/"/&quot;/g;
$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
$value =~ s/,/&cedil;/g;
0050nobodyさん
02/08/09 22:38ID:84ebYeoV0051nobodyさん
02/08/09 22:48ID:???0052親切な人
02/08/09 22:53ID:???ヤフーオークションで、凄い人気商品、発見!!!
プランテック製の「 RX-2000�V 」を改造済み
にした、アイティーエス製の「 RX-2000�V 」↓
http://user.auctions.yahoo.co.jp/jp/user/NEO_UURONNTYA#.2ch.net/
ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。
ヤフー ID の無い方は、下記のホームページから、
購入出来る様です↓
http://www.h4.dion.ne.jp/~gekiyasu/#.2ch.net/
0053nobodyさん
02/08/10 00:12ID:???そんなの短くできないって。あきらめなさい。
と言いつつトライ。
$value=~s/[\+&"<>,]/($t=index'+&"<>,',$&)?'&'.qw(amp quot lt gt cedil)[$t-1].';':' '/eg;
これ以上無理かな…
わけたままのほうが圧倒的に処理が速いぞ。
と言いつつ>>53のバグフィックス&処理速度向上版
$value=~s/\+|([\+&"<>,])/$1?'&'.(qw(amp quot lt gt cedil))[index'&"<>,',$1].';':' '/eg;
0055nobodyさん
02/08/10 01:36ID:???ソース短くしたら処理が早くなるわけじゃないぞ
正規表現あたりは激しく可読性に影響が行くから
>>53 >>54
が言ってるとおり素直にそのままにしとけ
#俺は厨だから>>54のをさらに改良したりとかできん
#てか、もう読めません・・・(;´Д`)
005654
02/08/10 03:11ID:???$value=~s/\+|([&"<>,])/$1?'&'.(qw(amp quot lt gt cedil))[index'&"<>,',$1].';':' '/eg;
0057nobodyさん
02/08/10 03:15ID:???とりあえず、(cedilはいらんだろう)
$value=~s/([\+&"<>])/$1 eq '+' ? ' ' : '&'.{qw(& amp " quot < lt > gt)}->{$1}/eg;
無名ハッシュと+を外に出せばそこそこ速くなるんじゃ無いだろか?
%slist=qw(& amp " quot < lt > gt);
$value=~tr/+/ /;
$value=~ s/([@{[join '', keys %slist]}])/'&'.$slist{$1}/eg;
か、もっと素直に、
$value=~s/$_/'&'.$slist{$_}/eg for keys %slist;
どっちにしろ>>49のままの方が速いだろうが、、
んで最終的にはこれを勧めておく。
use HTML::Entities;
$value=~tr/+/ /;
encode_entities($value,'"<>&');
005854
02/08/10 03:35ID:???>とりあえず、(cedilはいらんだろう)
条件を勝手に変えては・・・
エンティティ文字だから末尾の ; が無くては・・・
>@{[join '', keys %slist]}
この部分は典型的な処理おそーだから・・・
>$value=~s/$_/'&'.$slist{$_}/eg for keys %slist;
ハッシュキーをまわすと & が出現する順番によっては整合性が・・・
0059nobodyさん
02/08/10 03:55ID:???> 条件を勝手に変えては・・・
> エンティティ文字だから末尾の ; が無くては・・・
$value=~s/([\+&"<>,])/$1 eq '+' ? ' ' : '&'.{qw(& amp " quot < lt > gt , cedil)}->{$1}.';'/eg;
> この部分は典型的な処理おそーだから・・・
ここは一回しか評価されないので速さにはほとんど影響しないだろう。
が、
> ハッシュキーをまわすと & が出現する順番によっては整合性が・・・
を忘れとったよ。
@slist{@k=qw(& " < > ,)} = qw(amp quot lt gt cedil);
$value=~tr/+/ /;
$value=~ s/([@{[join '',@k]}])/'&'.$slist{$1}.';'/eg;
か、
$value=~s/$_/'&'.$slist{$_}.';'/eg for @k;
なら文句無いか?
あと encode_entities($value,'&"<>,'); ね。
006020
02/08/10 04:07ID:2iXM5pV6遅ればせながらありがとうございました。
おかげさまで無事に綺麗なHTMLを取得できましたー。
0061nobodyさん
02/08/10 06:08ID:???>>んで最終的にはこれを勧めておく。
>>use HTML::Entities;
>>$value=~tr/+/ /;
>>encode_entities($value,'"<>&');
>>49のと↑だとどっちが早いんですか?
0062nobodyさん
02/08/10 09:37ID:???encode_entities()のなか見てないからわからないけど
多分どちらも大して変わらないだろう。
てかね、Perlで速さを求めないでください。
速くしたいならCね
0063nobodyさん
02/08/10 17:02ID:???swap
↓ ↓
n a m c o
m a n c o
manco
(・∀・)マンコー
0064nobodyさん
02/08/10 17:04ID:???$f=$d?-1:1;$D=pack('C*',33. .86);$p=shift;
$p=~y/a-z/A-Z/;$U=~s/( . *)U$/U$1/;
$D=~s/U( . )/$1U;';($V=$U)=~s/U/V/g;
$p=~s/[A-Z]/$k=ord($&)-64,&e/eg;$k=0;
while(<>){y/a-z/A-Z;y/A-Z//dc;$o.=$_}$o.="X"
while length ($o)%5&&!$d;
$o=~s/.chr(($f*&e+ord($&)-13)%26+65)/eg;
$o=~s/X*$//if$d;$o;$o=~s/.{5}/$&/g;
print"$o|n";sub v{$v=ord(substr($D,$_{0}))-32;
$v>53?53:$v}
sub w{$D=~s/(.{$_{0})(.*)(.)/$2$1$3}}
sub e{eval"$U$V$V";$D=~s/(.*)([UV].*[UV])(.*)/$3$2$1/;
&w(&v(53));$k?(&w($k)):($c=&v(&v(0)),$c>52?&e:$c)}
0065nobodyさん
02/08/10 17:15ID:???0066nobodyさん
02/08/10 17:22ID:???これの4ページ目の13行。
0067nobodyさん
02/08/10 17:43ID:???$m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t^=(72,@z=(64,72,$a^=12*($_%16
-2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271);if((@a=unx"C*",$_)[20]&48){$h
=5;$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$
d=unxV,xb25,$_;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d>>8^($f=$t&($d>>12^$d>>4^
$d^$d/8))<<17,$e=$e>>8^($t&($g=($q=$e>>14&7^$e)^$q*8^$q<<6))<<9,$_=$t[$_]^
(($h>>=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;eval
0068nobodyさん
02/08/10 19:15ID:???&print($logfile,@data);
とやって
sub print
{
open(DATA,">$_[0]") || exit; print DATA $_[1];
}
ってやるとうまく書きこめません。
$logfileはログファイルの場所→ $logfile = "./log.dat";
@dataには記事のデータが。中身はだいたいこんな感じです↓
$data[0] = "2<>test<>名無し<>test<>0123<>\n";
$data[1] = "1<>test<>名無し<>test<>0123<>\n";
どうすればうまく↑のようなやり方で書きこめるでしょうか?
つまり@dataの中身をサブルーチンprintに受け渡したいのですが、、
0069nobodyさん
02/08/10 19:29ID:???これの意味がわかってやってんだろうな。
0070nobodyさん
02/08/10 19:30ID:???007168
02/08/10 19:44ID:???print DATA $_[1];
こうやってみたんですがどうも。。
open(DATA,">$_[0]") || exit;
print DATA $_[1];
一行目でlog.datを書きこみ専用でオープンしてもし開けなかった場合はexit
2行目でファイルハンドルDATAに$_[1]の中身を書きこんでるんですよね?
$_[1]に@dataの中身をいれたいんですがどうも配列の先頭要素しか受け渡しできませんでした。
@_[1]にもしてみたんですがうまくいきませんでした・・
どうやれば配列を受け渡せるのでしょうか?
007268
02/08/10 19:49ID:???ちょっと渡来してみます
0073nobodyさん
02/08/10 19:50ID:???どこがモジュール?
サブルーチンにしなくてもいいんじゃないか?
007468
02/08/10 19:54ID:???>>73
たしかにそうなんですが何回か読み書き作業をするので行数がかさんできたため
モジュールに、、サブルーチンとかパッケージ化でもよかったんですが
モジュールが一番よさそうだったので・・
あと趣味で作ってるので使いまわしするのでできるのは全部モジュール化しといたほうがあとでらくかなーと思いまして・・
0075nobodyさん
02/08/10 20:43ID:???URLはタグ等で囲まれたりしていません
0077nobodyさん
02/08/10 22:10ID:???0078nobodyさん
02/08/10 23:09ID:0iqc1GSZされません。どうやるのですか?
0080コギャルとHな出会い
02/08/10 23:15ID:FTkfInMw朝までから騒ぎ!!
小中高生
コギャル〜熟女まで
メル友
i/j/PC/対応
女性の子もたくさん来てね
おこずかいの欲しい女の子もたくさん来てね!!
全国デ−トスポット情報も有ります
0081ど厨房
02/08/10 23:41ID:???困ってます。でMSのactiveXギャラリーに行けと言う表示が出たので行ってみ
たけど何をDLしていいのか・・罵倒覚悟です。誰か教えてください・・・
0082nobodyさん
02/08/11 02:25ID:uMk9XU0wPERLと関係あるのか?
漏れが無知なだけか
0083nobodyさん
02/08/11 11:47ID:U9P8YsFW書き込み時にログに記録されたIPを、そのままHTML出力に表示させたいのですが、
全部の行が今の自分のIPになってしまいます。
$ad = $ENV{'REMOTE_ADDR'};
とCGIに記述して、
表示させたい部分に$adを埋めるだけじゃダメなんですか?
IP表示ができるCGIを落として解析しても、同じような記述しか出てこないもので。
ex) print (($ENV{'REMOTE_HOST'}) ? $ENV{'REMOTE_HOST'} : $ENV{'REMOTE_ADDR'});
ex) if($sw_host==1){
print "<FONT SIZE=$moji1 COLOR=\"$DTcolor\">\n";
print "$date<BR>$ip $host\n";
print "</FONT>\n";
0085nobodyさん
02/08/11 12:32ID:U9P8YsFWログには保存しているんです。
ただ、HTML出力のソースを見ると、>>83のように、
$ENV{'REMOTE_ADDR'}; したものを$adみたいにして出力するような記述なんですね。
ログから引っ張ってるような記述が見当たらない…
0086nobodyさん
02/08/11 12:37ID:???【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/l50
上のスレのお世話になってはいかが?
008785
02/08/11 12:41ID:U9P8YsFW# IPアドレスを取得
$addr = $ENV{'REMOTE_ADDR'};
if ($name eq "") { $name = $addr; }
して
unshift (@lines,"$date<>$n_name<>$n_email<>$com<>$n_color<>$addr<>\n");
つまりログには保存されています。
これがなぜ、吐き出しになるとだめなのか、今やっとわかりました。
# ログを展開
open(IN,"$logfile") || &error("Open Error : $logfile");
while (<IN>) {
$head = $point;
local($date,$name,$mail,$com,$color,$ip) = split(/<>/);
$addrとすべきところを故意に$ipとして吐き出さないように記述してあったからみたいです。
0088nobodyさん
02/08/11 13:10ID:???008985
02/08/11 13:15ID:U9P8YsFWこちらはDBファイルのデータがタブ区切りで、読み出しもただ変数を羅列しているため、
その順番どおりに表示するようになっていました。
もともとIPは記録しない仕様のため、適当にタブの間にIPを付け足したのが間違いで、
読み込みの順番どおりにDBファイルのタブ区切りを修正したら表示されるようになりました。
俄然perlが面白くなってきますたよw
0091nobodyさん
02/08/11 13:37ID:???スクリプトはちゃんと吐き出してる。$ipとして。
0093nobodyさん
02/08/11 16:05ID:wwIT5eGLこのスクリプトなのですが、時間設定で
sprintfを使わずに、
if ($month < 10) { $month = "0$month"; }
if ($mday < 10) { $mday = "0$mday"; }
if ($sec < 10) { $sec = "0$sec"; }
if ($min < 10) { $min = "0$min"; }
if ($hour < 10) { $hour = "0$hour"; }
としたり、
($sec_t,$min_t,$hour_t,$mday_t,$mon_t,$year_t,$wday_t,$yday_t,$isdst_t) = localtime(time + 7*24*60*60);
($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60);
という風にlocaltimeとgmttimeを使い分けたりする意味はあるのでしょうか?
前者は処理が早くなるとか・・・?
オシエテクダサイ
0097nobodyさん
02/08/11 19:40ID:???0098nobodyさん
02/08/11 19:44ID:???そうでもないものなんですか
0099nobodyさん
02/08/11 19:44ID:???0100nobodyさん
02/08/11 19:46ID:???0101お願い!
02/08/11 19:56ID:5quTF2lDというテキストを
2ch
2ch
2ch
というように改行させたいです。
テキストエディタの置換機能で「2ch」→「2ch\r\n」としたら、
2ch\r\n2ch\r\n2ch\r\n
となってしまいますた。
テキストエディタで改行するのって無理ですか?
ActivePerl入れなきゃだめかな?
0102nobodyさん
02/08/11 19:57ID:???0103nobodyさん
02/08/11 20:32ID:???たとえば7日以内としたら
#!/usr/local/bin/perl
$times=書き込み時のtime;
$limit=7*60*60*24;
$now=time;
$limit_time="$now-$limit";
print "Content-type: text/html\n\n";
if($times>$limit_time){print"NEW";}
でいいと思うのですが、上手くできませんでした。
ヒントを頂けないでしょうか?
$times が当時の書き込み時間で
$now が現在の時間なんでしょ?
だったら
$now - $times
で何秒たったか分かる
たとえば$nowに110000がはいってて$timesに100000がはいってれば
その差は10000秒になる
んでこれと$limitを比べればいいんでないの?
0106nobodyさん
02/08/11 22:53ID:QpOp3e8Yおい。お前ら!応援投票しろ!
0107nobodyさん
02/08/11 23:56ID:???whileで回す方法と、配列に一気に読んでforeachで回すのとでは
メモリは食うけど、foreachで回すほうが処理は速いんですかね?
それともwhileで回す方法が速い?
0108nobodyさん
02/08/12 00:15ID:???使いこなせるかな? readでも使ったら?
0109nobodyさん
02/08/12 00:25ID:???0110nobodyさん
02/08/12 01:49ID:y1lt6txeブラウザに記憶される名前が変になります。
ひろゆき、だとしたら、「ひろゆき_30__checked_red_30_8/12(月)1:30_2_checked_」
どうも、リロード時間や文字色等の情報まで全部ついてきてしまってるようで…
これは固有のバグでしょうか。
0111nobodyさん
02/08/12 01:58ID:???0112nobodyさん
02/08/12 02:02ID:y1lt6txeでも、他サイトの無改造のゆいぼっとにクッキー全部消去してからお邪魔して
退室したあとにまた入室画面で名前欄を見ると同じようになってるんですよ。
0113110
02/08/12 02:11ID:y1lt6txeなぜ、 \t で区切ったものが、吐き出されるときに _ に変わってるんだろう。
sub getcookie{#くっきーを頂きます。
$cooks = $ENV{'HTTP_COOKIE'};
$cooks = '' unless($cooks =~s/.*yuidata=(.*)yuiend.*/$1/);
($name,$reload,$email,$mode,$color,$window,$lastdate,$count,$autoclear) = split(/\t/, $cooks);
$histry = "$count回目:LAST LOGIN:$lastdate" if($lastdate);
if(!$count){#くっきー情報の無い場合のデフォルト値
$reload = 30; $mode = 'checked';$color = 'red'; $window = 30;
$count = 1;$autoclear = 'checked'; }
}#getcookie END
sub setcookie{#くっきーをブラウザにプレゼントします。
local($dmy,$mdc,$monc,$yrc,$wdayc,$mc,$yc);
($dmy,$dmy,$dmy,$mdc,$monc,$yrc,$wdayc,$dmy,$dmy) = localtime($times + 7776000);
$yc = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') [$wdayc];
$mc = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec') [$monc];
$yrc = $yrc+1900;$mdc = "0$mdc" if ($mdc < 10);
$count++;
$data = "$name\t$reload\t$email\t$mode\t$color\t$window\t$date\t$count\t$autoclear\tyuiend";
$data = 'yuiend' if($FORM{'cook'} ne 'ok');
print "Set-Cookie: yuidata=$data; expires=$yc, $mdc-$mc-$yrc 00:00:00 GMT\n";
0114nobodyさん
02/08/12 02:14ID:???0115110
02/08/12 02:41ID:y1lt6txe= split(/\t/, $cooks);
を
= split(/_/, $cooks);
にしてしまったらうまくいきました。
しかし、環境依存でバグが出るかもしれませんね。
UNIXやMACのクッキーはよく知らないんですが。
0116110
02/08/12 02:47ID:y1lt6txeなんか、IE6.0のバグっぽい。
ということは、それ以外のブラウザではやはり問題が起きてないかもですね。
0117nobodyさん
02/08/12 02:50ID:???IEが正しくて、ほかが間違ってる
んなこたぁない。IEが間違えてることの方が多い。
0118110
02/08/12 03:02ID:y1lt6txeIE6にあわせた修正をしたバージョンでは逆にトラブルになりました。
区切りを本当に_ にしたがダメ。区切りとsplitを, であわせたところ、
IE6、ネスケともにトラブルは収まりました。
MS、恐るべし…
0119nobodyさん
02/08/12 03:05ID:VEDKxtaL違うな
IEが間違ってて、そのCGIも間違ってる。
そして仕様と言い張る。
0120nobodyさん
02/08/12 03:16ID:???制御文字はNG
http://www.ietf.org/rfc/rfc2965.txt
0121nobodyさん
02/08/12 03:20ID:???まぁ、CSSもネスケ4.7が悪い品。
0122nobodyさん
02/08/12 07:05ID:???いえいえ悪いのはオマエの頭だけです
0124nobodyさん
02/08/12 14:23ID:???0125困ったチャン
02/08/12 17:38ID:???パスワードを入力して
認証してOKならページ移動
の処理を作成中なんッスけど
認証のためのデータをあるファイルから
参照してハッシュを使ってIDをキーにして
パスワードをデータにして、
IDを比較するのはOKなんッスけど、
パスワードの比較はどうしたらイイんでしょうか?
ようはキーの中身の比較っすね
0126困ったチャン
02/08/12 17:58ID:???0127nobodyさん
02/08/12 18:26ID:???0128困ったチャン
02/08/12 18:30ID:???0130nobodyさん
02/08/12 22:25ID:???0131nobodyさん
02/08/12 23:21ID:???0132nobodyさん
02/08/12 23:50ID:???…そんなcgiってありますか?
もしあったら、参考になるサイト、もしくはプログラムを
お教え下さい。
0134nobodyさん
02/08/13 00:08ID:???0135nobodyさん
02/08/13 01:27ID:???ほれ。
文化庁がトップページ以外へのリンクを機械的に拒否
http://slashdot.jp/article.pl?sid=02/07/09/0626258&mode=thread
■ このスレッドは過去ログ倉庫に格納されています