Perlコーディング初心者質問スレ Part 40
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0741nobodyさん
05/02/28 18:25:42ID:???print "hoge";
my $value ="hage";
ダブルクォートってみなさん何を使ってますか?
私は今までqq||;っていうのが多かったですが、qq||これは入れ子できませんよね。
qq[]やqq{}ならどうやら入れ子がいくらでも可能だということに今日気付きました。
print qq[@{[ map qq[$_],qw/a b c/ ]}];
こういうことがqq[],qq{}ならできるんですね。
結構このスレを覗いてるとqq||っていう人が多いようです。
どうしてなのでしょうか?qq[]これで入れ子を作るのは偶然大丈夫なだけとか???
0742nobodyさん
05/02/28 19:53:04ID:???0743nobodyさん
05/02/28 19:57:05ID:???俺の場合は2ch掲示板スクリプトとかSJISで書いてるからSJISの全角文字に含まれないのを使ってる。
print qq()が多いかなぁ。その中にカッコつかいたかったらエスケープしないでprint qq!!にしてるよ。
まあ、なんでもいいんだけど。
0744nobodyさん
05/02/28 19:57:46ID:???$text =~ s|(http://([-a-z0-9.]+)[-_.!~*'()a-z0-9;/?:\@&=+\$,%#]*)|
"<a href=\"$1\">". (substr($2, -3) eq '.jp' ? '日本' : $2). "</a>"|ige;
>>741
私はperlopに出てくる汎用書式そのままにqq{}使ってます。
http://www.harukaze.net/~mishima/perl/man/perlop.1.html
> 選んだ区切文
> 字が括弧の類でない場合には、前後の文字として同一のものを使い
> ますが、4 つの括弧 ((), <>, [], {}) の場合にはネストできます。
ただ、括弧はきちんとネストしないとだめなので、Shift_JISで'日本'なんてリテラルがあると、
本の2バイト目が\x7b({)なので使えなかったりします。
0746nobodyさん
05/02/28 21:23:11ID:???SJISは2バイト目が、'[', ']' もあるから、そういう意味ではベストじゃないよ。
>>744の4つの中でSJISで使われないのは '(', ')' と '<', '>' だけだから。
0748741
05/02/28 22:40:39ID:???!?
でも()や<>はきついんですよね。
print qq<<html>>;
こういう感じになってHTMLの閉じ忘れがそのままPerlのエラーになりますよね。
prnt qq(${\(100*200)});
こっちは何でも大丈夫になるんですよね。
>>743さんの
>print qq()が多いかなぁ。その中にカッコつかいたかったらエスケープしないでprint qq!!にしてるよ。
という一言がもの凄く気になるんですが、ネストokですし・・・何をさしてるのでしょうか?
もしかして(これの片方だけをテキストとして埋め込む時などの事を言ってるのかな。
それだったらqq{}qq[]qq<>共通の問題ですよね。
qq{},qq[]これの問題点は基本的にSJISでコーディングするときだけで、EUCで普通に組む時は
変数内にSJIS文字が格納されていても問題ないから大丈夫なんですよね?
0749nobodyさん
05/02/28 23:51:38ID:???print qq[[];
これは括弧が合ってないからエラーになる。
そしてShift_JISで
print qq[コンピューター];
と書くと同じエラーになる。
原因は'ー'の2バイト目が\x5b([)だから。
…という話です。
同様に
print qq|酢|;
もアウトです。
use encoding "shiftjis";で回避はできますが、
(),<>,!や"といった\x20-\x3fの範囲の記号は
漢字コードとして使われないので、この問題は起きません。
またリテラルでなければ、問題ありません。
EUC-JPでは全く問題ありません。
0750nobodyさん
05/03/01 00:42:29ID:???open FH,">test.text" || &error("ダメだこりゃ");
こうやったんだけど何故かエラー処理が機能しない。
open (FH,">test.text") || &error("ダメだこりゃ");
こうやったら機能した。何でこんな不都合な優先順位なんだろうか・・・
関数をいちいち括弧で括るのは面倒だし、汚い。
my $dbh = DBI->connect() || &error("まずいよそれ");
これの場合は完全に機能しない。コネクトに失敗しても&errorが呼ばれない。
何とか呼ばれるようにしたいけど、この場合は無理なの?
0751nobodyさん
05/03/01 00:46:44ID:???0752nobodyさん
05/03/01 00:49:31ID:???eval でトラップ汁
0754nobodyさん
05/03/01 01:01:36ID:???>>>749
>優先順位なんだろうか・・・
だよ
>関数をいちいち括弧で括るのは面倒だし、汚い。
or だよ
>この場合は無理なの?
俺に聞いてるの?
0755nobodyさん
05/03/01 02:10:40ID:???0756nobodyさん
05/03/01 03:14:15ID:???0757nobodyさん
05/03/01 03:42:42ID:???split '*',$value;
こうするとエラーになります。理由は*が正規表現のメタ文字だからです。
しかしシングルクォートなのに展開されるのはこまります。
split '\*',$value;
split /\*/,$value;
こういうことはしたくありません。何とかできませんか?
0760nobodyさん
05/03/01 04:47:02ID:???長いんですが・・・・
エスケープしたくないのは一文字分うっとおしいからです。
quotemetaだともっと長くなってしまいますよねorz
でもこんな夜中に親切にありがとうござまいしたm(_ _)m
0761nobodyさん
05/03/01 05:34:57ID:???自分専用のライブラリでも作ったら?
sub sp($$){
my $reg_str = shift;
my $in_str = shift;
split quotemeta $reg_str, $in_str;
}
とか作っておけばそれ以後は
sp '*', $value;
とかできるじゃん。
0764nobodyさん
05/03/01 12:18:28ID:VBiT7+i4その時にPOSTメソッドでfoo=barなどの情報も送りたいと思っています。
ヘッダー情報はどのように出力させたらよいでしょうか?
0765nobodyさん
05/03/01 12:20:59ID:???POSTじゃ無理だから普通はGETでURLに埋め込む
どうしてもPOSTにこだわるなら.htaccessでmod_rewrite使う
0766nobodyさん
05/03/01 12:38:51ID:VBiT7+i4THX!
無理なんですか。
ありがとうございました。
0767nobodyさん
05/03/01 13:37:54ID:???これを条件文にして真なら
open MAIL,"| /usr/sbin/sendmail -t";
もしも偽なら
open MAIL,">mailtest.txt";
これを実行してその後は同じことをしたいのです。
print MAIL "To:\n";
print MAIL 'From: ',"\n";
print MAIL '";
print MAIL $mail;
close MAIL;
どうすればいいでしょうか?ifはダサイので嫌いです。
?演算子でいきなりやれますか?
0768nobodyさん
05/03/01 13:39:45ID:???そうではなくて"| /usr/sbin/sendmail -t"これと">mailtest.txt";これの
どちらかを変数に入るようにして
open MAIL,$type;
などとしても動作するのですか?
0769nobodyさん
05/03/01 13:48:56ID:???ダサいとか思ってるのはお前だけだから
あと日本語の勉強頼む
0770767
05/03/01 14:08:26ID:???どういう意味でしょうか?
ダサイと思ってるのが自分だけだとしてそれが一体何の関係があるのですか?
右倣えしてれば満足できちゃう方ですか?
0771nobodyさん
05/03/01 15:09:18ID:???open MAIL, defined $ENV{'REMOTE_ADDR'} && $ENV{'REMOTE_ADDR'} ne '127.0.0.1'
? "| /usr/sbin/sendmail -t" : ">mailtest.txt";
ということ?
0772nobodyさん
05/03/01 16:02:49ID:???0773nobodyさん
05/03/01 16:26:39ID:???いちいち言わせないでね。
0774767
05/03/01 16:55:23ID:???もういいです。もっと綺麗に済ませました。ごめんなさい。
>>772
画面の前で一人で笑うんだね君は。
>>773
基本的に今回は私が八つ当たりをしただけなのでごめんなさい。
0775nobodyさん
05/03/01 16:57:23ID:???0776nobodyさん
05/03/01 17:01:59ID:???print <<"EOM";
そのとき
妹は
EOM
}
だとインデント無視しなければいけないのでいつも
if(1){
print "そのとき\n";
print "妹は\n";
}
と記述していますがこれだと面倒+速度遅くなってしまいます。
美しくかつ簡単で記述する方法はないでしょうか?
0779nobodyさん
05/03/01 18:08:05ID:AybE+O5Lprint分は全て以下のような形式で書いています。
print $handle qq("テスト");
これで、$handle="FH";とするか$handle="STDOUT";とするかでファイルに落としたり
画面にそのまま出力したり振り分けているのですが、
同一処理を画面に出しながらファイルに保存するにはどうしたらいいのでしょうか?
0780nobodyさん
05/03/01 18:16:06ID:???普通は出力なんて1回。だから出力内容をファイルにも入れたいなら
print $source;
open FH,">test.txt";
flock FH,2;
print FH $source;
close FH;
でおわる。
まずは出力はルーチンに投げておしまいというわかりやすいプログラミングを心がけてはいかが?
0782nobodyさん
05/03/01 18:22:57ID:???0783nobodyさん
05/03/01 18:28:20ID:???IO::Tee - Multiplex output to multiple output handles
http://search.cpan.org/~kenshan/IO-Tee-0.64/
0784nobodyさん
05/03/01 18:38:52ID:???Perlクックブックにレシピ1.11「ヒアドキュメントをインデントする」てのがある。
オレのもってるのは一つ前の版だが最新版でもどっかにあるだろう。
要約すると、「インデントつけといて自分で削れ」ってことみたいだな。
単に行頭の空白を全部削るやつとか、行頭の共通文字列を削る奴とか
いくつかの例がある。
0785nobodyさん
05/03/01 19:35:54ID:???つまりこういうことやね!
if(1){
print do{(local$_=<<" EOM")=~s/^ //mg;$_};
そのとき
妹は
EOM
}
0786743
05/03/01 19:47:30ID:???SJIS使ってて全角文字だったら文字の相性によってエラーが起きるの。
カッコつかうなら ( ) と < > 以外はこの問題が発生する可能性がある。
< > はタグで使うことが多くて見にくくなるから、普段は ( ) を使うんだけど、
その中にカッコを使いたいなら \) とかやらないで、 print qq!)! ってやってる、って意味。
! もこんな問題はおきません。
0787nobodyさん
05/03/01 20:11:50ID:???if(1){
print fix(<<" EOM");
そのとき
妹は
EOM
}
sub fix
{
(my $str = shift) =~ s/^\s+//gm;
return $str;
}
Perlクックブック1.11
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#Why_don_t_my_E_lt_E_lt_HERE_docu
二行程度なら、私はこうするかな。
if(1){
print "そのとき\n",
"妹は\n";
}
0788nobodyさん
05/03/01 20:29:30ID:3fkZkmcbif(1){
print &fix;
}
sub fix {
return <<"EOF";
そのとき
妹は
EOM
}
0789nobodyさん
05/03/01 20:35:33ID:p/vg3iSUその時
私は
);
print join("\n", @messages);
空白があるとダメだけど。
0790nobodyさん
05/03/01 21:37:00ID:???#思いきってこんなんどう?
(my$script=<<'EOM')=~s/(?:^|\?>\n?)(.*?)(?:<\?|$)/;print'$1';/sg;eval$script;
そのとき
妹は
EOM
#こんなこともできるよ!
(my$script=<<'EOM')=~s/(?:^|\?>\n?)(.*?)(?:<\?|$)/;print'$1';/sg;eval$script;
<?
for(1..10){
?>
[<? print $_ ?>]<br>
<?
}
?>
EOM
#PHPとかJSPとかASPが嫌いだったら推めないけど
0791nobodyさん
05/03/02 11:01:25ID:???美しくもないしかなりの力技で処理的にも問題ありだと思うけど、
とにかくインデントしてソースの見た目をどうにかしたいってなら
if (1) {
$string = <<" EOF";
その時
妹は
EOF
$string =~ s/\t//g;
print $string;
}
↑インデントはTABでやってる場合ね
書き込みにTAB使えないから上のはスペースでインデントしてるけど
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:???ん?
■ このスレッドは過去ログ倉庫に格納されています