トップページphp
1001コメント332KB

Perlコーディング初心者質問スレ Part 61

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん2010/06/05(土) 21:11:10ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1251989472/
0967Perl忍者 ◆M5ZWRnXOj6 2011/01/14(金) 00:29:01ID:???
ガッチガチですね^^;
0968nobodyさん2011/01/14(金) 00:37:38ID:???
>>966
http://perldoc.jp/docs/perl/5.10.0/perlnewmod.pod
>・Choose a name
> (名前を決める)
> CPAN に含まれる Perl モジュールには、命名階層があり、それに合わせる必要があります。
> これがどのように整理されているかの詳細は、perlmodlib を参照してください。
> また、CPAN やモジュールリストを見て回って、どんなものか触れてみてください。

http://search.cpan.org/

http://perldoc.jp/docs/perl/5.10.0/perlmodlib.pod
> ・モジュールのための名前を選択しましょう。

> 関連したモジュール/クラスの一揃えを開発するのであれば、それは名前空間を破壊することを
> 防ぐような一般的なプリフィックスを持つネストしたクラスを使うよい練習になるでしょう。たとえば
> Xyz::Control, Xyz::View, Xyz::Model といったものです。

> もしプライベートな内部やプロジェクト固有の用途のために開発中のモジュールが決して公開
> されることがないなら、将来の公開モジュールと名前が衝突しないことを確実にしてください。
> これは、予約済みの Local::* カテゴリを使うか、 Foo_Corp::* のように名前に下線を含める
> ことで行えます。
0969nobodyさん2011/01/14(金) 01:10:22ID:???
>>968
回答ありがとうございます。
公開予定のないモジュールですので、名前に下線を含める方向で検討したいと思います。
0970nobodyさん2011/01/14(金) 01:34:59ID:???
while($html =~ s/<br \/><br \/><br \/>/<br \/><br \/>/){
print '.';
}

連続した3つの改行タグを2つの連続した改行タグに置換しようとしてるんだけど、
改行タグが置換されません。
0971nobodyさん2011/01/14(金) 02:12:58ID:???
>>970
こういうのじゃだめかしらん?

$html =~ s/<br \/><br \/><br \/>/<br \/><br \/>/gm;
print $html;
0972nobodyさん2011/01/14(金) 03:21:44ID:???
セルフ以外の値を得る場合に、アクセサのゲッターメソッドを使うという制約をつけてみようと思いました。
こういったやりかたが一般的かどうかを知りたいので、賛成意見、反対意見などがありましたら、宜しくお願いします。

ファイル操作で例えると以下のような感じです。(※セルフ=blessしたクラス名、括弧内の$は引数の有無を表している)

-- FILEクラス --
new() .................セルフを返す
set_filename($) ..セルフを返す
set_filedata($) ...セルフを返す
get_filename() ....値を返す
get_filedata() ......値を返す
read() .................セルフを返す
write() ................セルフを返す

-- サンプルコード --
my $file = FILE->new->set_filename("./aaa.txt")->set_filedata("bbb")->write->read;
print $file->get_filename . "n" . $file->get_filedata . "n";
0973nobodyさん2011/01/14(金) 07:35:58ID:???
メソッドチェーン?
0974nobodyさん2011/01/14(金) 17:50:11ID:???
>>973
そそ、メソッドチェーン。
セルフを返すメソッドと返さないメソッドが混在するのがモヤモヤするから質問してみた。
それだったら、アクセサだけで対応しようかなとおもったわけで。
井の中の蛙なので、外の情報が欲しいのです。
0975nobodyさん2011/01/14(金) 18:22:33ID:???
この例だとあえてメソッドチェインを使うメリットはない気がするけど、
それは置いといてもset_*でselfが返ってくるのはキモいと思う。
0976nobodyさん2011/01/14(金) 18:55:04ID:???
>>971
それでも駄目でした。
ん〜なんだろ。。。
0977nobodyさん2011/01/14(金) 19:00:21ID:???
本当に解決したいと思ってんなら$htmlの当該部分を書けよボケ
0978nobodyさん2011/01/14(金) 20:21:04ID:???
>>977
my $html =<<"EOM";
aaa<br /><br /><br />aaa<br /><br /><br />aaa
bbb<br /><br /><br /><br /><br /><br />bbb
EOM

テストするなら、$htmlの中身はこんな感じのを入れればいいんじゃね?
while使う理由がわからんけど、while使ったら、改行タグ減りまくりになりそう。
0979nobodyさん2011/01/14(金) 20:27:11ID:???
>>978
>>977が言いたいのは「htmlがおかしいんじゃねぇの?」ってことでしょ
解決するような世紀表現出しても元がおかしくてダメだと解決しないからってことで
0980nobodyさん2011/01/14(金) 23:05:32ID:???
>>978
あー、部分的なコードだけみても、対応できないってことか。
0981nobodyさん2011/01/15(土) 01:05:53ID:???
>>978
改行タグを減らしまくるのが目的です

