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

Perlコーディング初心者質問スレ Part 59

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/02/16(月) 11:42:29ID:gvPTpodw
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

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

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1218030872/
0201nobodyさん2009/03/05(木) 01:01:50ID:PCYMuwfz
>>199>>200
出来ました。
ありがとうございました。
0202nobodyさん2009/03/05(木) 02:37:44ID:???
2chでもそうですけど書き込み確認画面ってありますよね?
あれってどうやっているんですか?2つcgiを用意するのか
もしくは1つでやっているんでしょうか?
0203nobodyさん2009/03/05(木) 02:41:58ID:???
1つでも2つでもどうとでもできる
0204nobodyさん2009/03/05(木) 06:51:21ID:???
簡易掲示板チャットをやっているんですがユーザーへの禁止語句にエラーが出てしまうのです。
原因を調べてみた結果「ー」がその原因だったことが判明しました。
ソースはこんな感じなんですがどうすればエラーが出ないようになるでしょうか?

if( $NG =~ m/$subject/) {
print '禁止ワードです';
}

文字コードはShift-JISでj-code.plなどは使用していません。よろしくお願いします。
0205nobodyさん2009/03/05(木) 08:28:19ID:???
/\Q$subject/でいけるっしょ
0206nobodyさん2009/03/05(木) 08:36:47ID:???
>>205
そんなやり方があるんですね。ありがとうございます。
軽くググってましたが \Q***\E を使うといいらしいですが\Eで閉じる必要はないのでしょうか?
0207nobodyさん2009/03/05(木) 08:39:30ID:???
閉じてもいいよ
クウォートメタの効果を途中で止めたいなら\Eで閉じなきゃいけないけどこの場合はないから閉じなくてもいい
0208nobodyさん2009/03/05(木) 08:41:08ID:???
>>207
なるほど〜。
>>204の例だと if{ } の間だけ効果を発揮するということでしょうか?
0209nobodyさん2009/03/05(木) 08:58:56ID:???
いやいや
/\Q$subject[a-z]\d/みたいにクウォートメタしたいものの後に正規表現使う場合には
/\Q$subject\E[a-z]\d/こう書かいて閉じておかないと、パターンマッチではなく
$subjectの内容直後に"[a-z]\d"という文字があるときしかマッチしなくなるということ
02101792009/03/05(木) 16:49:09ID:9GnY8N9B
外注に出したら100万と見積もられましたが100万はきついのでやはり自分で勉強したいのですが
IFの使い方に特化した本ありませんか?
0211nobodyさん2009/03/05(木) 16:56:24ID:???
そんな本あるかよ
0212nobodyさん2009/03/05(木) 16:57:13ID:???
>>210
君はプログラムに手出ししない方がいいと思う。
0213nobodyさん2009/03/05(木) 16:59:45ID:???
http://books.livedoor.com/item/659088
どうぞ
0214nobodyさん2009/03/05(木) 17:05:25ID:???
ていうか近視眼的な解決策しか求めないからいけないんだよね。
0215nobodyさん2009/03/05(木) 17:06:52ID:???
どうせならこのぐらいのボケかたがいい
http://www.amazon.co.jp/gp/product/images/B001QWUZ9W/ref=dp_image_0?ie=UTF8&n=465392&s=books
0216nobodyさん2009/03/05(木) 17:08:19ID:???
>>210
キミは
英語を勉強しようとして、「if」 しか解説してない本を探せると思うか?
日本語を勉強しようとして 「あ行」 しか解説してない本を探せると思うか?
0217nobodyさん2009/03/05(木) 17:09:07ID:???
http://ec2.images-amazon.com/images/I/61%2B5RCVUK-L._SS500_.jpg
こういったリンクの方がうれしい
0218nobodyさん2009/03/05(木) 17:26:32ID:???
これってレディスコミック?中身が見たいw
0219nobodyさん2009/03/05(木) 17:50:16ID:???
IFに特化した本ワロタwwwwww
0220nobodyさん2009/03/05(木) 17:58:01ID:???
必要な情報はもう全部ここで答えられてるから
それ見て勉強するか100万払うこったな

