Perlコーディング初心者質問スレ Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/03/10 00:47:16ID:sT66OcmD【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
005248
05/03/11 12:11:10ID:???005415
05/03/11 12:28:51ID:BXH5EoKa他のページの出力内容を自分のページに埋め込むことができるというのはすごい!
LWPを紹介してくださってありがとうございますm(__)m
0055nobodyさん
05/03/11 12:45:14ID:???005641
05/03/11 12:57:15ID:wWuZgVEwということは、1つ目の条件式をクリアしたあと、
2つ目の条件式をクリアしたときにだけ
代入されて、次のループに移るってことですね?
0058nobodyさん
05/03/11 13:42:15ID:???$n = 100/49;
if ($nが小数点を含んでいたら){
int $n+1;
}
なんか面倒なのですがこれが普通ですか?
0059nobodyさん
05/03/11 13:43:56ID:???0060nobodyさん
05/03/11 13:47:09ID:???使う直前の方がいいですか?
後者だと重複useがでる可能性がありますが、それを良しとするなら見やすいですよね。
意見お願いします。
006215
05/03/11 14:20:21ID:BXH5EoKaところでこのLWPって制作側としてはものすごい便利ですが、これを使うと、
ユーザが直接アクセスしてもいないサイトへユーザの情報が自動的に送られてしまったりしますよね?
例えばとある悪質なアダルトサイトがあったとして、悪質だと気付かずにそこに
月額契約をした場合にその入力内容をそのまま他の数十のアダルトサイトへも
LWPでリクエストが送られて自動的に登録されてしまうような惨事も起きてしまう可能性もありますよね。
当然勝手に登録されたといっても、住所や電話番号からクレジットの暗証番号まで正確なので
下手したら裁判でも負ける気がするのですが・・・・
まあもちろんアダルトサイト管理人がLWPを使わずとも手動で顧客の情報で他のサイトにも
登録するのと同じことですが。
このあたりってみなさん気にしたことありませんか?
006310
05/03/11 14:30:12ID:???正規表現を逆にしてみたりPerlメモの文字コードの
正規表現を見ながら自分なりに書いていたつもりだった
んですけど、上手くいきませんでした。
Unicode::Japaneseは315,392 バイトあるということで、
プロジェクトマネージャに却下されました。。。
色々とご教示いただき、誠に有難うございました。
もしも カタカナ->ひらがな変換に成功した際はこちらで
報告させていただきます。
006415
05/03/11 15:05:14ID:???よくわかんないけど、jcode.plですぐできるんじゃないですか?
jcode::tr(\$str,"ア-ン","あ-ん");
もしも半角カナもというならこれをやる前に
jcode::h2z_euc(\$str);
をやるだけ。
バイト云々ならlength関数とか使いながら一旦適度な長さに分割してそれからくっつける。
そういうルーチンを自分で作ればいいけど何か問題でもあるのかな?
006515
05/03/11 15:07:40ID:???単に分割は危ないので、ちゃんと文字の区切りでやりましょう。
my @strings = $string =~ /[\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE]/og;
これはeucコードでなくてはならないので先にeucに変換して下さい。
006615
05/03/11 15:21:57ID:BXH5EoKa# リクエストを作成します
my $req = new HTTP::Request POST => 'http://www.perl.com/cgi-bin/BugGlimpse';
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');
今動作確認したらどうやら
$req->content('match=www&errors=0');
この値は自動的にURIエンコードしてくれてはいないみたいですが、
たとえば
hoge=あいうえお
なんて場合には自分で「あいうえお」だけエンコードしろっていう仕様なのでしょうか?
0067nobodyさん
05/03/11 15:29:44ID:???https以外で本名、住所書いたことないし。それもある程度有名なところ。
その他のwebで入力した情報は一般に公開したものと思ってるから気にしてないしそういうとこ個人情報は書かない。
4月から個人情報なんたらは始まるけどどうなんでしょうね。
0068nobodyさん
05/03/11 15:37:40ID:???よくわからん。そもそも勝手に登録されたものなんて無効だよ。
気にする必要なし。
006960
05/03/11 15:39:38ID:???0070nobodyさん
05/03/11 16:05:15ID:???ー
の文字がエラーになるって聞いた覚えがあるんだけど、EUCで書いてれば無問題?
0072nobodyさん
05/03/11 16:20:46ID:???そういうことをしてくれるモジュールってありませんか?
for(0..4){
print "3回目" if 3 eq;
}
とかできると便利なんですけどね。
0073nobodyさん
05/03/11 16:28:02ID:???0074nobodyさん
05/03/11 17:02:50ID:???0076nobodyさん
05/03/11 18:45:46ID:stOV0FtXprint "3回目" if /^3$/;
0077nobodyさん
05/03/11 19:20:11ID:???0078nobodyさん
05/03/11 20:08:10ID:???$value =~ s/\xa4\xa5/`/g;
$value =~ s/\xa5([\xa1-\xfe])/\xa4$1/g;
$value =~ s/`/\xa4\xa5/g;
0079nobodyさん
05/03/11 20:13:17ID:???ところで、ひらがな→カタカナの変換はあれで大丈夫?
$value = "ばぅばぅ";
$value = "靴が痛い";
こんなのが、ちとヤバイと思うのだけれど。
>>60
大抵は先頭だね。
でも、配布するモジュールでもなければ好きな所に書いていいと思うよ。
(それから、encodingは、エンコードを始める位置で宣言する必要があるはず。)
>>72
sub at($);
for(1..4){
print "3回目" if at 3;
}
sub at($){ $_ == shift }
# 意味不明な世界へようこそ。
008060
05/03/11 21:13:35ID:???やっと来た・・・・・
やはり先頭ですよね。でももしも間違って
100行目: use DBI;
.
.
.
700行目: use DBI;
とかしても表面上にはエラーにならないくらいだから、内部的にも何の問題もないんですよね?(encordingなどは別として)
0081nobodyさん
05/03/11 21:30:45ID:???実行時に評価されるのは require で。
0082nobodyさん
05/03/11 21:43:35ID:???useやrequireは何度呼び出しても問題にはならないことになっている。
モジュールを先頭で呼び出すのは分かりやすくする為にすぎないので、実際に使う分にはどこに書いても構わない。
0083nobodyさん
05/03/11 21:57:38ID:???大丈夫。
http://www.harukaze.net/~mishima/perl/man/perlfunc.1.html
> use Module
> 指定したモジュールから、現在のパッケージにさまざまな
> 内容をインポートします。 多くは、パッケージのサブル
> ーティン名や、変数名に別名を付けることで、実現されて
> います。 これは、
>
> BEGIN { require Module; import Module LIST; }
>
> というのと、全く同値です。
> require EXPR
...
> ファイルは、同じ名前で 2 回読み込まれることはありま
>せん。
http://www.harukaze.net/~mishima/perl/man/perlvar.1.html
> %INC ハッシュ %INC は、do や require によってインクルード
> された、個々のファイル名をエントリとして持っています。
> key は指定したファイル名で、value は実際に見つかった
> 場所となっています。 require コマンドは、指定された
> ファイル名が既にインクルードされているかを、この配列
> を使って調べます。
0084nobodyさん
05/03/11 23:40:01ID:???useは頭に並べておくのが良いと思います。
0085nobodyさん
05/03/11 23:55:38ID:???後からどんどんルーチンが増えていく時に、useだけルーチンから出しておくと、
何かと面倒。
なので俺は両方に書いてる。
0086nobodyさん
05/03/12 00:26:54ID:???ログインとかログアウトってどうやるんですか?
CGI::Session使えば簡単なセッションはできますが、相手のIDとPASSをセッションファイルに入れればいいのかな?
なんかセキュリティ云々がよくいわれてますが、どちらにしても言うほどのセキリティなんか実装しようがないですよね。
つまりどのレベルまですれば一般レベルなのかということです。
CGI::sessionでセッションIDはクッキーに焼くことで渡し、セッションファイルにIDとパスを。
IDとパスが実在すればログイン状態。
↑これはセキリティ的に足りないでしょうか?
0087nobodyさん
05/03/12 00:43:48ID:???・IPの一致チェック
・cookieはディスクに保存させない
・可能ならSSLを使用
スクリプト作成者にできることはこれくらいでは。
それと、パスは保存する必要なしかと。
0088nobodyさん
05/03/12 02:35:22ID:DLGfeKNq0089nobodyさん
05/03/12 03:03:55ID:???セッションで渡り歩かなくても済むような構成にしてしまうのも手。
渡り歩いた履歴はCookieに溜め込んで、最後のページでIDとPassを入力させて完了とか。
>>88
int()をちょいと工夫すればOK。マイナスには気をつけるよろし。
0090nobodyさん
05/03/12 07:24:17ID:???透過PNGの出力ができないんだけど、仕様ですか?
(透過しない)
透過GIFならできました。
0093nobodyさん
05/03/12 15:33:01ID:???0095nobodyさん
05/03/12 17:09:44ID:???0096nobodyさん
05/03/12 19:44:08ID:???ちょっといまさらだけど。
useは、通常の実行文ではなくて、コンパイル中に実行される文だから、普通は先頭。
例えば、
1 + 1;
use hoge;
2 + 2;
とか、書いてしまっても、
絶対にuseから処理される。
if(bool){
use hoge;
}
とか書いても、ifとか、そんな次元じゃなく、
1番最初にuseが処理される。
だから、普通は先頭に書く。
実行結果は、どこに書いても同じになるかもしれないけど、やっぱ普通は先頭。
スコープに影響するプラグマモジュールなら、話は別で、
適切な場所に書いておくよろし。
(ただし、この場合も実際にはuseは最初に処理されている)。
requireは、実行中に処理される普通の文なので、常に適切な場所が良いと思う。
でも、どこに書いても構わないなら、やっぱ先頭がいいなー。わかりやすいから。
0097nobodyさん
05/03/13 08:25:22ID:oiuJgK8iメモリやばいですよね?
0101nobodyさん
05/03/13 11:44:21ID:???確認する方法はある?
0103nobodyさん
05/03/13 13:32:47ID:???chmod … || die
0104nobodyさん
05/03/13 15:24:50ID:???テンポラリクッキーを使うのですか?でもそれって相手側に協力を求める必要があるんですよね。
IPチェックはちょっと面倒ですが、ログイン時の人間であるかどうかを確認するとセキリティの向上には
なかなかの効果がありそうですね。
SSLは当然です^^
>>89
それだとちょっと利便性が落ちそうですね。
会員価格とかが実現しづらくなります。
あ、IPチェックも無理だ・・・・・
携帯は確か毎回違うIP提出してくるキャリアがあるんだった・・・・
0105nobodyさん
05/03/13 15:25:19ID:???0107nobodyさん
05/03/13 18:35:32ID:???perl全般の質問スレになったの?
0108nobodyさん
05/03/13 18:39:04ID:???0111nobodyさん
05/03/14 11:03:24ID:???それはスレを分けても変わらないでしょ。
基本的にこの板内のPerl関係の質問は大抵同じ人間が回答してるんだから
個人的には分割することに意義を感じられないな。まあ既に分かれてるものを
無理してくっつける必要があるというわけではないけどさ。
0112nobodyさん
05/03/14 13:44:36ID:???回答者はどのスレでも一緒だろうな
そろそろどっかとまた合併すんじゃね?
0113nobodyさん
05/03/14 14:07:00ID:???ヲタク板なんて細分化する必要ないのになぁ。
0114nobodyさん
05/03/14 14:52:44ID:???0115nobodyさん
05/03/14 16:09:47ID:???0116nobodyさん
05/03/15 10:01:02ID:3Ik8WJWFtp://tech.bayashi.net/pdmemo/gzip.html
これを/bin/gzipでなくCompress::Zlibでやりたいのですが
open(STDOUT,"| $gzip -1 -c");の部分をどのように処理すればいいか
分かりません。どなたかご教授願います。
0117nobodyさん
05/03/15 10:28:44ID:???0118nobodyさん
05/03/15 11:26:01ID:???ユーザ層ごとに分けてどうするのよ。どうせ同じPerlだろ。
周辺関連に差は出るが、広い意見だったりちょっと関係ない知識までつくのが大手掲示板の利点でしょ?
CGIは作れるがwindowsで使える簡単なソフトは作れないなんていう人はこの板には結構いそう。
なんかもったいない。みんな一緒なら、知らずに目に入って付く知識で十分できるようになるのに。
って個人的な意見ゴメンね,(__),
0120116
05/03/15 11:56:36ID:3Ik8WJWFご回答ありがとうございます。
教えていただいたwebに私のやりたい処理と似たような処理が紹介されてましたが
ちょっと違う感じです。スクリプト内部にprint文で書かれた内容全部をgzip圧縮させて
転送させたいです。スクリプトを貼り付けると、以下のような感じで処理したいです。
##の部分がうまくいきません。
#!/usr/bin/perl
use Compress::Zlib;
if ($ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/) {
print "Content-type: text/html\n";
if($ENV{'HTTP_ACCEPT_ENCODING'} =~ /x-gzip/){
print "Content-encoding: x-gzip\n\n";
} else {
print "Content-encoding: gzip\n\n";
}
## ここで$bufferに<h1>Hello world</h1>以下の出力内容全てを代入したい
print Compress::Zlib::memGzip($buffer);
} else {
print "Content-type: text/html\n\n";
}
print "<h1>Hello world</h1>";
print "aaaaaa";
0121nobodyさん
05/03/15 12:24:33ID:???printした後は標準出力に渡されるのでPerlでは圧縮しようがないのだが。
パイプでつなぎたくなければ圧縮してからprintするしかなかろう
0122nobodyさん
05/03/15 12:35:49ID:???ID番号の出るスレッドに書き込みしたのですが
どうしてもそのレスを消したい場合に方法はないのでしょうか?
すごく困っています。絶対入れてはならないことをレスしてしまったもので・・
0123nobodyさん
05/03/15 12:39:02ID:???レスの削除は、削除依頼板。
http://qb5.2ch.net/saku2ch/
0124nobodyさん
05/03/15 12:52:16ID:???どこやねwん
0125116
05/03/15 13:03:28ID:???ご回答ありがとうございます。
tp://www.rfs.jp/sitebuilder/perl/02/08.htmlを参考にして子プロセスを作ることで出力を$bufferに代入することができました。
回答していただいた方々ありがとうございました。
参考までに成功したスクリプトを貼っておきます。(直したほうがいいところは指摘お願いします)
#!/usr/bin/perl
use Compress::Zlib;
if ($ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/) {
print "Content-type: text/html\n";
if($ENV{'HTTP_ACCEPT_ENCODING'} =~ /x-gzip/){
print "Content-encoding: x-gzip\n\n";
} else {
print "Content-encoding: gzip\n\n";
}
if( open BUF, "-|" ){
while ($buf = <BUF>) {
$buffer = $buffer.$buf;
}
close(BUF);
print Compress::Zlib::memGzip($buffer);
exit(0);
}
} else {
print "Content-type: text/html\n\n";
}
print "<h1>Hello world</h1>";
print "aaaaa";
0127125
05/03/15 13:06:21ID:???それ以外で直したほうがいい部分は指摘ください。
0128122
05/03/15 13:31:20ID:???ですが、とてもじゃないけど、該当する項目がなくって無理でした。
というのが、自分の独り言を赤裸々にタイピングしてる途中に、
間違って「書き込む」のボタンを押してしまったんです。
しかも、人に知られたら恥ずかしいし、どうしようもない内容なんです。
で、IDが1日たっても変わってなかったってのもあって、きっと誰かが
それに気付いて恥をかくか、煽りの的になるなーと思うと、もー気になって
気になってパニックしてます。書き込みは慎重に行うべきですね。
0131nobodyさん
05/03/15 16:10:30ID:???MySQLだけでは無理だと思うのでPerlでやるしかないと思うのですが、
name,age,mail
太郎,19,[email protected]
次郎,28,[email protected]
....
こういうデータからnameの重複文だけ表示させたいのです。
こういうのって1回ずつやらないといけないのでしょうか?
my $data = select 1番目のデータ取得
my @重複 = select 色々 where name=$data
みたいに。(変な書き方ですみません。)
dataの中から例えばメールアドレスが重複してるのがあるかないか、あるなら
それをすべて表示。
一発で[email protected]という値がいくつ重複してるか、[email protected]がいくつ重複してるかを調べたいのです。
0133nobodyさん
05/03/15 16:40:21ID:???そう? 少し気になるとこもあるけど、まだマシな方だと思うなあ。
というわけで >>126 お手本プリーズ
013448
05/03/15 16:49:20ID:???>MySQLだけでは無理
普通にできますが
SELECT count(*) AS `count`, * FROM `table` GROUP BY `name` HAVING `count` > 1 ORDER BY `count` DESC
0135134
05/03/15 17:01:28ID:???SELECT count(*) AS `count`, `name` FROM `table` GROUP BY `name` HAVING `count` > 1 ORDER BY `count` DESC
0137nobodyさん
05/03/15 22:04:08ID:???0139138
05/03/15 22:06:55ID:???0142nobodyさん
05/03/15 22:17:03ID:???0143138
05/03/15 23:51:35ID:???圧縮された内容にヘッダが付かないようにしたのと、
forkに失敗したときの対策。
my $pid;
if ($ENV{HTTP_ACCEPT_ENCODING} =~ /((?:x-)?gzip)/){
my $encoding = $1;
if ($pid = open(BUF, "-|")){
local $/;
my $buffer = <BUF>;
close(BUF);
print "Content-encoding: $encoding\n",
"Content-type: text/html\n\n",
Compress::Zlib::memGzip($buffer);
exit;
}
}
if (not defined $pid){
print "Content-type: text/html\n\n";
}
print <<"EOF";
<html>
<head><title>test</title></head>
<body><h1>Hello world</h1><p>test-test</p></body>
</html>
EOF
exit;
0144nobodyさん
05/03/16 00:23:12ID:???my $encoding = $1;
local $/ = undef;
print "Content-Encoding: $encoding\n",
"Content-Type: text/html\n\n",
Compress::Zlib::memGzip <BUF>;
close BUF;
exit;
}
print "Content-Type: text/html\n\n",
<<"EOF";
<html>
<head><title>test</title></head>
<body><h1>Hello world</h1><p>test-test</p></body>
</html>
EOF
0145nobodyさん
05/03/16 01:23:42ID:???しかし local $/ = undef; っていいな、使える。 いままで気づかなかったよw
コードはいいけど、HTML中途半端なのは何でかなw
どうせ省略するなら title と p だけでいいのに。
0148nobodyさん
05/03/16 11:21:44ID:uAWX38vAURL中に?があるときだけうまく取り出せません
念のためエスケープしてもうまくいきません
たすけて
348 while ($main=~m/(<a href=\"(.*?)\">(.*?)(?: +?)?(?: +?)?<\/a>)/ig){
349 $matc1=$1;$matc2=$2;$matc3=$3;
350 if ($matc2 eq $matc3){
351 $main=~s/\Q$matc1/$matc2/;
352 }else{
353 $main=~s/$matc1/$matc3 $matc2/;
355 }#if else;
356 }#while;
0149nobodyさん
05/03/16 13:37:59ID:???いろいろ無駄っぽw
$main =~ s{<a href="(.*?)">\s*(.*?)\s*</a>}{ ($1 eq $2) ? $1 : $1 .' '. $2 }eig;
0150nobodyさん
05/03/16 13:40:10ID:???0151nobodyさん
05/03/16 14:36:59ID:???別にeqまでしなくていいでしょ。それならtitleとか考慮したら?
s{<a\s+.*?href="(.*?)".*?>\s*(.*?)\s*</a>}{$2 $1\n}ig;
■ このスレッドは過去ログ倉庫に格納されています