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

Perl 初心者コーナー Part24

レス数が1000を超えています。これ以上書き込みはできません。
0001 ◆fBgbHI04bQ 03/06/07 22:30ID:GbQKLcPE
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0932nobodyさん03/06/27 09:45ID:???
すみません。
超初心者な質問です。

if だと何かが真なら…って分岐になりますが、
「これら全てが真なら」とか「全てが偽なら」って記述をスマートに書くにはどのように書くのが一般的なのでしょうか?

頭悪いので
if(){
if(){
if(){
}
}
}
こんな記述使ってます。
見にくいです。
0933nobodyさん03/06/27 09:47ID:???
>>932
andじゃ駄目なの?

if($a == 1 and $b == 2 and $c == 3){
全てが真の時の処理;
}else{
一個でも違ったら;
}
093493203/06/27 11:05ID:???
ありがとうございます。
頭が悪いのか、andとか、全然使いこなせないんです。汗
0935nobodyさん03/06/27 11:20ID:???
>>932=934
これ、見た目だけの問題じゃなくて、動作速度とかにも影響するから
ちゃんと覚えておいた方がええよ。
093637403/06/27 11:22ID:???
ふーん。そういうことを話し合ってるスレかここは
0937nobodyさん03/06/27 11:36ID:???
そうですが、何か?
0938nobodyさん03/06/27 12:32ID:???
>>934
お前、高校くらい出てから来い。数学Aの履修範囲だ。
0939nobodyさん03/06/27 12:51ID:???
>>935
まじで!?
0940nobodyさん03/06/27 12:57ID:???
>>939
if文をまとめたぐらいでは体感的な速度差はない。
ただ、日頃から>>932のようなコーディングをする人は、自分でも理解できなくなるような
スパゲッティコードを書いたり、非常にパフォーマンスの悪いアルゴリズムを使ったりと
間違った方向に進みがち。
まあ何にせよ、基本はきっちりと押さえとけってこと。
0941nobodyさん03/06/27 13:01ID:???
push @houselist, \%HOUSE;
したあと、
$houselist[あれこれ]->{id}
が重複するものを、
@houselist から取り除く(※)にはどうすればいいのでしょう?
※取り除くというか、1つだけ残したいです。
0942nobodyさん03/06/27 13:21ID:???
>>941
こんな感じかのう

@check = ();
@houselist = grep { !$check{$_->{id}}++ } @houselist;
0943nobodyさん03/06/27 13:22ID:???
Perlらしいコードだなぁ
0944nobodyさん03/06/27 13:35ID:???
>>939
>>934が言っているように、ほとんど体感は無いけどね。
ただ、漏れは仕事の都合上、xGB単位のファイルの処理とかするんだけど、
そうなってくると、細かいところでかなり違ってくる。
といっても、1時間が55分に短縮されるとか程度だけど。
どっちかってーと、>>934の言うとおり、わかりやすく書く、ってことが
重要かと。
0945nobodyさん03/06/27 13:36ID:???
s/>>934/>>940/;
0946nobodyさん03/06/27 13:40ID:???
xGB単位, xGB単位, xGB単位
           ∧∧
         ヽ(=゚ω゚)ノ″
         〜( ×)
(=゚ω゚)ノぃょぅ    U U

0947nobodyさん03/06/27 13:42ID:gWCPnMBP
変数で正規表現を使えるのでしょうか???
sub func{
$str = $_[0];
foreach(@list){
if(/$str/){
$result = $_;
}
}
return $result;
}
みたいに検索条件を変数にしたい時はどうすれば良いのでしょうか?
094894203/06/27 13:42ID:???
@check = (); じゃなくて、%check = (); だった。スマソ
0949nobodyさん03/06/27 13:44ID:???
>947
正規表現じゃなくてindex使え。
0950nobodyさん03/06/27 13:47ID:???
>>947
それでいいのでは
095137403/06/27 14:01ID:???
もまいらひまだな