面倒くさいからもう来んな
0221nobodyさん2009/03/05(木) 19:52:11ID:???
週間 ifの全て

創刊号は演算子優先順位一覧表がついて、590円!
0222nobodyさん2009/03/05(木) 19:52:52ID:???
さすがにネタだろ
ネタじゃないなら、もうソースも恥部もさらけ出せよ
0223nobodyさん2009/03/05(木) 20:40:48ID:???
多分、リアルで高校生とか中学生とかなんだろう。Perlってホントに初心者向けの本ってないからなあ。PHPと違って。
0224nobodyさん2009/03/05(木) 20:43:15ID:???
古い内容でよければ、ネットにいくらでも解説あるよな
0225nobodyさん2009/03/05(木) 20:53:49ID:???
ifって古いとかどうこうじゃないけどな
0226nobodyさん2009/03/05(木) 21:32:14ID:???
>>221
たけーよw
0227nobodyさん2009/03/06(金) 00:19:12ID:???
>>179
if文を100個も並べるようなコードは、おそらくif文などほとんど使わずに書けると思うよ。
コード以前に、仕様定義を日本語で整理することに頭と時間使った方が結局近道。
どういう処理をさせたいか日本語で表せない(他人に伝えられない)のにコーディングできるはずがない。

例えば
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua > 10 and $tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
のコードは、$tensuua == 10 のとき、意図しない結果となると思う。
条件式は、混乱するんだったら、表を書いてでも整理すべし。
0228nobodyさん2009/03/06(金) 00:29:04ID:???
100万ww俺今から外注始めるwwwww
0229nobodyさん2009/03/06(金) 01:14:19ID:???
俺なら70万でやってやるよw
0230nobodyさん2009/03/06(金) 01:57:58ID:???
5万
NCNRでお願いします。
0231nobodyさん2009/03/06(金) 05:12:13ID:???
ちょうど俺液晶買い換えたいと思ってたんだよね
3万でいいよ
0232nobodyさん2009/03/06(金) 13:15:46ID:???
今月給料が少なかったから手付50万円で月々の保守10万円で年間契約で受け持つよ
制作は規模にもよるけど3ヶ月以内を約束で。
0233nobodyさん2009/03/06(金) 14:24:55ID:???
IFって何かと思った。
なんかのフレームワークかな?とか。

……俺だけ?
0234nobodyさん2009/03/06(金) 14:28:56ID:???
>>233
君を入れて3人だけだね。
0235nobodyさん2009/03/06(金) 18:09:13ID:???
俺はインターフェイスの設計かとオモタ
0236nobodyさん2009/03/06(金) 22:21:27ID:???
【月刊ifの全て】
創刊号 ifブロック特集
第2号 elseブロック特集
第3号 elsifブロック特集
第4号 unlessブロック特集
第5号 whileブロック特集
第6号 untileブロック特集
第7号 forブロック特集
第8号 if修飾詞特集
第9号 unless修飾詞特集
第10号 while修飾詞特集
第11号 until修飾詞特集
第12号 for修飾詞特集
第13号 if演算子(?:)特集
第14号 範囲演算子(..)特集
第15号 範囲演算子(...)特集
第16号 論理積演算子(&&)特集
第17号 論理和演算子(||)特集
第18号 論理積演算子(and)特集
第19号 論理和演算子(or)特集
第20号 排他的論理和演算子(xor)特集
第21号 grep関数特集
第22号 evalブロック特集
第23号 Switchモジュール特集
最終号 はじめてのPerlプログラミング
0237nobodyさん2009/03/06(金) 23:18:44ID:???
創刊号は
if の歴史
からいこうぜ
0238nobodyさん2009/03/06(金) 23:27:43ID:???
付録は何ですか><
0239nobodyさん2009/03/06(金) 23:36:05ID:???
2号からはおいくらですか?
0240nobodyさん2009/03/07(土) 00:03:23ID:???
つか2年後に初めて入り口とかw
まともにやってたら中級の入り口に立ってるはずなのにw
0241nobodyさん2009/03/07(土) 02:52:57ID:???
付録「ifとiff」

