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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん2006/05/31(水) 04:32:28ID:???
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
09389272006/06/25(日) 23:33:09ID:???
>>937
ブラウザではHTMLとして解釈されていると言うことを忘れているのではないか。
HTMLソースを見るか、
while ( <@new_line> ){ print $_,"<br>\n" }
while ( <@new_line> ){ print FH $_,"\n" }
とすれば同じように表示されると思う。
09399112006/06/25(日) 23:35:41ID:???
>>938
いえ、HTMLソースと書き込まれたファイルを比べて差異が出てるのです。
不思議ですよね?

さきほどから何度も>>935のソースをそのまま貼り付けて実行していますが、
何度やってもファイルの書込みの方だけ

index,127.0.0.1,20060625212623,Mozilla/4.0
(compatible;
MSIE
6.0;
Windows
NT
5.1;
SV1;
.NET
CLR
1.1.4322)

こうなってしまうのです。
0940nobodyさん2006/06/25(日) 23:41:23ID:???
なんで else if が elsif なんて珍妙な省略されてるのはどうしてだぜ?
09419272006/06/25(日) 23:53:03ID:???
>>939
ああスマソ、>>934にソース見てもと書いてあったか。
漏れのところじゃファイルに書き出された物と同様に、ブラウザの方のHTMLソースにも改行が入ってるよ。
多分、Perl上の問題じゃなくて間に入ってるウェブサーバかエディタか…ともかく環境の問題だと思う。
# それにしてもperl5.8.1って随分とまた古いものを…

>>940
else ifじゃ無いのはぶら下がりが禁止されてるから。
Cなんかのelse ifは
if (expression)
 statement;
else
 if (expression)
  statement;
と言うのをくっつけて書いてるだけだからな。しかし、elseifにしなかった訳はわからん…
言語によってelifだったりelsifだったりelseifだったり覚えるの大変('A`)
09429112006/06/26(月) 00:08:33ID:???
>>941
周辺環境によるのですか。
エディタはterapadで、apache1.3.31です。
どうやらスッキリ解決という感じにはなりそうもないですね。

ちなみに<>は空白にも反応してしまうという話ですが。
それではよくある
open FH,"hoge.txt";
my @array = <FH>;
close;

open FH,"hoge.txt";
while (<FH>){ print $_,"\n" }
close;
の精度はイマイチということでしょうか。
色々なサイトに前者の方法でファイルを読み込んで行ごとに配列に入れられる
という説明があったと思いますが。

実際は半角空白?か何かがあると行ごとにはいかないということですよね。
0943nobodyさん2006/06/26(月) 00:10:42ID:???
だからファイルハンドルじゃなくて
配列を <> に入れるとそうなるって話でしょう。
見た事無いよ <@array> なんて使い方は。
09449112006/06/26(月) 00:13:37ID:???
>>943
なるほど。
ちょっと試してみます。
0945nobodyさんNGNG
ヘタクソ!!
09469112006/06/26(月) 00:23:18ID:???
>>943
index,127.0.0.1,20060625235612,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
index,128.0.0.1,20060625235046,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)

上記がaccess.logの中身です。
open FH,"access.log";
open DH,"+>test.log";
flock DH,2;
while (<FH>){ print DH $_;}
close DH;
close FH;
上記をやったらaccess.logの中身は
index,127.0.0.1,20060625235612,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
index,128.0.0.1,20060625235046,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)

でした。
0947nobodyさん2006/06/26(月) 00:27:07ID:???
>>912
鯖と同じOSのマシンを用意してコンパイルしてuse lib
09489112006/06/26(月) 00:27:26ID:???
上記をやったらaccess.logの中身は ではなくてtest.logの中身でした。

続き

open FH,"access.log";
my @line = <FH>;
open DH,"+>test.log";
flock DH,2;
while (<@line>){ print DH $_;}
close DH;
close FH;
今度上記をやったらtest.logの中身は
index,127.0.0.1,20060625235612,Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322)index,128.0.0.1,20060625235046,Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322)
でした。

