Perlコーディング初心者質問スレ Part 40
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0792nobodyさん
05/03/02 11:01:57ID:fmkJJ4kU読み込むファイルの中身
--------
1
data
--------
やりたいこと=最初の数字を抜き出して、数字を足して、データを上書き
つまりこんな感じに
--------
2
data
data
--------
書いてみたもの(失敗)
--------
open (IN, "$outputFILE");
@tes = <IN>;
close (IN);
$tes = $tes[0];
$tes++;
$tes[0] = $tes;
open (OUT, ">$outputFILE");
print @tes;
close (OUT);
open (OUT, ">>$outputFILE");
print OUT "data\n";
close (OUT);
--------
アドバイスおねがいします!!!
0794nobodyさん
05/03/02 11:29:16ID:???print OUT @tes;
0796nobodyさん
05/03/02 14:24:28ID:???0799nobodyさん
05/03/02 17:19:36ID:???0800nobodyさん
05/03/02 17:28:30ID:jdtsRVWh外部ドメインにあるXMLを読み込んできて、そのまま吐き出す方法は
ございますでしょうか?
どなたかご教授お願いいたします。
0801nobodyさん
05/03/02 17:31:34ID:???スクリプトのトークンがほしいんだけど、
どうすりゃええのですか?
こーゆー時って、全部自分で作るの?
なんかモジュールないのかな?
記述渡したらリストになって返って来るヤツとか。
0802800
05/03/02 18:26:02ID:jdtsRVWh0803nobodyさん
05/03/02 18:30:33ID:???これ>>648,649,652 はどうして
マッチした行頭...の下の本文の行も出力されるのですか?
0805leaf.child
05/03/02 18:38:44ID:???メールは問題なく送れるのですが、"Content-Type: text/plain; charset=iso-2022-jp”
部分が本文に表示されてしまいます。
open(MAIL,"| $sendmail -t") || die ("Fail to send E-mail: $!");
print MAIL "To: $headerTo\n";
print MAIL "From: $headerFrom\n";
print MAIL "Subject: $headerSubject\n";
print MAIL "Content-Type: text/plain; charset=iso-2022-jp\n\n";
print MAIL $body;
close(MAIL);
誰かわかる人いませんかぁ??
0806nobodyさん
05/03/02 19:22:26ID:???いちばんありがちなのは、$headerSubjectの最後に改行が含まれている、
だが。
こういう問題が出たときは、パイプじゃなくてファイルに書き出すように
して出力をよく眺めるとかするのが正攻法だな。
0807nobodyさん
05/03/02 19:51:55ID:???|| && or and
これらの演算子は短絡演算子って言って、演算子の左辺の結果が満たされた場合右辺は実行されないんよ。
つまり、行頭が ... で始まる行は、左辺の結果が真になるから右辺が実行されて $sample が含まれているかチェックされる。
含まれていたら、$target がセットされて、含まれていなければ $target がリセットされる。
行頭が、 ... で始まっていない行は、左辺の結果が偽になるから、右辺が実行されない。
だから、 $target の内容は、 ... で始まる行の結果に依存されて出力されるというわけ。
0809leaf.child
05/03/03 02:20:05ID:QkSLneVbありがとうございました。
Subjectの改行を直したところ
問題点は表示されなくなりました
0810nobodyさん
05/03/03 07:35:14ID:???$targetの役割は、プリントするかどうかの状態を記憶することで、一般的にフラグと呼ばれている。
これが真であるうちは、プリントされる。
これが変更されるのは/^\.{3}/にマッチしたときのみなので、
次に...で始まる行までプリントされる仕組み。
0812nobodyさん
05/03/03 10:25:21ID:???and &&
には突っ込まないんだな
0813nobodyさん
05/03/03 10:56:31ID:???0814nobodyさん
05/03/03 11:14:57ID:???ここでしょう。
0815nobodyさん
05/03/03 12:18:45ID:???'&&', 'and' の左辺が偽を満たしたら右辺は実行されないけどそれが変なの?
0816nobodyさん
05/03/03 12:24:48ID:???>偽を満たしたら
そんなアクロバットな説明しなくていいですからwwwww
0817nobodyさん
05/03/03 12:28:35ID:???0818nobodyさん
05/03/03 12:38:12ID:???0819nobodyさん
05/03/03 12:44:30ID:???ありがとう、了解!
0820nobodyさん
05/03/03 12:50:57ID:???0821820
05/03/03 12:51:29ID:???0822nobodyさん
05/03/03 13:01:21ID:???my $value =qq(あいうえお);
$valueの中に入ってるひらがなを半角カタカナにjcode.plを使用して変えたい。
jcode::tr(\$value,"あ-ん","ア-ン");
こうするとおかしなことになりますがどうしてですか?
jcode::tr(\$value,"あ-ん","ア-ン");
jcode::z2h_euc(\$value);
これだと今のところ大丈夫です。
やはり直接半角に変換は不可能ですか?しかし・・・内部的な処理は同じではないのか・
0824nobodyさん
05/03/03 13:15:23ID:???全角ひらがなと半角カタカナのコードの並び順が違うから。
全角ひらがなと半角カタカナは同じ。
まず文字コードとキャラクタセットについて勉強しましょう。
0826nobodyさん
05/03/03 17:25:13ID:???ファイルハンドルから1行ずつ読み取るときに
while (<IN>) {
chomp }
while ( chomp( $hoge=<IN>) ) { 〜 }
0827nobodyさん
05/03/03 17:28:42ID:???FHから1行ずつ読み込んでchompするときは
while (<IN>) {
chomp
}
とか
while ( chomp( $hoge=<IN>) ) {
〜
}
な感じでやってるんですが
デフォルト変数$_の時
こんな感じに1度で済ますことは出来ないのですか?
while ( chomp <IN> ) {
〜
}
0828nobodyさん
05/03/03 17:42:29ID:F2b+bV+tchomp @_;
$_ = join ('',@_);
0830nobodyさん
05/03/03 18:01:27ID:???0831827
05/03/03 18:32:46ID:???>>828は一度に@_に入れてるんですよね?
使い所によっては便利ですね。勉強になります。
>>829
改行が無い場合は何もしないんじゃなくて0を返してたんですね
改行が無い場合は何もしないと間違って憶えてました
828さん、829さんありがとうございました
0832nobodyさん
05/03/03 20:42:46ID:F2b+bV+tOui.
もし、chompの後に$_で一つずつ処理をするのならば
@_ = <IN>;
chomp @_;
while ($_ = shift @_)
{
〜
}
という事もできます。
0835832
05/03/03 21:11:20ID:F2b+bV+tあ、本当だ。スマソ
0836nobodyさん
05/03/03 22:01:20ID:???0837nobodyさん
05/03/03 22:58:04ID:???sub my_chomp($);
while(my_chomp <DATA>){
...
}
exit;
sub my_chomp($)
{
$_ = shift;
chomp;
return(defined $_);
}
0838829=833
05/03/03 23:52:40ID:???結局、定石通り (>>827 の最初のやつ) にするのがベストだと思うようになった。
0839nobodyさん
05/03/03 23:59:42ID:Q1wNh1eiなぜでしょうか?(改行押すと送信になる)
データが壊れてしまうので、改行が入らないようにしたいのですが
どうすればいいでしょうか?よろしくおねがいします。
0840nobodyさん
05/03/04 00:22:07ID:???ん?
0841nobodyさん
05/03/04 01:13:12ID:???なぜ改行が入ったかは確かに謎だが、たぶん Perl コーディングに関係ない原因だとは思う。
コーディングで解決するなら >>840 みたいにするんだろうなあ。
>>840
それって入力が元々 $_ に入ってるんであって、決して ~ が抜けてるわけじゃないよな?
0842nobodyさん
05/03/04 01:17:56ID:???$_自体が書き換えられる
0843nobodyさん
05/03/04 01:24:24ID:???何故入るのかは分からないが、それによって壊れるようなプログラムを書くのは良くない。
取得したデータから改行を取り除くほうが安全だぞ。
0844839
05/03/04 04:55:51ID:???ありがとうございました。
842の意味がよくわからなかったのでとりあえず
$hoge =~ s/\n//g; を入れてみました。
自分でバグが再現できないので、有効なのかはわかりませんが。。
>>843
うーんまだよく方法がわかりませんでした。CGIで
data<>data<>message message message<>data<>
data<>data<>message message message<>data<>
このように保存してるデータで、一つだけ
data<>data<>message message message<>data<>
data<>data<>message message
message<>data<>
こうなったため、表示が壊れるという感じでした。
初めて自分で1から書いたので・・・
0846nobodyさん
05/03/04 09:14:20ID:???0847nobodyさん
05/03/04 10:13:02ID:???・・・意図的に送りつけるのは簡単だが。
ファイルへ書き込むまでにいろいろ処理してるでしょ?
処理途中で改行が紛れ込んでしまうことだってある。コーディングミスで。
再現性を確立しないと追いかけるのは難しいなり。
0848nobodyさん
05/03/04 12:05:01ID:???君はXSSってのを少し勉強したほうがいいよ。
相手が送ってくるものは全てウイルスと思え。
その上でウイルスが送られてきても大丈夫なように作らないと、君のサイトが
ウイルスの配布元になったりするかもしれない。
まあウイルスってのはおおげさだけどね。
0849nobodyさん
05/03/04 12:35:30ID:???iniファイルのままサーバに置いておくと、
ブラウザで見たときに「ファイルの保存」ダイアログが開かずに、
iniファイルの中身が見えてしまいます。
「右クリックして保存しろ」などの注意文を書く、という手もありますが、
せっかく投稿ということで掲示板的CGIも作っているのでCGIを通すことで
ダイアログを開かせることにしました。
CGIはContent-Typeにtextと入れると広告が入るとかでちょっと苦労しましたが、
なんとかダイアログを出させて、正しい中身を送信できるようになりました。
しかし、ここで微妙な問題が残りました。
ダイアログを開いた時のデフォルトのファイル名が、「〜〜.cgi」になってしまうのです。
なんとかして.iniにできないかと調べているのですが、
御存じの方がいらっしゃいましたらお願いします。
# ファイル名が指定できなかったらCGIを通すのはやめて注意文方式にするつもり。
0851nobodyさん
05/03/04 13:11:12ID:???print "Content-Disposition: attach; filename=$file_name\n\n";
とか
0852nobodyさん
05/03/04 13:34:06ID:???windowsXPなどで画像・動画ファイルを選択して切り取りして上の階層に貼り付けるみたいな感じです。
普通に
open FH,"$filename";
my @file = <FH>;
こういう感じでバイナリーファイルも問題なくコピーできるんでしょうか?
それとも何かオススメのモジュールがありますか?
0853852
05/03/04 13:41:24ID:???どうすればいいんですか?
0854nobodyさん
05/03/04 13:42:11ID:???>>852 rename でだいたいうまくいく。うまくいかない場合はFile::Copyモジュールのmoveメソッド、だってさ。
0855852
05/03/04 14:07:07ID:???renameでできました。カレントの中にあるディレクトリ名だけを配列に入れたいんですが、
なにか言い方法はないでしょうか?
globでできるのかなと色々試してますが、ディレクトリだと判断できません。
0856852
05/03/04 14:16:19ID:???判断できないのかな。。。。
0857nobodyさん
05/03/04 14:16:27ID:???ちなみにディレクトリ内全部見る場合 readdir のほうが glob "*" より効率的らしい。
0858nobodyさん
05/03/04 14:37:52ID:???$str =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
これでエンコード(?)したやつを元に戻すのはどうやればできるんでしょうか?
とりあえず反転して
$str =~ s/pack("C",hex($1))/%([0-9a-fA-F][0-9a-fA-F])/eg;
とやってみたんですがダメでした(当然かな・・・)
0859852
05/03/04 14:39:42ID:???#京
# ディレクトリ名だけ取得
my @dirs;
foreach (glob "*"){
if ( opendir DIR,"$_") { push @dirs,$_; closedir DIR; }
}
my @files;
foreach (@dirs){
my $dir = $_;
foreach (glob"$dir/*"){
my ($file) = m{^[^/]*/(.*?)$};
rename $_,$file;
}
}
open FH,">test.txt";
foreach (@files){
print FH $_,"\n";
}
close FH;
print "content-type:text/html;charset=euc-jp;\n\n";
色々試してる間になんとなくでこれを実行したらデスクトップにあったファイル・フォルダが全て
壊れたのかどこかに移動されてしまいましたorz
今かなりあせってます。
これはtest.plという名前でデスクトップ直下の画像ファイルを収納しているフォルダに
いれてましたので、その外側に影響を与えるはずはないからと安心してたのですが・・・・
本気でやばいので助けて下さい。元に戻す方法はないでしょうか。
0861852
05/03/04 14:52:31ID:???perl -c をやるつもりでそれをなしでtest.plを実行させてしまったので、
そのときのカレントディレクトリである
C:\Document and Settings\a
でこれを行ってしまったようですorz
最悪です。こういうことの修復はもう手動でしか出来ませんよね?
それでしたらパソコン初心者板に行って聞いてこようと思うのですが・・・
0862852
05/03/04 14:57:54ID:???もしも1発で回復する方法などありましたら・・ってそれじゃマルチになっちゃうか。
とにかくすみません。行って来ます。
0864nobodyさん
05/03/04 15:24:38ID:???プログラムに誤りがなければアクセスログを見て書込んだブラウザを追い掛けてみるといい。
ネスケ4以前とか一行テキストボックスにコピペで改行コードを含めたりできる。
他にもスクリプト経由で改行を含めたデータを送りつけられたりできるし
フォームページをパソコンにダウンロードしてフォームを改竄して送りつけることもできる。
テキストエリア意外のデータでも改行コードのエスケープ処理をするのは良い方法だ。
Perlコーディングとは関係ない話なのでこれまで。
0865852
05/03/04 17:06:39ID:???とりあえずフォルダ命をしっかり指定したこれからはやります。
0866852
05/03/04 17:14:04ID:???しかしこれの式ってOS依存なんですよね?
windowsXPですが、
C:\Documents and Settings\a
こういうディレクトリをglobに渡したいのですが、
glob "/Documents and Settings/a";
これではダメなようでどうやら半角スペースがダメみたいです。
半角スペースのマッチはどうするんですか?
それとこれはテストはwinXPですが実際にはlinuxなのです。
やはり互換性がありませんか?
";
0867nobodyさん
05/03/04 18:57:04ID:Xe71hSRxdbmopenを使うと、サーバはどのDBMを使っているのでしょう?
サーバ次第だと思いますが、何か設定箇所か法則性があれば
教えてください。
また、DBM次第で拡張子(db, pag, dir)がいくつかありますが、
このDBMは必ずこの拡張子という決まりはあるのでしょうか?
別サーバへのDBMファイル移行で詰まっています…
0868nobodyさん
05/03/04 19:00:20ID:???print <<EOM;
と
print <<EOF;
の違いって何ですか?
0871nobodyさん
05/03/04 20:38:45ID:???巷に配布されてるスクリプトにShift_JISが多いのは何故ですか。
Shift_JISで書くことで何か旨みがあるのですか?
0872nobodyさん
05/03/04 20:47:03ID:???0873nobodyさん
05/03/04 20:55:48ID:???0874nobodyさん
05/03/04 21:14:36ID:???0876nobodyさん
05/03/04 22:26:35ID:???$a =~ s/<br>/\n/g;
これをどう変えればいいですいか?
0877nobodyさん
05/03/04 22:40:30ID:???Windowsの「メモ帳」がShift_JISにしか対応してないことと、
テキストエディタ上で設定する必要があることに起因しているようですね。
ありがとうございます。
0878nobodyさん
05/03/04 23:28:05ID:???http://www.perldoc.com/perl5.8.0/pod/func/dbmopen.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perltie.html
http://www.att.or.jp/perl/man/anydbmfile.3pm.html
0880nobodyさん
05/03/05 00:22:28ID:???globの半角スペースは、OS依存でなくglobの仕様
glob '/usr/*/*/* /bin/* /etc/*/*';
という記述もできるようになっている。
半角スペースをファイル名の一部とみなしてほしい場合は
半角スペースの直前にバックスラッシュ(円マーク)を記述して
エスケープすればよい。
0881nobodyさん
05/03/05 02:58:35ID:hbhM7+40まずグーグルの使い方を覚えようね。
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=%E6%94%B9%E8%A1%8C%20%E5%A4%89%E6%8F%9B+textarea&num=50
0882nobodyさん
05/03/05 09:42:12ID:???エロい人おしえてください
0883852
05/03/05 11:08:25ID:???エスケープは何度も試したんですが・・・・
どうやらシングルクォートでやらないといけないようですね。
"/Documents\ and\ Settings/a/*"
これではダメで
'/Documents\ and\ Settings/a/*'
これだといけました。そうなってくるとperlとしては半角をエスケープしてないことに
なるんだけどな・・・よくわからん。
0885nobodyさん
05/03/05 12:34:00ID:???ダブルクォートだと glob に渡る前にエスケープが解釈されちゃうだろ。
sub hd { join ' ', map uc unpack('H2', $_), split //, $_[0] }
print hd("/Doc\ and\ Set/a/*"), "\n";
print hd("/Doc\\ and\\ Set/a/*"), "\n";
print hd('/Doc\ and\ Set/a/*'), "\n";
0886nobodyさん
05/03/05 14:24:31ID:???jcode.plがUnicode非対応。
自力でやるにも文字コードの判別、変換が困難。
Perl5.8以降限定や、Jcode.pm必須にするか、
文字コードのチェックを行わなければ大丈夫だろうけど、
そこまでしてUTF-8にこだわる理由が見出せない。
でも、XHTMLが主流になれば、移行していくと思うよ。
0887nobodyさん
05/03/05 14:38:07ID:???配布するスクリプトはまあいろいろ難しいだろうな
0888nobodyさん
05/03/05 15:02:07ID:???$tmp = 'http://foo/bar/1234.jpg';
$pat = '(.*)\.jpg';
$rep = '\1.png';
$tmp =~ s/$pat/$rep/;
print "$tmp\n";
これだと、「\1.png」としか表示されません。
置換の所を、
$tmp =~ s/$pat/\1.png/;
にすれば期待通りの結果がでますが、どうすればいいのでしょうか。
パターンも置換文字列も変数を使用したいです。
0889nobodyさん
05/03/05 15:02:38ID:???0890nobodyさん
05/03/05 15:26:50ID:???メモ帳で UTF-8が開けるの初めて知ったよ(Win2000)
でもデフォはSJISだから95とかMeが廃れても無理っぽい。
0891nobodyさん
05/03/05 15:36:58ID:???スクリプト開発者はさすがにメモ帳デフォのままでコーディングしないっしょ?
0892nobodyさん
05/03/05 16:06:25ID:???$tmp = 'http://foo/bar/1234.jpg';
$pat = '(.*)\.jpg';
$rep = '$1.".png"';
$tmp =~ s/$pat/$rep/ee;
print "$tmp\n";
■ このスレッドは過去ログ倉庫に格納されています