0242nobodyさん2009/03/07(土) 02:58:51ID:???
>240
むしろツッコミどころは第23号じゃね?
0243nobodyさん2009/03/07(土) 14:31:06ID:???
お前らの大好きな perl-users.jp で書けばいいじゃん。
0244nobodyさん2009/03/07(土) 14:53:41ID:???
>>243
なにそれ?
0245nobodyさん2009/03/07(土) 15:05:38ID:???
ぐぐれ
0246nobodyさん2009/03/07(土) 18:31:27ID:???
Switchモジュール特集は今すぐ始めてくれて構わないんだぞ?
0247nobodyさん2009/03/07(土) 22:21:11ID:???
>>243
あそこは頑張ってて好きだぜ。perl学ぶならここ見ろ、ってのが出来るのはいいことじゃね
0248nobodyさん2009/03/08(日) 01:43:51ID:???
import関数は何をするものですか?
0249nobodyさん2009/03/08(日) 11:38:53ID:???
Switchはクックブックに少し載ってるよね
0250nobodyさん2009/03/08(日) 13:14:22ID:???
>>247
ああいうのは、5年後10年後に負の遺産になるのが常だからなあ。
0251nobodyさん2009/03/08(日) 21:55:46ID:???
口で言うだけより行動する方がかっこいいし
あの辺のクラスタは10年経ってもずっとやってそう
0252nobodyさん2009/03/08(日) 22:16:42ID:???
5.10のgiven,when,defaultって手もあるな
0253nobodyさん2009/03/09(月) 00:06:15ID:???
>>251
何というか、君は腰巾着だな。ひとり立ちせえよ。
0254nobodyさん2009/03/09(月) 00:38:08ID:???
>>253
煽りたいんですね、わかります
0255nobodyさん2009/03/09(月) 01:19:00ID:???

$hogeがaとb以外のときに実行するには

if ($hoge ne 'a' or $hoge ne 'b' ){
 print "oik";
}

で合ってますか?
0256nobodyさん2009/03/09(月) 01:26:29ID:???
>255
その場合だと、「a以外」または「b以外」のときに真となるので、常に成立することになる。
「aまたはb」という条件式を作り、それをさらに否定するといい。
0257nobodyさん2009/03/09(月) 01:27:09ID:???
andにするだけでいいだろ
0258nobodyさん2009/03/09(月) 01:28:42ID:???
これ、新しいAAみたい → oik
orじゃなくて、andじゃないとマズくね?
0259nobodyさん2009/03/09(月) 01:30:03ID:???
被ってるし。床に横になってギター弾いてるみたいんだよなー → oik
0260nobodyさん2009/03/09(月) 01:40:09ID:???
olkはokの誤植です。。。

$hoge = 'c';

if ($hoge ne 'a' and $hoge ne 'b' ){
 print "ok";
}

なら ok で、このとき $hoge = 'b' ならなにもしないんですよね?
0261nobodyさん2009/03/09(月) 01:46:15ID:???
>260
おっけー。