open FH,"access.log";
my @line = <FH>;
open DH,"+>test.log";
flock DH,2;
while (<@line>){ print DH $_,"\n";}
close DH;
close FH;
最後に上記をやったらtest.logの中身は
0949nobodyさん2006/06/26(月) 00:28:23ID:???
単に while (<@new_line>) { ... } っていう変なのをやめればいいだけじゃないか。
どういう勉強の仕方したらこう書くようになるんだろう…。
ネットだけでやってきたのかなぁ。
09509112006/06/26(月) 00:28:34ID:???
index,127.0.0.1,20060625235612,Mozilla/4.0
(compatible;
MSIE
6.0;
Windows
NT
5.1;
SV1;
.NET
CLR
1.1.4322)
index,128.0.0.1,20060625235046,Mozilla/4.0
(compatible;
MSIE
6.0;
Windows
NT
5.1;
SV1;
.NET
CLR
1.1.4322)

でした。
0951nobodyさん2006/06/26(月) 00:29:19ID:???
行入力演算子(<>)を配列変数に対して使うなんて初めてみた。
普通そこはfor(foreach)じゃないの?
0952nobodyさん2006/06/26(月) 00:31:01ID:???
while (<@line>) を for (@line) にすれば済む話じゃないのか 何でこんな長々と続いてんの?
0953nobodyさん2006/06/26(月) 00:31:50ID:???
だよね。911はその書き方じゃなきゃイヤみたいなんだよ。
09549112006/06/26(月) 00:32:25ID:???
>>943
で、まとめですが。

わかったこと
@array = <FH>とやると格納されるときに行末の改行コードがなくなってる。
<@array>の時点では既に改行はない。
<@array>の中には改行は既にないが、配列の要素を一つづつ出すわけではない。

つまり<@array>なんて使うなということだと思いますが、もしかしたら
$`の区切り文字設定と同じものを見つけると<@array>これが反応する?

少し眠くなってきました。勉強になりました。
09559112006/06/26(月) 00:34:20ID:???
>>952
いえ、どうすればキチント動くかという話ではなくて、何であれであの動きをしたのかということが
気になったので。

ちなみに<@array>の方法はここで数年前にここで教わりました^^;
0956nobodyさん2006/06/26(月) 00:34:42ID:???
> @array = <FH>とやると格納されるときに行末の改行コードがなくなってる。

んなこたない
0957nobodyさん2006/06/26(月) 00:37:15ID:???
>>954
>@array = <FH>とやると格納されるときに行末の改行コードがなくなってる。
間違い。

>>948 での君のコードが間違ってる。
出力する時にまた同じく
> while (<@line>){ print DH $_;}
やってるから、この時点で空白文字(改行)がカットされてるだけ。
09589112006/06/26(月) 00:37:44ID:???
>>956
>>948を見てください。>>954は実際に動作させて得た結果のまとめのつもりです。
>>948をやると改行が全てなくなってtest.logに書かれてるということは
どこかで消されてるはずなのです。

で、それを配列に入れたときだろうと推測しました。
0959nobodyさんNGNG
そろそろ次スレ〜
09609112006/06/26(月) 00:40:05ID:???
>>957
なるほど。そこで消えてたのですか。
一応>>943を受けての一連の実験だったので、あのコードは間違いではないのですが。

しかしみなさん<@array>って本当にありえないんですね。
数年前に教えてもらってからずっと正しいやりかただと思って使ってました。
0961nobodyさん2006/06/26(月) 00:43:26ID:???
数年前からPerlやってて、+>とか<@line>とか書いちゃうのか・・・(´・ω・)
0962nobodyさん2006/06/26(月) 00:44:29ID:???
その使い方で数年間問題がなかった方が不思議だ
0963nobodyさん2006/06/26(月) 00:44:52ID:???
>>960
> 数年前に教えてもらって
((( ;゜д゜)))ガクガクブルブル

911が納得したところで次スレ建てトライしてくる。
0964nobodyさん2006/06/26(月) 00:51:24ID:???
readline 関数にファイルハンドルか型グロブ以外のものを渡した時の動作なんて
保障されてないと思うんだけど。
少なくともperldocにもラクダ本にも明記されてないね。
0965nobodyさん2006/06/26(月) 00:52:50ID:???
全く関係ない $` といい記憶違いでしょ。
どの板のスレかとその時のキーワード分かるならログから探してくるよ。
0966nobodyさん2006/06/26(月) 00:58:50ID:???
$self->{next} = new BBS2ch::Thread 'Perlコーディング初心者質問スレ Part 50';
$self->{next}->lead($self);
# テンプレ多いっす(;´Д`A
__END__
次スレ
http://pc8.2ch.net/test/read.cgi/php/1151250398/
0967nobodyさんNGNG
0968nobodyさん2006/06/26(月) 10:37:50ID:???
#!/usr/bin/>>966 -乙
package >>966;
use AutoLoader qw/AUTOLOAD/;
. . .
0969nobodyさん2006/06/26(月) 11:27:21ID:???
>>911のウザさに憤り
>>927の親切さに泣いた
そんな週末だった。
0970nobodyさん2006/06/26(月) 15:17:06ID:kXeMxgQF
<img src="hoge.cgi">