$html の中身はブログから持ってきたデータで、<br /> を削除する前に
s/\r|\n|\t//g で改行コードとタブコードを全部削除して1行にしてあります。

で、処理するデータはデバッグとしてファイルに書き出して、目視で削除したい <br /> の連続があるのを確認済みです。
0982nobodyさん2011/01/15(土) 01:09:23ID:???
お客様の中にエスパー様はいらっしゃいませんかー
0983nobodyさん2011/01/15(土) 01:53:54ID:???
>>981
とりあえず、問題点を予想してみた。

・テキスト側が、<br />ではなく<br>(半角スペースとスラッシュをつけていない)
・テキスト側が、<br />ではなく<br/>(スペースの入れ忘れ)
・質問者のサーバーがMac。を入れるところを\マークにしている。
・エラーコード500である。
・strict宣言をしているのに、変数を初期化していない。

<<982
いや、まさかな
・元になるテキストの、<br />と<br />の間にスペースが入っていたりして。

とりあえず、改行タグを取る前の内容を出力してみてはどうでしょう?
0984nobodyさん2011/01/15(土) 06:05:42ID:???
>>981
$html =~ tr/\t\n\r / /s; # 改行、TAB、空白の圧縮
$html =~ s/^ | $//g; # 先頭と末尾に空白があれば削除
$html =~ s/(?<=>) (?=<)//g; # タグ間の空白を削除
$html =~ s|(?:<br\b[^>]*>){3,}|<br /><br />|gi;
0985nobodyさん2011/01/15(土) 08:03:36ID:???
>>983
んー。試したら、普通に動いてしまった。気のせいだろうか。
おいらの結論としては、$htmlの中身、ブログのテキストをうまくとりこめてないのかなと。
ファイルが原因だとしたら、デコードやエンコードを失敗してるのではないでしょうか。
そうでなければ、余計な文字列が紛れ込んでいるのかなと。

0986nobodyさん2011/01/15(土) 08:05:58ID:???
>>985
安価まちがえた
>>984
0987nobodyさん2011/01/15(土) 09:59:19ID:???
>そうでなければ、余計な文字列が紛れ込んでいるのかなと。
だから >>984 は空白を削除したり[^>]*で余計な文字列が紛れ込んでてもマッチするようにしてるんじゃないか
0988nobodyさん2011/01/16(日) 03:20:10ID:lrCOl2/v
質問させてください
perlでCGIを作っているのですが、
アクセスしてきた人が、どんなHTTPヘッダーを送ってきているのか調べたいのですが、
ページにアクセスされた時にHTTPヘッダーの取得する方法はどうすればいいでしょうか?
0989nobodyさん2011/01/16(日) 03:47:42ID:???
use cgi
my $in = cgi->new
$in->str_なんちゃら


関数名失念
0990nobodyさん2011/01/16(日) 03:54:27ID:???
$ENV{HTTP_*}
0991nobodyさん2011/01/16(日) 04:20:42ID:???
それだけとは限らないw
0992nobodyさん2011/01/16(日) 06:51:02ID:???
>>>990 それは環境変数であって HTTP ヘッダではない
0993nobodyさん2011/01/16(日) 08:32:57ID:???
>>988
CGIの仕様としては送られてきたヘッダはHTTP_*という環境変数に入れて渡すという
ことになっているが、必ずしも全て渡さなくていいというよりむしろいらないヘッダは
渡すべきではないということになってるので確実に全てのヘッダを取得することは一般的
にはできないと思った方がいい。(RFC3875の4.1.18)

> サーバは、それが受信した全てのヘッダフィールドについての外部変数を作成する必要はない。
> 特に、例えば 'Authorization' のような、認証情報を転送する任意のヘッダフィールドや、
> あるいは、例えば 'Content-Length' や 'Content-Type' のような、他の変数からスクリプト
> にて利用可能なものは取り除くすべきである。 サーバは、'Connection' のような、クライアント
> 側との通信上の点にのみ関係するようなヘッダフィールドは取り除いてもよい。

特定のヘッダが欲しいのかただなんとなくみたいだけなのかトラブルシューティングで全部
必要なのかよくわからんからこれ以上はなんとも言えんな。
0994nobodyさん2011/01/16(日) 10:27:12ID:???
>>989-993
お答えいただきありがとうございました
HTTPヘッダーで値を受け渡しして動作するCGIを作ってみようと思ったのですが、
HTTP_*で取得できるのですね
本当にありがとうございました
0995nobodyさん2011/01/16(日) 18:28:35ID:???
次スレ立ててくる。
0996nobodyさん2011/01/16(日) 18:30:17ID:LLQAziXD
はい。

Perlコーディング初心者質問スレ Part 62
http://hibari.2ch.net/test/read.cgi/php/1295170172/
0997nobodyさん2011/01/16(日) 18:36:51ID:???
otu
0998nobodyさん2011/01/16(日) 19:37:25ID:???
ぺrl
ぺrl
ぺrl
0999nobodyさん2011/01/16(日) 22:34:01ID:???
999
1000nobodyさん2011/01/16(日) 22:34:42ID:???
1000
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。