Perl コーディング初心者質問コーナー Part33
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/03/01 02:46ID:1GeWO7LH【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0067nobodyさん
04/03/02 23:19ID:???0069nobodyさん
04/03/02 23:34ID:???0071nobodyさん
04/03/02 23:48ID:???掲示板のログが件名からリモホから本文から全部1行でまとまってると見るに耐えないので。
2行目以降の頭の半角スペースが憎いんです。
ループさせて1行ずつ保存するしかないんですかね。
0073nobodyさん
04/03/02 23:54ID:???0074nobodyさん
04/03/02 23:56ID:???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は分けてやります。
0079nobodyさん
04/03/03 00:07ID:???0081nobodyさん
04/03/03 00:20ID:???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:???新規のログを@new_logにぶっこんでファイルに出力して2行改行いれて
配列に\n\nいれてもいいけどいまさらいじるのめんどくさい。
ぃゃちょっとだけど。
その次の行からあらかじめ保存してある@temp_logをぶっこむ。
最終的に期待道理になればなんでもえーじゃないの。
0084nobodyさん
04/03/03 00:30ID:???0085nobodyさん
04/03/03 00:31ID:???だから、データの後に意味のない改行入れてどういう効果があるんだ?
お前はファイルの中身の最後とエディタの縁の間に空白がないと嫌なのか?
0086nobodyさん
04/03/03 00:36ID:???新規書き込みの時は一番上に今の記事番号が格納されることになるけど、
レスとか含めてログファイルには記事番号の順番にログが格納されるわけじゃないんですよ。
なのでtemp_logの最後においとくとpopで取得して++したらpushで格納できるから便利なのですよ。
ログの続きで改行あけずに格納すると視認性悪そうですしねー。
0087nobodyさん
04/03/03 00:38ID:???0088nobodyさん
04/03/03 00:40ID:???No<>名前<>記事
No<>名前<>記事
No<>名前<>記事
・・
・・
・
って普通にするんじゃいかんのか?
0089nobodyさん
04/03/03 00:48ID:???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:???0092nobodyさん
04/03/03 00:57ID:???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:???@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;
009796
04/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:???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:???ラスト4行はこの方がいいんじゃないのか?
seek(FILE, 0, 0);
print FILE @unko;
truncate(FILE, tell(FILE));
close(FILE);
0100nobodyさん
04/03/03 01:43ID:???と言ってみるtest
0102nobodyさん
04/03/03 01:59ID:???サブルーチンにはしてあるけどね。
まだ作ってない機能とかもあるし、最終的にいくつかの機能を別プログラムにしようかなとは考えてる。
最後まで作ったら1000ステップぐらいいきそうな勢いなので。
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:???$from= "test";
$adrress= "[email protected]";
print MAIL "From: $from $adrress\n";
だったよな・・・
0106104
04/03/03 03:15ID:???それでは無理でした。。↓になります。
[email protected]
0107nobodyさん
04/03/03 04:16ID:???!!!!!!!!!!!
この俺に突っ込めと言うのかっ・・・
0108nobodyさん
04/03/03 06:42ID:UA3CbL7u0109nobodyさん
04/03/03 07:27ID:???0110nobodyさん
04/03/03 08:09ID:UA3CbL7uありがとうございます
0113nobodyさん
04/03/03 12:03ID:???こいつの辞書には「効率」って文字はねぇんだよ きっと
どうせどんな助言与えても聞くきねぇんだから、うち等から言える事はもう無いさ
0116nobodyさん
04/03/03 19:17ID:JGcO0sWg$hash{$key}{'このキー'};
上のような連想配列で 'このキー' のキーの一覧を得るには
どうすればよいのでしょうか?
よろしこ おながいします。
0118nobodyさん
04/03/03 19:57ID:???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]>";
0121nobodyさん
04/03/03 21:55ID:???> $from = "test <[email protected]>";
@はエスケープしろよ
$from = "test <test\@example.net>";
0123nobodyさん
04/03/03 22:19ID:???じゃ特別に教えてやるよ。
sendmail -tやめてsendmail -bsでSMTP叩けばFrom: testで出せるよ。
馬鹿には使いこなせないだろうけどな。
0125nobodyさん
04/03/03 22:58ID:???分かんのなら初めっから素直に答えとけや(w
その方法はしらねーけど、設定によってだけどほとんどのとこで使えないぞwww
使えねえ答えでは意味が無い
0130nobodyさん
04/03/04 00:19ID:uAtEzihH>設定によってだけど
何と言うか、頭悪そうな発言だな。
「この鯖にはsendmailを入れてはいけない設定になっております」
こういうのでも納得しそうな>>125を晒しage
0134nobodyさん
04/03/04 02:00ID:WZx4Ntes取得したいと考えています。
どのモジュールを使うのが一番手っ取り早いですか?
一応探してみて、LWPというのがよさそうだと思ってます。
http://member.nifty.ne.jp/hippo2000/perltips/LWP.html
0135nobodyさん
04/03/04 02:13ID:???ReverseAccess
http://saya.kiy.jp/cgi/ftlink.html
このCGIは「CJ-Clubさんの ReverseAccess 」を改造したものを再配布条件に基づき再配布しています。
上記の本家版だとserverステータスで "cgiヘッダーが出力されない" が出ます。
下の改造バージョンだと正常に動作します。
スクリプト構造の一番の違いはjavascriptで外部表示出来るか否かです。
元スクリプトのバージョンも違うので一概に言えません。
環境は
XPpro
04server
perl
です。
本家スクリプトもとりあえず動作はしますが一定時間がたつとログがリセットします。
下の改造版だとすべて正常に動作します。
原因が分からず困っています。
助言をお願いします。
0137nobodyさん
04/03/04 02:23ID:???Can't call method "****" without a package or object reference
と言うエラーが出ますが、どうすれば出なくなるのでしょうか。
0138nobodyさん
04/03/04 02:28ID:SI8u2VDDで?
0139nobodyさん
04/03/04 02:38ID:???君の言う通りなら以下のスクリプトでエラーが再現する筈だが。
#!/usr/local/bin/perl
sub read_data { print <DATA> }
read_data();
__DATA__
foo bar baz
エラーメッセージをよく読もう。
0141nobodyさん
04/03/04 03:02ID:???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:???sub output {}
#書き込み時ミス
0143nobodyさん
04/03/04 03:11ID:???お騒がせしました……。
#まさかポカミスで一日悩むとは。
0144nobodyさん
04/03/04 03:30ID:???この書き方に一体何の意味があるのだ?
print <DATA>;だけと同じだろうよ
まあ質問用に書いたのかもしれないが
0145nobodyさん
04/03/04 03:47ID:???defined(<DATA>) ? print <DATA> : print '';
はバグっぽいが、わかってないのはバカっぽいな。
0146nobodyさん
04/03/04 03:53ID:???ここに書く時直前では
(略):print 'nodata';
とか書いてたので中を消してそのまま出してしまいました。
0147nobodyさん
04/03/04 04:10ID:???書きミスじゃなくて、バグっぽい。
$/ = undef; なんてやってたら、はまりそ。
0148nobodyさん
04/03/04 04:23ID:???実は __END_ _直下の行が消えるのは何故だろうかと疑問に思いつつ
そう言うものなのだと思ってました。
と言う事は、__END__ 以下があるか無いか調べるにはどうしたら良いのでしょうか。
0149nobodyさん
04/03/04 05:16ID:???__END__ 以下に何が書いてあるかプログラマが把握できない
状況というのは健全でない気がするが。
単純にやるなら
if (my @data = <DATA>) { ... } else { ... }
なり
local $/ = undef;
if (length(my $data = <DATA>)) { ... } else { ... }
なりご自由に。
0150nobodyさん
04/03/04 11:13ID:???0151nobodyさん
04/03/04 12:42ID:FGoSTbqMperlをインストールしてソースを書いてブラウザに表示させたところ
ソースコードがすべて出てきてしまいました。#!usr/local/bin〜__END__まで
すべて表示されました。
単刀直入にいってどの部分がおかしいとこういう現象になるんですか?自分ではどこがわるいのかわかりません
0153nobodyさん
04/03/04 12:49ID:???ローカルで動かせる環境ってことだよな。
OSがMIMEタイプを誤認識してtext/plainになってるとか。
もしくは、ちゃんとttp://localhost/とかでアクセスしてる?
まずインスコはちゃんとできてるかを確認するために、
コマンドラインを叩いてみることを勧める。
0154151
04/03/04 12:54ID:???どうもありがとうございます。その解説部分の#はちゃんとはずしてあります。
>>153
私にはちょっとむずかしそうですが、パソコンはいじってないのでtext/plainとかには
なっていないように思います。localhost/sample.cgiとしてアクセスしていますし、ドキュメントルートにちゃんとファイルは置いています。
コマンドラインでも確かめてみようと思います。親切にありがとうございました。
0155nobodyさん
04/03/04 13:23ID:???readdirでファイル名一覧を取得した場合、
必ず「.」「..」は最初の二つに出てくるものなんですか?
例えば、取得したファイル名を配列に突っ込んだ後でファイル名を取り出そうとする場合、
配列の添え字は[2]からアクセスすれば問題無いですか?
自分の環境では問題無いのかもしれませんが、
他の環境でもこのような「.」「..」のものも必ず取得するのでしょうか?
0156nobodyさん
04/03/04 13:54ID:???サブディレクトリには必ず存在するもの。(ファイルシステムによるが)
ファイル名を取得する際、「.」と「..」なら無視するようにしてみては。
0157151
04/03/04 14:02ID:???ダメでした。パールのパスはインストール時にちゃんととおってました。
windows2000を使っているんですが、インストーラをヴァージョン2にしてから、
パールをインストールしたんですが、やたらインストールに時間がかかったので、
うまくインストールできてないんでしょうか?
だれか分かる人がいたら教えてください。よろしくお願いします。
0158nobodyさん
04/03/04 14:05ID:???ドキュメントルートのOptionに+ExecCGIがないとかでは?
>>155
先頭が「.」なファイルも除外していいんなら
my @filelist = grep( /^[^.]/, readdir(DIR) );
とか。ディレクトリを省きたいっつーんなら
my @filelist = readdir(DIR);
foreach (@filelist){
next if( -d );
#処理
}
とかがお手軽。
0159nobodyさん
04/03/04 14:07ID:???「 perl[半角スペース]-v 」だぞ?
まず入れたPerlの入手先とかはどこだ?
Activestate?
コーディングスレだとスレ違いっぽくなってきたのだが。
△▲ WebProg 初心者の質問 Part7 ▼▽
http://pc2.2ch.net/test/read.cgi/php/1073460282/
こっちに移動しとくと叩かれないかも。
0160nobodyさん
04/03/04 14:18ID:???>>155です。
ファイルテスト演算子の-dを忘れていました。
next if (-d);
を利用しようと思います。
ご親切に有難う御座いました。
0162nobodyさん
04/03/04 20:05ID:???ありがとうございます。
外のファイルに出してる方が確かに良いのですが、
どうせ数行程度の文しか使わないような感じなので
態々外のファイルを読むよりも中に書いて置こうという事になったのです。
0164nobodyさん
04/03/05 00:13ID:???>>163
情報ありがとうございます。
開発環境がWin2000と2003 Serverなので、当分問題は無いでしょうけど、
その辺も考慮してコーディングしていきたいと思います。
わざわざレス感謝です。
0165nobodyさん
04/03/05 01:12ID:???win98でActivePerl使ってて、ダブルクリックでpl動かしてるんだけど、
コンパイルエラー行を出す時、
他のファイルに
open FILE, 'エラーファイル名';
while(<FILE>){
$aaa .= $_;
}
eval $aaa;
print "$@ \n";
sleep(10);
ってな記述してエラーメッセージ出してんだけど、
これって非常識?
もっと手っ取り早いやりかたあんのかな?
0166nobodyさん
04/03/05 03:00ID:???エディタで起動させて同時にカレントディレクトリを移動させたりすれば便利
■ このスレッドは過去ログ倉庫に格納されています