↑をHTMLに埋め込んでHTMLからhoge.cgiの呼び出しをしたいのですが、
hoge.cgi側でどこのページから呼ばれたのかを
<img src="hoge.cgi?p=index">
のようにGET形式を使わずに知ることはできますか?HTML側には
<img src="hoge.cgi">
とだけ記述で。

今初めてchatを作ってるんですが、管理者モードと一般モードとわけて機能や表示内容を変えたいのです。
それでサイト管理cgiが既に用意してあるのですが、その管理CGIから呼ばれたら管理者モード
ってことでできたらいいなと思ってるのです。

管理CGIの方はセキュリティ一応ある程度になってますので、管理CGIを開けた人間なら
いちいちそれ以上のパスなどやらないで、チャットも管理モードで動作してほしいんです。

何か方法はありますか?%ENVを見てもどうやら使えそうなのがなさそうですが。
0971nobodyさんNGNG
$ENV{"HTTP_REFERER"}
0972nobodyさん2006/06/26(月) 15:29:23ID:???
HTTP_REFERERで呼び出し元は引けるのかな?
JavaScriptのdocument.locationを使ってimgタグを生成してdocument.writeする方法はどう?
0973nobodyさん2006/06/26(月) 15:31:25ID:???
求めるセキュリティのレベルにもよるが、refererなんてクライアントの自己申告で
ウソつき放題だからそんなものをあてにするのは感心しないな。
09749702006/06/26(月) 15:33:20ID:kXeMxgQF
.....orz

てっきりリファラは前のページになってしまうのかと。
ちゃんとできるのですね。
すみませんです。
今テストしてみたら確かにできてました。

ちなみにリファラの偽装って簡単ですか?難しいけど出来る人はできるのですか?
管理CGIのページには.htaccessで認証をつけてあるのですが、リファラの信頼度が
その.htaccessの認証以上であれば別にかまいませんが、どうなのでしょうか。
0975nobodyさんNGNG
簡単すぎて泣けそうです
09769702006/06/26(月) 15:38:54ID:kXeMxgQF
>>972
一応リファラに入ってました。
例外もあるかもしれませんが。
>>973
自己申告でしたか。
それじゃあダメぽですね。

悩んでみます。
0977nobodyさん2006/06/26(月) 15:47:16ID:???
つセッション

と言いたいところだが気をつけないとCSRF脆弱になるからな…
09789702006/06/26(月) 15:55:42ID:kXeMxgQF
理想としては管理CGIには
<iframe src="chat.cgi">ブラウザが未対応です。</iframe>
以外を追加したくないんですよね。

基本全てをchat.cgiがやる。そして一般者には管理モードがあることを悟られないようにしたい。
ipでやればできるような気もしますが、気が進まないんですよね。
09799702006/06/26(月) 16:21:47ID:kXeMxgQF
ポストでやることにしました。
chat_login.cgiを作って。それでまあ一応管理CGIの方は
<iframe src="...">〜</iframe>だけの追加でいいことになりますし。

