Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0267nobodyさん
2005/06/07(火) 22:01:43ID:B1nXEBrsすいません、$offCount は $xx と脳内変換しといてください・・・
追加書き込みモードじゃなくて、上書きしたいんですができます?
0271nobodyさん
2005/06/07(火) 22:48:25ID:???>>267
seek truncate tell とかで検索しとけ。
0273nobodyさん
2005/06/08(水) 02:11:43ID:3Bw2MIjpごめんわからへん
0274nobodyさん
2005/06/08(水) 07:35:48ID:???俺も若い頃 print FILE "@log"; とか書いてスペース入るのが困って foreach (@log) { print FILE $_; } とか書いてた甘酸っぱい記憶を思い出したよ・・・ orz
0275nobodyさん
2005/06/08(水) 09:55:34ID:???↑を見てsysopenを使おうとしたんですが、Fcntlを使わなければmodeの指定は出来ないんでしょうか?
固定の数値なら直値で打っちゃうんだけど、環境依存するものですか?
0276nobodyさん
2005/06/08(水) 10:04:49ID:???建前上は環境依存するものなのでFcntl使っとけ。
いちいちいくつになってるか調べたりこの環境では
OKか気にするのは無駄。
0278nobodyさん
2005/06/08(水) 18:09:13ID:iGltiuvK配列の要素をすべてではなく一部飛び飛びで
取り出したいのです。
$count = @DATA_N;
foreach (5..$count) { 処理 }
とすれば5番めの項目から最後までと言うことらしいのですが
では1番目と5番目以降というように
いくつか項目を飛ばして取り出すには
どのようにすればいいのでしょうか?
よろしくお願いいたします。
0279nobodyさん
2005/06/08(水) 18:33:55ID:???つーか配列の "5番目の項目" の添え字は [4] なのは理解してるよね? 一応釘
0280nobodyさん
2005/06/08(水) 18:47:04ID:iGltiuvK>添え字は [4] なのは理解してるよね? 一応釘
はい[0]から始まると言うことは理解しております:汗
そうですね「,」で区切ればいいのですね。
「..」は「から〜まで」と言う風に理解すればいいのですね!
勉強になりました。
ありがとうございました。
0281nobodyさん
2005/06/09(木) 01:19:34ID:???CGI.pm だと使ってるようだから?、後始末さえしっかりやればいいのかのう。
0282nobodyさん
2005/06/09(木) 11:30:41ID:???@log = <LFILE>;
($sec,$min,$hour) = localtime(time);
$aftertime = "$hour:$min:$sec unixtime:" . time ;
$data = "$aftertime \n";
unshift(@log,($data));
while($log){
print LFILE $_;
}
close(LFILE);
質問です
$logfileに時間を一番上に追加してゆく処理を行いたいと思い、
↑のようにコーディングしたのですが、全く更新されません。
なぜですか?
0283nobodyさん
2005/06/09(木) 11:51:59ID:???問題点1:
while($log) → foreach (@log)
問題点2:
LFILEの中身を呼んだ後seekしてないのでこのままでは続きから書かれるだろう
問題点3:
そもそもファイルの頭に追加するという設計を見直した方がいい。
末尾への追加は簡単だが、頭へ追加しようとすると全部書き直しになるので
普通はそういうことははじめからしなくていいようにしとくものだ。
0284nobodyさん
2005/06/09(木) 12:12:41ID:???0285nobodyさん
2005/06/09(木) 12:27:48ID:???頭に追加したほうが、見やすいので、そういう設計にしました。
ありがとうございました!
0286nobodyさん
2005/06/09(木) 13:53:02ID:r/eHxoG7送信できなくてこまってます・・
www.hoge.co.jp サーバで
メール送信CGI mail.cgi があって
ここからメールを送信させているんですが
送信先メールアドレスが
[email protected] とか [email protected] のような
hoge.co.jp サーバ以外への送信ならうまくいくんですが
[email protected] とか [email protected] への
送信だとうまく送信されない(届かない)ようなんです。
mail.cgi自体は同じものを使用していて
@hoge.co.jp 以外のメールアドレスへの送信はうまくいっているので
sendmail の問題?なのかもしれませんが
何か調べる必要がある点などありましたらご教授お願いします。
0287286
2005/06/09(木) 13:55:21ID:r/eHxoG7メールが届かないメールアドレス([email protected] とか [email protected] )自体は
他のメーラやWEBメールから送信されたメールを
正常に受信できてます。
あくまで www.hoge.co.jp 上の mail.cgi から
[email protected] へメール送信しても届かない・・・という感じです。
0288nobodyさん
2005/06/09(木) 13:55:42ID:???0289286
2005/06/09(木) 14:19:27ID:r/eHxoG7www.hoge.co.jp 上に mail.cgi を設置しています。
mail.cgi の内容は次のような感じです。
mail.cgi
----------------------------------
$head = "From: [email protected]\n";
$head .= "To: [email protected]\n";
$head .= "Subject: TEST MAIL\n";
$head .= "Date: $Date\n";
$head .= "Content-type: text/plain\n";
$head .= "Mime-Version: 1.0\n\n";
$body = "テスト";
open(MAILER, "| /usr/sbin/sendmail -t") || exit(0);
print MAILER $head;
print MAILER $body;
close(MAILER);
----------------------------------
0290286
2005/06/09(木) 14:20:03ID:r/eHxoG7$head .= "To: [email protected]\n";
の送信先部分が [email protected] だと
メールを送信してもメーラ側で受信できず(届いていない)
$head .= "To: [email protected]\n";
のように [email protected] 以外へメールを送信した場合は
正常にメーラ側でメールを受信できる状況です。
なので、コードがおかしい分けでなく
www.hoge.co.jp 上の sendmail か何かの設定がおかしいのかも
しれませんが・・・。なんなんでしょう・・。
ちなみに [email protected] のメールアドレス自体は
他のメーラやWEBメールから送信したメールを
正常に受信できています。
0291nobodyさん
2005/06/09(木) 14:54:19ID:???シングルクオートで囲むか "\@hoge" とエスケープしてみ。
ていうか、 abc.co.jp とか test.co.jp とか実在するドメインを例に使うな。
予約ドメインの example.co.jp とか example.ne.jp とか example.jp とかを使え。
0292nobodyさん
2005/06/09(木) 17:33:54ID:???モジュールを使わないという前提で、参考になるサイトはありませんでしょうか。
ぐぐり疲れました・・・orz
0293nobodyさん
2005/06/09(木) 18:27:43ID:???http://www.studyinghttp.net/body#Form-data
理解できなきゃ素直に CGI.pm 使うなり、
CGI.pm バラして必要なトコだけパクりなされ。
0294nobodyさん
2005/06/10(金) 00:38:57ID:gI851X9W0295nobodyさん
2005/06/10(金) 00:52:30ID:gI851X9W質問なんですけど、shiftやpopは先頭か末尾ですよね。
そういうのじゃなくて配列の任意のデータを削除したいんですが、どうやるんでしょう?
0296nobodyさん
2005/06/10(金) 01:22:16ID:???0299nobodyさん
2005/06/10(金) 11:01:32ID:n3jB9OmG# 処理
my %in;
&decode;
&html if (!$in{send});
$inや%inは何か特別なのでしょうか?
0300nobodyさん
2005/06/10(金) 11:07:59ID:???0302nobodyさん
2005/06/10(金) 12:00:39ID:???<input type="radio" name="yes" value="1">はい
<input type="radio" name="yes" value="2">いいえ
を
<input type="radio" name="yes" value="1" id="yes1"><label for="yes1">はい</label>
<input type="radio" name="yes" value="2" id="yes2"><label for="yes2">はい</label>
にしたい。
メソッド改造は汎用性が無いので
正規表現とかでなんとかならないでしょうか?
0303nobodyさん
2005/06/10(金) 12:01:26ID:???cgi-lib.pl使った時のデフォじゃね?
ttp://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi/free?page=cgi-lib.pl
0304nobodyさん
2005/06/10(金) 12:04:13ID:???0305299
2005/06/10(金) 12:06:16ID:n3jB9OmGページを読みましたが$inはなかったです。
0306299
2005/06/10(金) 12:12:11ID:n3jB9OmGありがとうございます。
早速cgi-lib.plをみてみます。
0307nobodyさん
2005/06/10(金) 12:26:18ID:???0308302
2005/06/10(金) 12:29:51ID:???私もそう思うけど
<input type="radio" name="yes" value="1" id="yes1"><label for="yes1">はい</label>
なら、とりあえず
%labels =('1','<label for="yes1">はい</label>');
$co->radio_group(
-name=>'yes',
-values=>['1','2'],
-labels=>\%labels);
で、いけるんで・・・。
これもむちゃくちゃ使いにくいけど。(・・`)
0309nobodyさん
2005/06/11(土) 01:51:46ID:KxmWI2vs配列の中から文字列を検索して、
その文字列が含まれている配列の添え字を取得することはできますか?
例えば、
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
みたいな配列@dataがあって、そのなかから"72歳"という文字が
含まれている配列の添え字(この場合だと1)を取得したいのですがどうすればよいでしょうか?
0310nobodyさん
2005/06/11(土) 02:23:38ID:???my @data;
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
my $str = "72歳";
for ( 0..$#data ) {
if ( $data[$_] =~ /$str/ ) { print; }
}
__END__
0311nobodyさん
2005/06/11(土) 02:46:40ID:???$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
my$str = "72歳";
for(0..$#data){
print $_ if [split(/<>/,$data[$_])]->[1] =~ /$str/;
}
0312nobodyさん
2005/06/11(土) 03:03:41ID:???0313nobodyさん
2005/06/11(土) 03:03:43ID:???0314313
2005/06/11(土) 03:05:12ID:???0315312
2005/06/11(土) 03:06:40ID:???オマイので気付いた('A`)
print grep { (split /<>/, $data[$_])[1] =~ m/$str/ } 0 ..$#data;
0316nobodyさん
2005/06/11(土) 09:07:57ID:???変数名を変数で扱うことができますでしょうか?
分かりにくいので例を示しますと、
$TEST = "test";
$OUTPUT = "[[[TEST]]]";
$OUTPUT =~ s/\[\[\[(.*)\]\]\]/$$1/g;
print "$OUTPUT";
↑これで、”test”という出力がほしいのですが…
3行目のコーディングはWindows版のActiveperlでは動くのですがLinux版ではエラーになってしまいます。(もともと、あんなコードで動くことが予想外なんですが。)
よろしくお願いします。
0318nobodyさん
2005/06/11(土) 10:58:39ID:???それであってるはずだがsymbolic referenceを使うことに
なるのでstrict refsな時は問題がでるかもしれん。
というかエラーになるというのならエラーメッセージぐらい
示せよ...
0319nobodyさん
2005/06/11(土) 12:06:49ID:???そのファイルをほしいと言う人がいるので、その人にファイルを与えようと思っています。
しかし、そのファイルを再びダウンロードしてアップロードするとすれば 1 日ぐらいかかってしまいますので、
CGI からそのファイルにリンクしようと思っています。
しかし、 perl 初心者なので、自分が作ったプログラムをサーバ上で実行していいかわかりません。
どうか、以下のプログラムは大丈夫か確認していただけないでしょうか。
#!/usr/bin/perl
&output;
sub output {
open(IN,"(ここにファイルパス)");
print "Content-type: application/x-zip-compressed\n\n";
binmode(IN);
binmode(STDOUT);
print <IN>;
close(IN);
exit;
}
0320nobodyさん
2005/06/11(土) 12:11:42ID:???迷惑だからやめれ。
そのファイルへのリンク貼るか教えるだけでいいじゃん。
0321nobodyさん
2005/06/11(土) 12:16:11ID:???0324質問
2005/06/11(土) 22:30:32ID:95WOJCIX具体的には、Aのなかで、
open(HANDORU,">B.cgi");
print HANDORU << "END";
#!c:\perl\bin\perl
print $data;
END
close(HANDORU);
とした場合、B.cgiはつくられるのですが、
その内容で、\(円マーク)が消えており、、また$dataがなくなってしまいます。
¥を¥にしたらそのまま「¥」にされて書き込まれたりします。
どうしたら、うまく¥や変数が記述されるのでしょうか?
0325質問
2005/06/11(土) 22:36:20ID:95WOJCIX¥を&yen;にしたらそのまま「&yen;」にされて書き込まれたりします。
0326nobodyさん
2005/06/11(土) 23:01:48ID:???ttp://www.rfs.jp/sitebuilder/perl/02/02.html#5.エスケープシーケンス
0328nobodyさん
2005/06/12(日) 00:07:30ID:???if -d $_ && -w _;
って式があるんだけど、これは
if -d $_ && -w $_;
の略、ってことでよいの? つーか 略せるんだったの・・? 見たことなかったんだけど
0329nobodyさん
2005/06/12(日) 01:09:06ID:???perlfunc - Perl builtin functions
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item__i__X__i__FILEHANDLE
>どのファイルテスト (あるいは、stat や lstat) 演算子にも、下線だけから成る特別なファイルハンドルを与えると、
>前回のファイルテスト (や stat) の stat 構造体が使われ、システムコールを省きます
0330nobodyさん
2005/06/12(日) 01:21:50ID:Eqf0BMjVプライベートメソッド内で俗に言うthisを使い処理をする場合、
thisはプライベートメソッドを使用しているメソッドからそのメソッドに引数として渡して処理しなければならないのでしょうか?
どなたかご教授して頂けると嬉しいです。
0332nobodyさん
2005/06/12(日) 03:55:40ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlobj.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlbot.html
http://perl.infoware.ne.jp/documents/perlboot.ja.html
0333330
2005/06/12(日) 20:39:01ID:Eqf0BMjVすみません、一通り見てみたのですが何処に答えがあるか分かりませんでしたorz
見落としていたらごめんなさい。
プライベートメソッドがオブジェクトのリファレンスを取得するには、
やはり実際に呼び出されたメソッドから引数でリファレンスを渡してやらないと行けないのでしょうか?
0334nobodyさん
2005/06/12(日) 20:51:17ID:???なにをさしているかわからない以上はマニュアル嫁的な
一般論以上の回答のしようもないんじゃないかと。
perlの場合オブジェクト指向といっても$foo->f(...)の
形で呼べばfが$fooをblessしたときのパッケージから
探されるのと、自動的に$fooがサブルーチンfの最初の
引数になるぐらいの単純な仕掛けだから難しく考えても
しょうがないと思われる。
0335330
2005/06/12(日) 21:18:28ID:Eqf0BMjV説明下手ですみません。。たぶん、用語等ちゃんと理解できてないんだと思いますorz
プログラムからあるクラスのメソッドを呼び出すとき第一引数にオブジェクトのリファレンスが渡されますよね、
#sub new { $this = shift; ←これ
そのリファレンスをそのクラス内でしか使えない(使わない)メソッド
#sub _cool { ←慣例的に_で始まるサブルーチン名を付けられ、そのクラス内のメソッドから呼び出すので、
#第一引数にはオブジェクトのリファレンスが渡されないメソッド
で使いたいのですが、
#$this->{hoge} ←こんな風に
引数としてリファレンスを渡すしか方法はないのでしょうか(もっと綺麗な方法はないのでしょうか)?
0336330
2005/06/12(日) 21:19:41ID:???0337nobodyさん
2005/06/12(日) 21:25:29ID:???頭に_をつけたなんてのは人間が勝手に目印にしてるだけで
perlは何の特別扱いもしてくれない。頭が_じゃないのと
全く同じ。
0338nobodyさん
2005/06/12(日) 21:33:38ID:???0339nobodyさん
2005/06/12(日) 21:59:12ID:???0342nobodyさん
2005/06/12(日) 23:59:58ID:???0343nobodyさん
2005/06/13(月) 03:11:14ID:???0344nobodyさん
2005/06/13(月) 17:16:05ID:???Jcode.pmのような使い方をするときは、Encodeだけで間に合うと思うのですが。。
0345nobodyさん
2005/06/13(月) 19:18:16ID:???$str =~ s/>/>/g;
$str =~ s/</</g;
とやったら、「小」とか「松」って文字が文字化け
するようになったのだけど、どうやったら対処できそう?
0346nobodyさん
2005/06/13(月) 19:20:38ID:???$str =~ s/>/&gt;/g;
$str =~ s/</&lt;/g;
な感じ。
0347nobodyさん
2005/06/13(月) 19:44:01ID:???Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
0348nobodyさん
2005/06/13(月) 20:04:41ID:???突っ込んで EUC に変換して、
タグを変換して JIS に変換し直すって
ことかな?だりぃな。
0349nobodyさん
2005/06/13(月) 20:17:48ID:???それにブラウザによっては違う文字コード送ってくる場合もあるから、
どちらにしろ文字コードのチェックは必要だ。
0350nobodyさん
2005/06/13(月) 20:24:45ID:???ファイルと出力がJISなんだよ。
頭の柔らかい奴は、JISのタグ変換ぐらい、
もっとスマートな方法でやると思ったんだがな。
0351nobodyさん
2005/06/13(月) 20:27:26ID:???http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
http://search.cpan.org/~dankogai/Encode-2.10/lib/Encode/Supported.pod
0354nobodyさん
2005/06/13(月) 23:29:19ID:???意外と JIS 指定のところが多い
依存性の関係もあるのだろうが
SJIS とか EUC に拘っている奴は
場数が少ない人だと思う
といっても、 JIS に未来はないけどな
0355nobodyさん
2005/06/13(月) 23:37:35ID:???知ってる企業をいくつか検索してもJISで構築されているサイトが見つからない。。。
0356nobodyさん
2005/06/13(月) 23:57:27ID:???おまいが一番拘ってるように見えるがw
つーか、マンドクセだからeuc使ってるだけで。
普通に使う分には一番コスト低いと思うが。eucにデメリットある?
0357nobodyさん
2005/06/14(火) 00:26:50ID:???0358nobodyさん
2005/06/14(火) 00:31:27ID:???EUC-JP と Shift_JIS は誤判定されることが多いけど、
ISO-2022-JP だと割と誤判定されにくい、ってのはあるかも。
0359nobodyさん
2005/06/14(火) 00:38:52ID:???結構ある。 > http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
その点ユニコならこういう問題は起きない。 でもサイズが増えるのがデメリット。
0362nobodyさん
2005/06/14(火) 01:24:46ID:???Apache なら AddCharset しておくのが正しい姿だろうな
0363nobodyさん
2005/06/14(火) 01:34:09ID:???たぶんこれでできるから
foreach my $str($in =~ /(\x1B.*\x1B..)|([^\x1B]+)/g){
if($str=~/^[^\x1B]/){
$str =~ s/&/&/g;
$str =~ s/</</g;
$str =~ s/>/>/g;
$str =~ s/"/"/g;
}
$out .= $str;
}
0365nobodyさん
2005/06/14(火) 01:36:56ID:???すまん、間違い。
foreach my $str($in =~ /(\x1B.*\x1B..)|([^\x1B]+)/g){
は
foreach my $str($in =~ /(\x1B.*?\x1B..)|([^\x1B]+)/g){
ね。
0366nobodyさん
2005/06/14(火) 12:33:58ID:TLKadJIJ$text[$ii] = "<tr><td>上の段</td></tr>\n";
$text[$ii] =. "<tr><td>下の段</td></tr>\n";
と書き
$text[$ii]に"<tr><td>上の段</td></tr>\n<tr><td>下の段</td></tr>\n"が格納されるように、
コーディングしたつもりなのですが、エラーが発生してしまいます。
$text[$ii]に"<tr><td>上の段</td></tr>\n"に後から追加で"<tr><td>下の段</td></tr>\n"が、
格納されるようにするにはどのように変えたらよいですか?
■ このスレッドは過去ログ倉庫に格納されています