print s//uc join('',unpack('A1 x4 A1 x7 A1 x4 A1', <<EOT))/e && $_,"\n";
Just another Perl Hacker
EOT
0952nobodyさん03/06/27 14:03ID:???
ひまですが、何か?
0953nobodyさん03/06/27 14:24ID:gWCPnMBP
レスTHX
>>950
全部にマッチしてしまうので、必ず最後の要素番号返してくれます。
>>949
調べてみます。
095494703/06/27 14:25ID:???
>>953>>947です
0955nobodyさん03/06/27 14:32ID:???
>>953
変数を正規表現に使うときは、メタ文字が入っているとうまくいかないから、
quoteする。
metaquote($str)または\Q$str\E
全部にマッチしちゃうってのは、/^$str$/してないから、一部にひっかかって
るんじゃないかな。

095694103/06/27 14:38ID:???
>>942
やばい、何をやっているかわからない。。。
けど理解してがんがってみます。
ありがとうございます。
095794703/06/27 14:39ID:???
>>949,>>950,>>955
>>955の書き込みを見る前にindexでとりあえずの解決しました。
for($i = 0;$i < @list;$i++){
$idx = index($list[i],$str);
if($idx ne -1){
$result = $i;
}
}
としました
ありがとうございました。
>>955さんのが原因かと思われるのでそちらも勉強してみます。
感謝です
095895003/06/27 14:55ID:???
「変数に正規表現を」って言うから、引数にメタ文字を入れてるんだと思った……
要は正規表現を使って(変数に入った)文字列を検索したかったのね。
095994703/06/27 15:02ID:???
>>958
ごめん、よくわかんない(TT
0960nobodyさん03/06/27 15:07ID:???
CSVからデータを読み込んで、ちょっとした条件でしぼりこんで一覧表示するだけなのに、
一覧のうち1部だけが文字化けするって、
何が考えられますか?


なお、スクリプトは、EUC(スクリプト中の処理も全てEUCで処理してます)、
CSVはSJIS、HTML吐き出しもSJISです。

文字化けしてしまってるところは、EUCになっちゃってます。
0961nobodyさん03/06/27 15:14ID:???
>>960
文字コード変換を自動判別に頼ってるため、Shift_JIS文字列をEUC
と見間違えるんだと思う。

CSVの1レコードとかテーブル全体を一括で文字コード変換するか、
明示的に変換元と変換先の文字コードを文字コード変換ルーチンに指示
するかすれば問題は起こりにくくなる。

あと、いわゆる半角カナが多いShift_JIS文字列もEUCと誤認識
しやすい(場合によっては区別が付かない)。
0962nobodyさん03/06/27 15:15ID:???
条件ってのが、EUCで比較しててそのまま出力に流してしまってるからでは?
0963nobodyさん03/06/27 15:21ID:???
>>960
スクリプトとデータの文字コード統一しる。
その方が変換しないで済むから早いだろうに。
0964nobodyさん03/06/27 15:54ID:???
>>956
この方法の解説は確かperlメモに書いてあった。
だがしかしperlメモ説明がくどいから逆に分かり難いかも。
でも便利だから一度は見ておけば?
0965nobodyさん03/06/27 17:01ID:???
bccに2人を入れたいとき、
メールソフトと同じように、

$bcc = 'amano@alive.ne.jp, mine@alive.ne.jp';
if (!open(OUT,"| $sendmail -t")) { &error('申し訳ありませんが何らかの原因で処理できません.'); }
#中略
print OUT "Bcc: $bcc\n";
#後略
で問題ないですよね?

実験だと問題なさそうなんですが、
環境に依存するとなんなんで、一応質問・・・
0966nobodyさん03/06/27 20:05ID:???
$sendmail に sendmail のパスが入ってるんだろうけど、
その sendmail が Sendmail とは限らない。

とか言ってみるテスト。
ようはそのプログラム次第ってこと。
Socket使うとかしてみたら?
その手のモジュールも転がってるし。
096796503/06/27 20:21ID:???
>>966
いや、sendmailのパス入ってます。
sendmailだったら、他の環境によらず大丈夫ってことですか?

Socketの勉強は、まだ少しペンディングにしてるので。。。
0968nobodyさん03/06/27 20:24ID:???
>>967
適当なライブラリ探してきたら、Socket知らないでもできそうですよ。
やったことないですが。
0969nobodyさん03/06/27 20:53ID:???
(´-`).。oO(この世にはsocketしか知らない香具師もいるのよねぇ、、、@この板を荒している香具師とか)
0970nobodyさん03/06/27 21:05ID:???
(´-`).。oO(本7か…)
0971nobodyさん03/06/27 21:26ID:???
sendmail の sendmail と qmail の sendmail で利用可能なオプションとか違うよ。
それ以外のは知らないけど。
つか、スレ違いぎみな気が。
0972ふつー03/06/27 22:05ID:???
use Net::DNS;
use Net::SMTP;
0973nobodyさん03/06/27 22:34ID:???
すんごい素朴な疑問なんですが、
なぜみんなヒアドキュメントを使うんでしょう?

   print << "END_OF_HTML";
      ほげ
      ふが
      ひげ
END_OF_HTML
っていう風に、最後を、インデントつけれないから、すごくコードがみづらくなって、
個人的にはいやなんですけど。
(なんかのオライリー本にもそんなことかいてあったきがする)

やっぱり、END_OF_HTMLみたいに意味をかけるからいいんでしょうか?

ちなみに自分は、ほとんど
       print qq|
             ふが
             ほげ
            |;
ってやってます。
097496503/06/27 22:36ID:???
やばい、qmailとsendmailてまったく別物だと思ってました。
(だから、>>971 でqmail の sendmail ってなんだ?と思った)
スレ違いぎみなので、逝って勉強してきます。
0975nobodyさん03/06/27 22:39ID:???
>>973
料理本でも立ち読みしてくれ
0976nobodyさん03/06/27 22:58ID:???
>>973
   print << "  END_OF_HTML";
      ほげ
      ふが
      ひげ
   END_OF_HTML
097797303/06/27 23:25ID:???
>>975
料理本ってなんかの隠語?
097897303/06/27 23:26ID:???
>>976
そ、それも、気持ち悪くないですか?個人差かな?
0979nobodyさん03/06/27 23:33ID:???
まあ、あまり深いインデントにならないコードを書いて気休めにするしかないな
0980nobodyさん03/06/27 23:36ID:???
まぁ、個人の好き嫌いじゃないの?
'
hoge
';
<< 'HOGE';
hoge
HOGE
ちなみに私は前者が多いかな。
インデントがと言うか、楽だから。
0981nobodyさん03/06/27 23:41ID:???
>977
クックブック
0982nobodyさん03/06/27 23:42ID:???
>>977
オライリーのPerl本を色々物色してれば分かる。
098398203/06/27 23:43ID:???
かぶった
0984nobodyさん03/06/27 23:53ID:???
次スレまだー?
0985nobodyさん03/06/28 00:01ID:???
Perl 初心者コーディングコーナー Part25

なんてどお?
0986nobodyさん03/06/28 00:26ID:???
いいね。たてとけ。
0987nobodyさん03/06/28 00:34ID:???
ミンキーモモに出てくる
0988nobodyさん03/06/28 00:37ID:???
普通なら
Perlコーディング 初心者コーナー Part25
じゃないのか?
0989nobodyさん03/06/28 00:51ID:???
CGI以外 Perl初心者コーナー Part25
0990nobodyさん03/06/28 01:03ID:???
せめてCGIを除外する旨のことはテンプレに書いてほしい。
0991nobodyさん03/06/28 01:08ID:???
別にcgiであっても構わないけど、perlに関係ない話はスレ違い
0992nobodyさん03/06/28 01:11ID:???
CGI以外ならむしろム板だろ。
0993nobodyさん03/06/28 01:13ID:???
>>992 ここは何の為の板なのかと小一時間。
0994nobodyさん03/06/28 01:14ID:???
WebProg 板なのになんでCGIダメなんだ
0995nobodyさん03/06/28 01:15ID:???
s/WebProg板/過疎板/;
0996nobodyさん03/06/28 01:19ID:???
Perl コーディング初心者質問コーナー Part25
http://pc2.2ch.net/test/read.cgi/php/1056730690/

立てたよ
0997nobodyさん03/06/28 01:28ID:???
997
0998nobodyさん03/06/28 01:29ID:???
998


0999nobodyさん03/06/28 01:32ID:???
999?
1000nobodyさん03/06/28 01:32ID:???
1000
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。