ありがとうございました
0980nobodyさん2006/06/26(月) 16:25:09ID:???
Encode.pmでメールの日本語Subjectのエンコードをしたいのですが…。
encode( 'MIME-Header', $hoge )で文字化けしまくりです。
できれば5.8標準モジュールで済ませたいのですが、
JCodeとかを使わなければ無理でしょうか?
スクリプト自体はeuc-jpで書いています。
0981nobodyさんNGNG
MIME::Base64
0982nobodyさん2006/06/26(月) 19:22:04ID:???
>>980
$hogeがちゃんとしたユニコード文字列ならそれでエンコードされるはず。
ただし、utf8にしかならない。

日本語しか使わないかつ互換性の問題などでどうしてもiso-2022-jpにしたければ、
'MIME-Header-ISO_2022_JP'というのも用意されている。

詳しくはEncode::MIME::Header参照。
0983nobodyさん2006/06/26(月) 19:44:59ID:???
@splitdata = map { $_ =~ s/( )+$//; } @splitdata;
この中身が消えちゃうのは何故でしょうか・・・
0984nobodyさん2006/06/26(月) 20:05:42ID:???
中のデータ知らないけど、マッチしないと消えると思う。
0985nobodyさん2006/06/26(月) 20:07:33ID:???
>>983
どうしたいか分からないが
@splitdata = map { $_ =~ s/( )+$//; $_; } @splitdata;
だと予想。
0986nobodyさん2006/06/26(月) 20:17:37ID:???
配列の中身、置換したいだけか。だったら
grep { s/( )+$//; } @splitdata;
だけでいけるはず
0987nobodyさん2006/06/26(月) 20:18:45ID:???
正直そういうのは map じゃなくて素直に for でやって欲しいと思った私は少数派?
0988nobodyさん2006/06/26(月) 20:19:12ID:???
何でみんな foreach 嫌いなのw
0989nobodyさん2006/06/26(月) 20:31:47ID:???
まっぷ → 一行で書ける簡単なもの
ふぉ〜い〜ち → 書くことが沢山あるとき

適材適所
0990nobodyさん2006/06/26(月) 20:33:09ID:???
俺も思った。言語によってなかたりするからかな?
0991nobodyさん2006/06/26(月) 20:36:05ID:???
>>989
てっきり返り血があるかないかだと思ってた。
0992nobodyさん2006/06/26(月) 20:40:33ID:???
初めの頃はmapとgrep上級者的で好きだったな。
それとどれだけ短く書けるかで上級度も図ってた。
0993nobodyさん2006/06/26(月) 20:44:11ID:???
map とか grep って foreach より処理重くなったり余計メモリ食ったりするんじゃねえの?
0994nobodyさん2006/06/26(月) 20:44:51ID:???
ところでさ。プログラムの天才って。
例えばウィニー作った人なんて相当なもんなんでしょ。
あーいう人。というか金子って人はウィニのソースの全てを把握をしてるのかな?

それとも全体の:kg:jgん;kjdgんljng;owjdgnbl;djgblaijdbga


youhasa .
毎度自分のプログラムの改造をするときにまず自分のプログラムを読んで把握のしなおしからするのかな。
0995nobodyさん2006/06/26(月) 20:45:26ID:???
そこでオブジェクト指向プログラミングですよ
0996nobodyさんNGNG
毎日そのソースと睨めっこしてれば把握可能
0997nobodyさん2006/06/26(月) 20:46:13ID:???
>>993
そもそもCGIで処理効率なんて考える?
回線状況による誤差を考えるとどうでもよくない?
いや、CGIでなくてもさ。
0998nobodyさん2006/06/26(月) 20:47:37ID:???
>>995
やっぱりかぁ。
あんまり好きじゃないんだよな。
というかもっと新しい概念ないのかな。
0999nobodyさん2006/06/26(月) 20:49:24ID:???
>>997
いや、そういう問題じゃなくねw

>>998
なんで好きじゃないんだか。覚えれば普通のことだと思うよ。


999get!
1000nobodyさん2006/06/26(月) 20:50:15ID:???
>>999
一度覚えて気に入ったんだけど、それで大きめのを組んで数ヵ月後に見直したら嫌いになった。
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。