あと、既に知ってるかもしれないが
「ド・モルガンの法則」でぐぐってみると勉強になるかも
0262nobodyさん2009/03/09(月) 03:04:23ID:???
>>261
or と and でよく悩むんです。
ありがとうございました。
0263nobodyさん2009/03/09(月) 03:26:47ID:???
>>260
詳しくは、月刊ifの全て、第18号をお読みください
0264nobodyさん2009/03/09(月) 04:12:13ID:???
気付いたら *.cgiが 丸見えだ。(五七五
0265nobodyさん2009/03/09(月) 04:36:41ID:???
>>263
月刊ifの全て第18号には、こんな用例がのっているはずw

$hoge = 'c';

$hoge ne 'a' and $hoge ne 'b' and print "ok";
0266nobodyさん2009/03/09(月) 19:03:15ID:???
第24号より難しいことしてるよな、きっとw
0267nobodyさん2009/03/09(月) 23:14:05ID:???
サーバー上で一つのファイルを読んだり書いたり追記したりするCGIを作成して、
初めてflockを使ってみたのですが、実際にflockを間違えずに入れれてるかどうか
確認するにはどうすればいいでしょうか。
0268nobodyさん2009/03/10(火) 00:01:48ID:???
ab 使ってアタックしてみればいい

たとえば純粋にカウントアップするスクリプト書いて、
ab で 30 のクライアントで 10000 回もぶん回せば結果は出るかと思うよ
0269nobodyさん2009/03/10(火) 11:58:59ID:???
無料日がおしよせてくる、泣いてる場合じゃない
ワクワクを百倍にしてヤフオクの主役になろう♪
0270nobodyさん2009/03/10(火) 11:59:31ID:???
↑スレチ、まちごうたorz
0271nobodyさん2009/03/11(水) 22:07:23ID:???
>268
abってモジュールがあるのでしょうか?
ググッて見たけど、ソートの$a<=>$bとかばっかりひっかかってわかりませんでした。
0272 ◆TWARamEjuA 2009/03/11(水) 22:29:30ID:????BRZ(10001)
>>271
検索語にapacheも追加すると幸せになるかもしれません。
0273nobodyさん2009/03/11(水) 23:11:50ID:???
>>272
なるほど、apacheの方でしたか。
見つかりました。ありがとうございます。
0274nobodyさん2009/03/12(木) 16:37:21ID:???
月刊ifの全ての第14号と第15号を見て思ったんだけど
範囲演算子の「..」と「...」をスカラーコンテキストとして評価して
状態遷移処理をするプログラムを活用している人はいるのだろうか?
0275nobodyさん2009/03/12(木) 17:06:33ID:???
個人的には嫌と言うほど使ってるが? @data解析系
0276nobodyさん2009/03/12(木) 19:29:47ID:???
>>275
なるほど
試しに使ってみたけど論理が混乱して変数でフラグ持たせるやりかたで未だにやっているけど
実際に嫌と言うほど使っている人がいるってことは、俺がバカだったというだけみたいだな出直してきます
0277nobodyさん2009/03/14(土) 16:39:37ID:???
tokuhirom は、適度に漢字を混ぜた文章書いてくれないかな。
0278nobodyさん2009/03/14(土) 20:53:02ID:???
Mooseみたいに、useしただけでstrictとwarningsがuseされるモジュールを作りたいんですが、どうしたらいいですか?
ソースを参考に、こんなの書いたけど駄目でした。

package Hoge;
use strict;
use warnings;

sub import {
 strict->import;
 warnings->import;
}

package main;
use Hoge;

$hoge=1; # ここでエラーになって欲しい
0279nobodyさん2009/03/14(土) 21:37:49ID:???
>>278
やってみたけど普通にそれで引っかかるぞ?
0280nobodyさん2009/03/14(土) 22:00:06ID:???
>>279
あれ本当だ…
何かを間違っていたようです、失礼しますた
0281nobodyさん2009/03/16(月) 00:10:49ID:???
Windows + ActivePerl 5.8.8 + Mysql5.0で
フレームワークにTripletailを使いたいのですが、
どうやっても
DBI connect('test:localhost','user',...) failed: Can't create TCP/IP socket (10106) at C:/Perl/site/lib/Tripletail/DB.pm line 1102と
エラーが出てしまって…
コードはiniのDB設定以外Tripletailのチュートリアルにあるものそのままだし
DBのユーザー名やパス等も間違いないと思うのですが。

誰かTripletail使ってる人いませんか?
0282nobodyさん2009/03/16(月) 13:27:07ID:???
>>281
デバッグしろよ!!
0283nobodyさん2009/03/23(月) 00:31:29ID:???
tokuhirom は能力ないのかね。
多くの場面で使われているということだけでは、何も評価したことにならんよ。

「あれがいいってみんなが言ってるよ。」
0284nobodyさん2009/03/23(月) 01:06:40ID:???
>>283
直接言えよ

Module::CoreListに載っていればいいのか、
Plaggerとかの有名どころで使われているモジュールがいいのか、
CPANに上がってりゃそれでいいのか、
場末のコードスニペットがいいのか、
判断どころは色々だろ
0285Nobodyさん2009/03/24(火) 02:30:18ID:???
yellowlemon 234
redapple 432235
redstrawberry 2934

こんな感じで文字列と数字で構成された行を数字の高い順(降順)
でソートして↓のようにするにはどのようにすればいいでしょうか?

redapple 432235
redstrawberry 2934
yellowlemon 234
0286nobodyさん2009/03/24(火) 04:35:51ID:???
>>285
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_do_i_sort_an_array_by__anything_

my @sorted = map "$_->[0]\n",
  sort { $b->[1] <=> $a->[1] }
  map [ $_, / ([0-9]+)/ ],
  ('yellowlemon 234', 'redapple 432235', 'redstrawberry 2934')
;
0287nobodyさん2009/03/24(火) 06:28:56ID:???
別バージョン

my @targets = ('yellowlemon 234', 'redapple 432235', 'redstrawberry 2934');
y @sorted_targets = sort {
(split ' ', $b)[1] <=> (split ' ', $a)[1];
} @targets;
0288nobodyさん2009/03/24(火) 16:58:27ID:???
>>287
> ソートするものの一部を取り出す必要があるような複雑な関数を使うのなら、
> ソート関数の内側でそれを使ってはいけません。最初にその関数で使う部分を
> 取り出します。なぜなら、sort のBLOCKは同じ要素に対して何度も何度も
> 呼び出される可能性があるからです。

sort() が比較要素をキャッシュしてくれるようにでもなっているのなら、
{ (split ' ', $b)[1] <=> (split ' ', $a)[1] } でいいけどね。
02892872009/03/24(火) 20:07:04ID:???
>>288
アドバイス、サンクス。
確かに考えてみたら、比較の度にsplitが実行されて287の方が遅そうな感じだな。
でも、気になってベンチ(ランダムに作った100要素の@targetsを各functionでソート。これを1000000回実行して結果取得)をとってみたら意外な結果だった。
287で書いたコードの方が455倍速いという結果に。。。
これってsplitの処理がたまたま、map=>sort=>mapのデータ渡しや正規表現処理より速いってこと???

Rate without_split_in_block with_split_in_block
without_split_in_block 3982/s -- -100% (286で書かれたcode)
with_split_in_block 1818182/s 45558% -- (287で書かれたcode)
0290nobodyさん2009/03/24(火) 22:20:58ID:iEyVm5it
ネットで拾ってきたperlスクリプトを使いたいんだが、
このまま実行してもできない。。
誰か教えてくれんか?perlの知識がまったくないのでわからんのです。
ちなみに環境はXPです。


while(<>){
s/<(\/)?([\w]+)/<$1\L$2/g; #要素タイプ名を小文字に
s/ (\w+)="/ \L$1="/g; #属性名を小文字に
#空要素タグを /> で閉じる
s/<(br|hr|img|link|input|col|base|meta|area|param)(.*?)>/<$1$2 \/>/g;
s/<a name="(.*?)"/<a name="$1" id="$1"/g; #id属性を加える
print;
}
0291nobodyさん2009/03/25(水) 04:28:21ID:???
>>290
ようはフィルタでしょ?
スクリプトをfoo.plとか適当な名前で保存して、
フィルタに掛けたいファイルを用意して(例えばbar.txt)
perl foo.pl bar.txt
すりゃいいだけかと
ファイルに吐かせたいなら
perl foo.pl bar.txt > out.txt
0292nobodyさん2009/03/25(水) 04:53:50ID:???
初心者です。環境はXP
CPANでモジュールをインストールしようとすると、
Alert: While trying to 'parse' YAML file
'C:\usr\cpan\FTPstats.yml'
with 'YAML::XS' the following error was encountered:
ってばかり吐かれて死にそう。
ググったらFTPstats.ymlを削除すればとあってやってみたけど効果なし。
何か策があれば教えてください。
0293nobodyさん2009/03/25(水) 08:15:32ID:???
>>289
ベンチコードが分からんと追試しようが無い。
http://boobar.hp.infoseek.co.jp/bench/sort.txt
02942872009/03/25(水) 10:10:31ID:???
>>293
わざわざサンクス。
293のコードで俺の環境でやってみた結果。V
GRT: 6 wallclock secs ( 5.00 usr + 0.00 sys = 5.00 CPU) @ 2713378.60/s (n=13566893)
ST: 6 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 2560283.68/s (n=13492695)
split: 4 wallclock secs ( 5.08 usr + 0.00 sys = 5.08 CPU) @ 2935626.97/s (n=14912985)

テスト環境:(perl) v5.10.0 (OS) Ubuntu desktop 8.10 32bit (CPU) Core2Quad Q9650 (メモリ) DDR2-6400 2GBx2

で次のレスが、289で使用したコードV
02952872009/03/25(水) 10:12:20ID:???
use strict;
use Benchmark qw(cmpthese);
use String::Random;

my @targets;
for (0 .. 100) {
push @targets, get_a_line();
}

cmpthese(1_000_000, { with_split_in_block => sub { with_split(@targets) },
without_split_in_block => sub { without_split(@targets) }, });

sub with_split { return sort { (split ' ', $b)[1] <=> (split ' ', $a)[1]; } @_; }

sub without_split {
return map "$_->[0]",
sort { $b->[1] <=> $a->[1] }
map [ $_, / ([0-9]+)/ ], @_;
}

sub get_a_line {
my $string_random = new String::Random();
$string_random->{'A'} = ['a'..'z'];
my $label = $string_random->randpattern('AAAAAAA');
$string_random->{'N'} = [0..9];
my $score = $string_random->randpattern('NNNNNNN');
return $label . q{ } . $score;
}
02962872009/03/25(水) 10:26:31ID:???
ごめん294の結果は間違ってた。引数渡すのわすれてた。
ARGV[0] = 1000
Benchmark: running GRT, ST, split for at least 5 CPU seconds...
GRT: 5 wallclock secs ( 5.32 usr + 0.00 sys = 5.32 CPU) @ 339.85/s (n=1808)
ST: 6 wallclock secs ( 5.29 usr + 0.00 sys = 5.29 CPU) @ 269.19/s (n=1424)
split: 5 wallclock secs ( 5.14 usr + 0.00 sys = 5.14 CPU) @ 90.86/s (n=467)
02972872009/03/25(水) 11:00:33ID:???
度々すんません。なんか、俺のbenchコードが間違ってるっぽいな。要素数かなり大きくしてためしてみたら体感的にもspli使わない方が速いわ。
0298nobodyさん2009/03/25(水) 22:28:41ID:V8wgPxlA
>>291
ありがとう!おかげで助かった。
0299nobodyさん2009/03/25(水) 22:41:59ID:???
perl勉強しようかと思うんだけど何から手を付けてよいものか…
0300nobodyさん2009/03/25(水) 23:19:39ID:???
>>299
>>2
0301nobodyさん2009/03/25(水) 23:22:54ID:???
>>300
何から手を付けてよいものか…
■ このスレッドは過去ログ倉庫に格納されています