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

Perl コーディング初心者質問コーナー Part33

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/03/01 02:46ID:1GeWO7LH
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0052nobodyさん04/03/02 00:42ID:???
>>38
0053nobodyさん04/03/02 00:57ID:???
>>36
cmpthese結果だけ。($bufferはmyで確保)
Rate $buffer="hoge" print("hoge\n") print <<"HERE"
$buffer="hoge" 646465/s -- -56% -84%
print("hoge\n") 1454545/s 125% -- -65%
print <<"HERE" 4129032/s 539% 184% --
# ヒアドキュメントを使いましょう。

>>38
出力するHTMLを静的ファイルにして、CGIの結果をSSI取り込むとか。
または静的ファイルを出力して、Locationするとか。

>>41
use constant NUMBER => 200;

>>51と本質は同じなんだけど…。
print "@{[NUMBER]}";
で展開ー。
0054nobodyさん04/03/02 11:50ID:???
ドジッ男て聞かんなあ・・・
0055nobodyさん04/03/02 12:26ID:???
すいません質問です。
カウンタや掲示板のログを読み出すときの、
open(DATAA,"$log");
この部分の$logの前に>や+<とか色々ありますけど、
この辺を詳しく説明してくださる人いませんか?
どれを使っても読めるんで、違いが良くわからないのですが。
00563604/03/02 13:09ID:???
暇な人お願いします。
0057nobodyさん04/03/02 13:21ID:???
>>36
文字列連結するほうは、メモリ確保、開放を繰り返し行うが、その程度なら
たいしたことではない、好きにしろ、俺はヒアドキュメント使う。
0058nobodyさん04/03/02 13:25ID:???
セッションクッキーを書きこんで内容を参照すると、二番目の値の
先頭に半角のブランクがはいって困っています。連想配列に格納して
参照しようとすると先頭の半角もキーにしているためにマッチしません。
半角を入れずにクッキーを書きこめますか?だめなら、取り込んだ後で
半角を取り去るいい方法がありますか??

書きこんでいるコードはこれだけ :
print "Content-type: text/html\n";
$cmax=0;
print "Set-cookie:m_lng_max=$cmax\n";
print "Set-cookie:AVR=1\n\n";

クッキー表示用のCGIで表示させると、
m_lng_max=0; AVR=1
となって、;とAの間に半角スペースがはいります。
0059nobodyさん04/03/02 13:43ID:???
2バイト文字(ひらがなとか)を逆に並べるにはどうしたらいいんですか?
1バイト文字では、reverse関数を使えば実装できるのは確認したんですが、

$str = "あいうえお";
print join('' , reverse(split(// , $str)));
とやっても、文字が化けて読めません。

もしかして、できないんでしょうか・・・?
0060nobodyさん04/03/02 13:48ID:???
>>55
>では読めんだろう。空になるはず。
0061nobodyさん04/03/02 13:54ID:???
>>58
$cookie_data = "name\:$name\,mail\:$mail";
print "Set-Cookie: hoge=$cookie_data;\n";

こんな感じで一つの変数にまとめて突っ込んで、あとから取り出すのじゃダメなん?
0062nobodyさん04/03/02 14:03ID:???
>>59
Perlメモのプログラムを見たら、一応出来た。

$str = "あいうえお";
$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
@chars = $str =~ /$ascii|$twoBytes|$threeBytes/og;

print join('' , reverse(@chars));
00636204/03/02 14:04ID:???
参照元はここね。上のプログラムはEUC前提。
http://www.din.or.jp/~ohzaki/perl.htm#JP_Split
00645804/03/02 14:19ID:???
>>61さん
それで全然オッケーです、やってみます。ありがとう。

でも、どうして二番目以降の先頭にブランクがつくのかなあ。
仕様ということにしとこ。
0065nobodyさん04/03/02 15:55ID:???
>>55
http://www.rfs.jp/sitebuilder/perl/02/08.html#ファイル入出力記号の一覧

少しは探せよ
0066nobodyさん04/03/02 23:15ID:???
open FILE, "+<test.txt";
@chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n");
print FILE "@chinko";
close FILE;

このようにしてtest.txtを覗くと

しりとり
 りんご
 ごりら
 らっぱ
 ぱんつ
 つまようじ

このように2行目以降の先頭に半角スペースが入ってしまいます。
だれか原因と対策を教えていただけませんか。
0067nobodyさん04/03/02 23:19ID:???
age
0068nobodyさん04/03/02 23:32ID:???
>>66
ネタ?釣り?マジレスしていいの?
0069nobodyさん04/03/02 23:34ID:???
マジレスおながいします。
0070nobodyさん04/03/02 23:39ID:???
>>66
\nのけろ
0071nobodyさん04/03/02 23:48ID:???
ぃゃ改行させたいんです。掲示板のログを作成する部分でログファイルもパっとみてわかる書式で保存したいんです。
掲示板のログが件名からリモホから本文から全部1行でまとまってると見るに耐えないので。
2行目以降の頭の半角スペースが憎いんです。
ループさせて1行ずつ保存するしかないんですかね。
0072nobodyさん04/03/02 23:53ID:???
>>66
しりとり
りんご
ごりら
らっぱのマークの正露丸
0073nobodyさん04/03/02 23:54ID:???
やっぱり釣りか・・・
0074nobodyさん04/03/02 23:56ID:???
>>66
open FILE, "+<test.txt";
@chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n");
print FILE @chinko;
close FILE;

3行目
print FILE "@chinko";
の@chinkoの
""を取ればok
0075nobodyさん04/03/02 23:58ID:???
暇な俺が微妙に不親切に教えてやろう。
まずは単純に配列にデータ突っ込んで、
print @chinko;
とだけやれ。

答えはそこにある。
0076nobodyさん04/03/03 00:01ID:???
ほんとは
print "@chinko\n\n";
としたかったんだけどね。ありがとう。
\n\nは分けてやります。
0077nobodyさん04/03/03 00:05ID:???
>>76
それって意味あんの?
配列の最後に改行が2回入るだけじゃん・・・
0078nobodyさん04/03/03 00:07ID:???
>>76
・・・
悪いことは言わない。
Perl止めろ
0079nobodyさん04/03/03 00:07ID:???
2行空けると見やすくなる。っていうだけ。
0080nobodyさん04/03/03 00:18ID:???
>>79
ファイルの終端から2行空けて何の意味があるんだ?
0081nobodyさん04/03/03 00:20ID:???
>>79
open FILE,"+<test.txt";
@chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n");
print FILE @chinko;
print FILE "\n";
close FILE;

こうしれば?
一応期待どうりになるよ
0082nobodyさん04/03/03 00:23ID:???
配列・リスト・スカラーをわかってやってるんか?こいつは。
0083nobodyさん04/03/03 00:27ID:???
>>80
新規のログを@new_logにぶっこんでファイルに出力して2行改行いれて
配列に\n\nいれてもいいけどいまさらいじるのめんどくさい。
ぃゃちょっとだけど。
その次の行からあらかじめ保存してある@temp_logをぶっこむ。
最終的に期待道理になればなんでもえーじゃないの。
0084nobodyさん04/03/03 00:30ID:???
print foreach(@chinko);
0085nobodyさん04/03/03 00:31ID:???
ハァ?


だから、データの後に意味のない改行入れてどういう効果があるんだ?
お前はファイルの中身の最後とエディタの縁の間に空白がないと嫌なのか?
0086nobodyさん04/03/03 00:36ID:???
@temp_logの最後には記事番号の現在地が格納されてるのでエディタの縁との間隔は0です。
新規書き込みの時は一番上に今の記事番号が格納されることになるけど、
レスとか含めてログファイルには記事番号の順番にログが格納されるわけじゃないんですよ。
なのでtemp_logの最後においとくとpopで取得して++したらpushで格納できるから便利なのですよ。
ログの続きで改行あけずに格納すると視認性悪そうですしねー。
0087nobodyさん04/03/03 00:38ID:???
ていうかageてたごめん。
0088nobodyさん04/03/03 00:40ID:???
No<>名前<>記事
No<>名前<>記事
No<>名前<>記事
No<>名前<>記事
・・
・・
・

って普通にするんじゃいかんのか?
0089nobodyさん04/03/03 00:48ID:???
1. comment
2. 1
3. 七資産
4. [email protected]
5. http://www.unko.cojp/chinchin/
6. 無題テキスト
7. となりの<br>柿は<br>よく<br>客食う<br>柿だ。
8. 何月何日何時何分難病
9. モジラなんとかかんとか
10. リモホ
11. IPアドレス
12. 削除キー
13. 
14. 
15.    res
16.    2
17.    1(親記事番号)
18.    七資産
19.    [email protected]
20.    http://www.unko.cojp/chinchin/
21.    タイトル
22.    本文
23.    何月何日何時何分難病
24.    モジラとか
25.    リモホ
26.    IP
27.    削除キー
28.    
29. 
30. 2
EOF
0090nobodyさん04/03/03 00:49ID:???
ログがこうなってると見やすくてよくない?
0091nobodyさん04/03/03 00:55ID:???
>>89
プログラム的に面倒・・・
0092nobodyさん04/03/03 00:57ID:???
うん。超面倒。でもまあそうしたいからがんばるよ。
0093nobodyさん04/03/03 00:58ID:???
>>89
なんていうか、ド素人というか・・・
ログファイルの見た目なんかどうでもいいやろ。。
簡単にコード組めるか、のほうが大事やろ
0094nobodyさん04/03/03 01:00ID:???
別にいいじゃん。俺は見やすいのがスキなんだよ。
趣味でやってんだから細部まで凝りに凝りたいじゃん。
0095nobodyさん04/03/03 01:00ID:NMlynacq
ある問題が解けなくて困っています。
問題↓

ファイル xy-data.dat には,カンマで区切られた2つの整数データが並んだ行が何行か格納されている.
各行の最初の整数値をx,次の整数値をyとしてx-y座標上の点(x.y)をファイルの行数個考える.これらの点のうちで、原点が(4,7)、半径4の円の内側(円周上は除く)に含まれる点の数を出力するプログラムを作成せよ.

画面には、結果である数以外の出力をしないこと.

ファイルは
open("IN_FILE","<xy-data.dat");
としてopenし,このファイルからデータを読み出す時は,

$xy=<IN_FILE>
$xy =~ /(\d+)\D+(\d+)/;
$x = $1;
$y = $2;

として読み出せばよい.(まず変数$xyにファイルから1行読み出し,次に$xyの内容をカンマで区切られた前半と後半に分けて,前半を変数$xに後半を変数$yに代入する)
また,読み出しが終わったら,
close(IN_FILE);
としてクローズすること.

どうすればいいのか見当がつきません。お願いします
0096nobodyさん04/03/03 01:08ID:???
>>94
@chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n");
open FILE,"+<test.txt";
@unko=<FILE>;
unshift @unko,@chinko;
truncate(FILE,0);
seek(FILE,0,0);
print FILE @unko;
print FILE "\n";
close FILE;
00979604/03/03 01:12ID:???
スマン

open FILE,"+<test.txt";
@unko=<FILE>;
unshift @unko,"しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n","\n";
truncate(FILE,0);
seek(FILE,0,0);
print FILE @unko;
close FILE;

0098nobodyさん04/03/03 01:20ID:???
@chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n");
open FILE, "+<test.txt";
@unko=<FILE>;
unshift @unko,"\n";
unshift @unko,@chinko;
truncate(FILE,0);
seek(FILE,0,0);
print FILE @unko;
close FILE;
0099nobodyさん04/03/03 01:30ID:???
>>98
ラスト4行はこの方がいいんじゃないのか?

seek(FILE, 0, 0);
print FILE @unko;
truncate(FILE, tell(FILE));
close(FILE);
0100nobodyさん04/03/03 01:43ID:???
ログの整形表示は、それようのプログラムを別に作るのが普通じゃないでしょうか?
と言ってみるtest
0101nobodyさん04/03/03 01:44ID:???
>>99
tellって関数、ググッタりして見てもよく分からないんだが
バカにもわかりやすく教えてもらえんかねぇ?
0102nobodyさん04/03/03 01:59ID:???
>>100
サブルーチンにはしてあるけどね。
まだ作ってない機能とかもあるし、最終的にいくつかの機能を別プログラムにしようかなとは考えてる。
最後まで作ったら1000ステップぐらいいきそうな勢いなので。
0103nobodyさん04/03/03 02:00ID:???
>>96関連
今日はもう疲れたので明日リファレンス見ながら理解してみます。ありがとう。
0104nobodyさん04/03/03 02:44ID:???
メール送信に関して質問です。抜粋していますが、フォームから入力したデータを
入力者に確認メールを送信すると言うプログラムです。
$mailにはフォームの「メールアドレス」の項目の内容が入り、あとは以下のとおりです。

質問は確認メールが送信されたメールを見ると、送信者の欄が
[email protected]になっています。サーバのホスト名が入ってしまいます。
これをtestだけにしたいのですが、どうしたらいいのでしょうか?

$from= "test";
$subject "アンケート";

## 入力者に確認メールを送信
open (MAIL,"| /usr/sbin/sendmail -t");
print MAIL "To: $mail\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n";
print MAIL "Content-type:text/plain\n\n";
print MAIL "送信しました。\n\n";
close(MAIL);
0105nobodyさん04/03/03 03:05ID:???
>>104
$from= "test";
$adrress= "[email protected]";

print MAIL "From: $from $adrress\n";


だったよな・・・
010610404/03/03 03:15ID:???
>>105
それでは無理でした。。↓になります。
[email protected]
0107nobodyさん04/03/03 04:16ID:???
>最後まで作ったら1000ステップぐらいいきそうな勢いなので。
!!!!!!!!!!!

この俺に突っ込めと言うのかっ・・・
0108nobodyさん04/03/03 06:42ID:UA3CbL7u
連想配列を連結するには foreachなどを使って一個一個代入していくしかないのでしょうか?
0109nobodyさん04/03/03 07:27ID:???
%aaa = (%aaa, %bbb);
0110nobodyさん04/03/03 08:09ID:UA3CbL7u
>>109
ありがとうございます
0111nobodyさん04/03/03 09:11ID:???
>>89
そういうことしたいなら俺定義XMLでログ記録して、
XSLで整形表示とかのほうが効率良さげと思うんだけど。
0112nobodyさん04/03/03 09:18ID:???
>>111
もうそいつには構うなって。

>>101
tellだけに教えて君ですか。そんなエサに俺様以下略。
0113nobodyさん04/03/03 12:03ID:???
>>111
こいつの辞書には「効率」って文字はねぇんだよ きっと
どうせどんな助言与えても聞くきねぇんだから、うち等から言える事はもう無いさ
01142404/03/03 17:34ID:???
>>24の質問に答えてくれた方々

皆さんありがとんございました。
>>34を使おうと思います。
011510404/03/03 19:04ID:???
すみません、やっぱり>>104は解決しません。。
0116nobodyさん04/03/03 19:17ID:JGcO0sWg
質問でつ。

$hash{$key}{'このキー'};

上のような連想配列で 'このキー' のキーの一覧を得るには
どうすればよいのでしょうか?
よろしこ おながいします。
0117nobodyさん04/03/03 19:39ID:???
>>116

keys %{$hash{$key}}
0118nobodyさん04/03/03 19:57ID:???
>>95
my $cnt = 0;
open(IN_FILE, "xy-data.dat") or die $!;
while(<IN_FILE>){
my ($x, $y) = /(\d+)\D+(\d+)/;
( *円内側の領域を表す式* ) and $cnt++;
}
close(IN_FILE);
print $cnt;
exit;

>>101
ファイルハンドルが参照しているファイルの位置
(ファイル先頭からのバイト数)。

>>104
$from = "test <[email protected]>";
0119nobodyさん04/03/03 19:57ID:???
>>117
おお、有難う御座います。
0120nobodyさん04/03/03 20:46ID:???
>>115
いつまでもスレ違いの話題するな。
perl以前にsendmailについて勉強しろ。
0121nobodyさん04/03/03 21:55ID:???
>>118
> $from = "test <[email protected]>";

@はエスケープしろよ

$from = "test <test\@example.net>";
0122nobodyさん04/03/03 22:13ID:???
>>120のリアル厨房よ
分からないのなら黙ってろよ(w
0123nobodyさん04/03/03 22:19ID:???
>>122
じゃ特別に教えてやるよ。
sendmail -tやめてsendmail -bsでSMTP叩けばFrom: testで出せるよ。
馬鹿には使いこなせないだろうけどな。
012411804/03/03 22:50ID:???
>>121
失念してました。

その上、元の質問はfromを詐称したいって話だったのね…。
吊ってきます。
0125nobodyさん04/03/03 22:58ID:???
>>123
分かんのなら初めっから素直に答えとけや(w
その方法はしらねーけど、設定によってだけどほとんどのとこで使えないぞwww
使えねえ答えでは意味が無い
0126nobodyさん04/03/03 23:16ID:???
>>125
大抵は使えるはずだ、つーか、これを禁止する設定は知らん、多分無いだろう。
お前には使いこなせないだろうがな。
0127nobodyさん04/03/03 23:20ID:???
>>126
もうバカは相手にすんなって
ほっとけばいなくなるから
0128nobodyさん04/03/03 23:34ID:???
>>125のI.Qを測る関数ってありますか?
0129nobodyさん04/03/03 23:38ID:???
>>128
sin()
0130nobodyさん04/03/04 00:19ID:uAtEzihH
>>125
>設定によってだけど

何と言うか、頭悪そうな発言だな。
「この鯖にはsendmailを入れてはいけない設定になっております」
こういうのでも納得しそうな>>125を晒しage
0131nobodyさん04/03/04 00:38ID:???
>>128
測るまでも無いほどIQ低いよ
0132nobodyさん04/03/04 00:40ID:???
>>128
iq();



sub iq{ return 0;}
0133 ◆gperlqJurM 04/03/04 01:37ID:???
test
0134nobodyさん04/03/04 02:00ID:WZx4Ntes
perlプログラムから、Webサーバにアクセスしてhtmlを
取得したいと考えています。
どのモジュールを使うのが一番手っ取り早いですか?

一応探してみて、LWPというのがよさそうだと思ってます。
http://member.nifty.ne.jp/hippo2000/perltips/LWP.html
0135nobodyさん04/03/04 02:13ID:???
http://www.cj-c.com/cgi_s/access.htm
ReverseAccess

http://saya.kiy.jp/cgi/ftlink.html
このCGIは「CJ-Clubさんの ReverseAccess 」を改造したものを再配布条件に基づき再配布しています。

上記の本家版だとserverステータスで "cgiヘッダーが出力されない" が出ます。
下の改造バージョンだと正常に動作します。
スクリプト構造の一番の違いはjavascriptで外部表示出来るか否かです。
元スクリプトのバージョンも違うので一概に言えません。
環境は
XPpro
04server
perl
です。

本家スクリプトもとりあえず動作はしますが一定時間がたつとログがリセットします。
下の改造版だとすべて正常に動作します。

原因が分からず困っています。
助言をお願いします。

0136nobodyさん04/03/04 02:16ID:???
>>135
作者に聞いて。
それにここはそういう質問のスレじゃないので。
0137nobodyさん04/03/04 02:23ID:???
サブルーチンの中から__DATA__や__END__を<DATA>で読もうとすると
Can't call method "****" without a package or object reference
と言うエラーが出ますが、どうすれば出なくなるのでしょうか。
0138nobodyさん04/03/04 02:28ID:SI8u2VDD
>>134
で?
0139nobodyさん04/03/04 02:38ID:???
>>137
君の言う通りなら以下のスクリプトでエラーが再現する筈だが。

#!/usr/local/bin/perl
sub read_data { print <DATA> }
read_data();
__DATA__
foo bar baz

エラーメッセージをよく読もう。
0140nobodyさん04/03/04 02:44ID:???
>>137
間違って書かなきゃ別に出ないけど。
どうやって書いてエラーにしてるわけ?
0141nobodyさん04/03/04 03:02ID:???
output{
  print "Content-Type:text/plain;charset=UTF-8\n\n";
  defined(<DATA>) ? print <DATA> : print '';
}

....

output();

__END__

(文字)

#-------------------

と、このようにしています。
サブルーチンの外に出せばエラーは出なくなります。
また、Can't call method 〜 と同時に他のエラーが出ることもありません。

テスト環境は Win2K + Apache2.4.08 + ActivePerl5.8 です。
0142nobodyさん04/03/04 03:09ID:???
>141
sub output {}
#書き込み時ミス
0143nobodyさん04/03/04 03:11ID:???
と思ったらスクリプトのミスでした(「sub」忘れ)。
お騒がせしました……。

#まさかポカミスで一日悩むとは。
0144nobodyさん04/03/04 03:30ID:???
> defined(<DATA>) ? print <DATA> : print '';

この書き方に一体何の意味があるのだ?
print <DATA>;だけと同じだろうよ
まあ質問用に書いたのかもしれないが
0145nobodyさん04/03/04 03:47ID:???
>>144
defined(<DATA>) ? print <DATA> : print '';
はバグっぽいが、わかってないのはバカっぽいな。
0146nobodyさん04/03/04 03:53ID:???
それは何と言うか、色々やっていた時の名残です。
ここに書く時直前では
(略):print 'nodata';
とか書いてたので中を消してそのまま出してしまいました。
0147nobodyさん04/03/04 04:10ID:???
defined で1行目読んで、print してるのは2行目なんだけど。
書きミスじゃなくて、バグっぽい。
$/ = undef; なんてやってたら、はまりそ。
0148nobodyさん04/03/04 04:23ID:???
言ってる意味が今解りました。
実は __END_ _直下の行が消えるのは何故だろうかと疑問に思いつつ
そう言うものなのだと思ってました。

と言う事は、__END__ 以下があるか無いか調べるにはどうしたら良いのでしょうか。
0149nobodyさん04/03/04 05:16ID:???
>>148
__END__ 以下に何が書いてあるかプログラマが把握できない
状況というのは健全でない気がするが。

単純にやるなら
if (my @data = <DATA>) { ... } else { ... }
なり
local $/ = undef;
if (length(my $data = <DATA>)) { ... } else { ... }
なりご自由に。
0150nobodyさん04/03/04 11:13ID:???
defined(my $data = <DATA>) ? print $data : print '';
0151nobodyさん04/03/04 12:42ID:FGoSTbqM
どうも昨日違うスレで質問して怒られたのでこちらに移動します。

perlをインストールしてソースを書いてブラウザに表示させたところ
ソースコードがすべて出てきてしまいました。#!usr/local/bin〜__END__まで
すべて表示されました。

単刀直入にいってどの部分がおかしいとこういう現象になるんですか?自分ではどこがわるいのかわかりません
■ このスレッドは過去ログ倉庫に格納されています