Perlコーディング初心者質問スレ Part 59
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/02/16(月) 11:42:29ID:gvPTpodw【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1218030872/
0002nobodyさん
2009/02/16(月) 11:42:52ID:gvPTpodw[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: ttp://www.site-cooler.com/kwl/perl/
[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/
[オンラインマニュアル]
最新のドキュメント: ttp://search.cpan.org/~rgarcia/perl-5.10.0/
perl5.8.xのドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: ttp://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: ttp://www.cpan.jp/search.cgi
perldoc きまぐれ訳: ttp://fleur.hio.jp/perldoc/
perldoc.jp: ttp://www.perldoc.jp/
Perldoc.perl.org: ttp://perldoc.perl.org/
0003nobodyさん
2009/02/16(月) 11:44:03ID:gvPTpodw[モジュール]
CPAN: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/
[テクニック]
Perlメモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perlの小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm
[Perl5.8Unicodeメモ]
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004nobodyさん
2009/02/16(月) 20:24:32ID:???嘘つきました、すいません。
0005nobodyさん
2009/02/16(月) 20:27:50ID:???0006nobodyさん
2009/02/17(火) 00:20:41ID:???0007nobodyさん
2009/02/17(火) 03:27:54ID:???Web::Scraperとかどうよ
0008nobodyさん
2009/02/17(火) 04:11:20ID:???0009nobodyさん
2009/02/17(火) 11:38:27ID:???my @list = qw/a b c d e f g/;
my $test1 = @list;
my ($test2) = @list;
print "test1 = $test1\n";
print "test2 = $test2\n";
() が無いと配列の数を受け取り、() があると配列の最初の要素を得てますよね?
それと同じ考えで、正規表現のなかに () があってマッチした場合、配列が返るんで、そういった動作になります。
たぶん。 そうだと思うw
0010nobodyさん
2009/02/17(火) 11:44:43ID:???たとえば、m//のgオプションは、コンテキストで挙動が変わるとか。
0011nobodyさん
2009/02/17(火) 15:15:34ID:???処理中に進捗を表示しようとしてるのですが、普通に何パーセント終わったというのを出すと
1% finished.
2% finished.
・
・
・
100% finished.
と延々と100行も続きます。
DOS にはエスケープシーケンスというのがあり、カーソルの移動とかが出来て同じ場所に違うテキストを上書き表示をすることが出来ます。
しかし perl からエスケープシーケンスを出力しても文字化けで終わってしまいます。
ANSI.SYS を組み込めばエスケープシーケンスは有効ですが、出来る限り古い環境 (ANSI を組み込むという事は COMMAND.COM を使うことになりレガシーな環境になります)
を使わないで済むような方法はありますでしょうか?
0012nobodyさん
2009/02/17(火) 15:40:15ID:???0013nobodyさん
2009/02/17(火) 15:41:52ID:???print "\r";
print '2% finished.';
以下略 ってことね。
0014nobodyさん
2009/02/17(火) 15:45:27ID:???....5....10....15....20....25....30....35...
0015nobodyさん
2009/02/17(火) 15:52:37ID:???http://search.cpan.org/~dconway/Smart-Comments-v1.0.3/lib/Smart/Comments.pm
0016nobodyさん
2009/02/17(火) 15:56:11ID:???キャリッジリターンの存在をすっかり忘れてましたw
希望通りの動作ができました
感謝です
>>14
一旦そのやりかたも考えましたが、一度考えた表示の仕方から逃げるみたいでなんかイヤだったんですよね^^;
ありがとうございました m(_ _)m
0017nobodyさん
2009/02/17(火) 22:06:02ID:???0018nobodyさん
2009/02/17(火) 22:25:23ID:???ttp://www.mars.dti.ne.jp/~torao/program/appendix/esc.html
0019nobodyさん
2009/02/18(水) 16:50:38ID:???if($in/3 = 整数型)
上記のような事を考えていましたがperlでは整数型等の指定が出来ないみたいです。
何か方法がございましたら教えて頂けないでしょうか。よろしくお願いします。
0021nobodyさん
2009/02/18(水) 17:17:10ID:???ありがとうございました。
条件式に余剰が使えるという発想がありませんでした。
もっと色々考えないといけませんね。
0022nobodyさん
2009/02/18(水) 17:28:53ID:???0024nobodyさん
2009/02/18(水) 19:34:19ID:???0025nobodyさん
2009/02/19(木) 02:34:53ID:???考えてもわからんけどな
0026nobodyさん
2009/02/19(木) 02:40:24ID:???# if (!($hoge or $huga))
とか
# if (!($hoge and $huga))
って書いておけばいいんじゃねw
0028nobodyさん
2009/02/19(木) 13:22:08ID:X+sdAMms単純に
@a = @b;
でいいのですか?
0029nobodyさん
2009/02/19(木) 14:35:52ID:X+sdAMms書き込むファイル名を変数で変えたいのですが美味く動きません、下記のどこに問題がありますか?
$data = "data.txt";
open(OUT, "> $data");
print(OUT "$s[0]",",","$s[1]");
close(OUT);
0030nobodyさん
2009/02/19(木) 14:41:29ID:???OK だけど、a とか b だけの変数名はオススメしない
>>29
こういうデータを希望してるのに、こんなデータになってしまう
ぐらいの言葉書けないの?
バカなの?
死ぬの?
0031nobodyさん
2009/02/19(木) 14:45:02ID:???print(OUT "$s[0]",",","$s[1]");
close(OUT);
こうなるのを期待しているのですが
open(OUT, "> ");
print(OUT "$s[0]",",","$s[1]");
close(OUT);
こうなるようです。専門用語はわかりません、すみません。
0032nobodyさん
2009/02/19(木) 15:09:48ID:???ないだろ?
コピペして@sに適当な値を入れてためしに実行したけどちゃんと
data.txtになんか書かれたよ。
とりあえず一般論として:
openにはエラートラップ必須。ちゃんと書くのが
面倒でもせめて or die $! をつける
いまどき2引数openは流行らない。3引数で書こう。
0033nobodyさん
2009/02/19(木) 16:28:12ID:???our宣言が必要な場合は、
my %hoge = our %moge;
って感じで書くとエラーでないけどこういう書き方は問題ない?
our %moge;
my %hoge = %moge;
って書くべき?
003429
2009/02/19(木) 16:28:52ID:???0035nobodyさん
2009/02/19(木) 16:53:49ID:???どちらでも言語的には正しいが、俺は見易さから後者にするね。
わざわざourとか使うぐらいだからそれなりに大きいプログラム
なんだろうし。
0036nobodyさん
2009/02/19(木) 17:36:11ID:???0037nobodyさん
2009/02/19(木) 19:03:07ID:???wavファイルを繰返して再生したいのですが
#! perl
use Win32::Sound;
$file = "sound.wav";
Win32::Sound::Play( $file, SND_ASYNC, SND_LOOP);
と書きましたが、音が出ず終了してしまいました。
意図する動作をさせるための書き方を教えてください。
0038nobodyさん
2009/02/19(木) 20:24:56ID:???0039nobodyさん
2009/02/19(木) 20:45:17ID:???requireでhashだけ書き込んであるスクリプトを読み込んで、
そのhashを使おうとした時にourで宣言しないと駄目だった気がする。
いちいちデータを整形するのが面倒だから、
hashをそのまま読み込めるようにスクリプトとして直接出力して使った俺も俺だがw
サブルーチンの形で出力してrequireすれば戻り値使えてour使わず済むんじゃない?
そこまでいくと色々な意味で違う気がするがw
0043nobodyさん
2009/02/20(金) 09:00:28ID:???昔からPerlの定数は無引数のサブルーチンを使うのが普通ですよ。
constantプラグマも中身はそうなってる。
0045nobodyさん
2009/02/20(金) 15:33:35ID:vekYyWEGそういった事が起こった経験のある方いませんか?
詳しい現象は足し算を5回し50になるはずの計算値が1.02010301020104e+15という数値になります。
プログラムの記述には問題は無いはず。
(エラーの表示はでていない、足し算、引き算以外は用いていない、小数も用いていないのにエラーは少数)。
メモリーエラーとかハード面ではないかと疑っています。
0046nobodyさん
2009/02/20(金) 15:47:47ID:???0047nobodyさん
2009/02/20(金) 16:09:11ID:???0049nobodyさん
2009/02/20(金) 16:24:13ID:vekYyWEG一部分を抽出して同じエラーが出たらその部分をさらします。
0050nobodyさん
2009/02/20(金) 16:28:05ID:???0051nobodyさん
2009/02/20(金) 17:01:26ID:vekYyWEGif () {}
if () {}
を
if () {}
elsif () {}
elsif () {}
に変えたら直りました。上記だと2個の条件を同時に満たしたときにバグるようです。
下記だと同時に条件を満たしたとき先に記述された条件のほうを優先するようです。
なぜだかさっぱりわかりません。
0052nobodyさん
2009/02/20(金) 17:03:40ID:???そんなレベルの奴が書いた300行のスクリプト…
0053nobodyさん
2009/02/20(金) 17:18:50ID:???for next などの繰り返し処理や
サブルーチンの使い方などが良くわからないのでやたら長くなりました
ちなみに賞味300行なので空行を入れて印刷すると15ページになりました。
連動する別のファイルのスクリプトをあわせると30ページ以上になりました。
やっぱりサブルーチンは覚えるべきだとおもいました。
0055nobodyさん
2009/02/20(金) 17:34:37ID:???こういう自信って何処から来るんだろう。
0056nobodyさん
2009/02/20(金) 17:45:10ID:???0058nobodyさん
2009/02/20(金) 17:53:27ID:???てめぇは本をまず買えよw
if () {}
elsif () {}
else {}
は
もし 〜 なら {}
そうではなくて、もし 〜 なら {}
そうでなけりゃ {}
ってなって、1つでも TRUE となれば他は評価されません。
if ばかり並べると全てが評価されます。
0059nobodyさん
2009/02/20(金) 18:36:53ID:???を思い出した。
0060nobodyさん
2009/02/20(金) 18:37:19ID:???0061nobodyさん
2009/02/20(金) 18:42:56ID:???「はじめてのperl」 など、サンプルが載ってるもの
ポケットリファレンス
の2冊を同時に買うように進めてる
ネット見りゃ済むって思うだろうけど、それはよほどやる気の有る奴か
なんでもかんでもググりたいようなやつとか、そういう人種にしか出来ないw
やっぱ始めのうちは 「紙で読むこと」 が重要だと思う
0063nobodyさん
2009/02/20(金) 18:51:29ID:???答えを期待しない質問とか、for next とか、本が難しいとか
真剣さがいささかも感じられませんね。
0064nobodyさん
2009/02/20(金) 19:09:45ID:???1つの質問に対する回答が、質問者しか助けないと思ったら間違いだ
0065nobodyさん
2009/02/20(金) 19:41:50ID:???0067nobodyさん
2009/02/20(金) 22:55:29ID:fozUBJJ4数字だけのチェックであれば
if($data =~ /[^0-9]/){#数字以外がふくまれている}else{#数字のみ}
とすればよいのですが、例えば
$data=19,800.05
というようにカンマとピリオドが入っていても良いとする場合簡潔な書き方はありますでしょうか?
現在以下のように書いております。
$data =~ s/\,//g;
$data =~ s/\.//g;
if($data =~ /[^0-9]/){#数字以外がふくまれている}else{#数字のみ}
どなたか宜しくお願い致します。
0068nobodyさん
2009/02/20(金) 22:58:19ID:???0069nobodyさん
2009/02/20(金) 23:04:44ID:???#数字,.のみ
}else{
#それ以外もあるよ
}
じゃダメなのかな?
0070nobodyさん
2009/02/20(金) 23:09:49ID:???0071nobodyさん
2009/02/20(金) 23:18:50ID:???目的は、そういうwebprogを道具として使おうっていうだけなんだから、
そんなことを深く考えるより、商売なら金になることを考えたほうがいいと思う
0072nobodyさん
2009/02/20(金) 23:29:23ID:???0073nobodyさん
2009/02/20(金) 23:29:29ID:???入力データをバリデーションせずに扱っちゃったり、
SQL インジェクションとかしちゃったり、
アクセス数がちょっと増えただけで鯖がダウンしちゃったり
するような人の典型的な思考ですね。
> 商売なら金になることを考えたほうがいいと思う
金のなる木になるどころか、負け犬になりますよw
0076nobodyさん
2009/02/21(土) 00:19:11ID:???0077nobodyさん
2009/02/21(土) 01:47:16ID:???if ($data =~ m/^(?:0|(?:[1-9]\d{0,2}(?:,\d\d\d)*))(?:\.\d+)?$/){
...
} else {
...
}
とりあえず、こんなでも良いんじゃないか。
if ($data =~ m/^\d[\d,]*(?:\.\d+)?$/){
0078nobodyさん
2009/02/21(土) 03:59:22ID:???0079nobodyさん
2009/02/21(土) 04:00:47ID:???商売ならなおのこと気を遣うべきで、
それがわからんなら線抜いて寝ちまえ、ってことだな
0081nobodyさん
2009/02/21(土) 04:40:34ID:???子クラスのインスタンスから親クラスのメソッドはどうしたら呼べますか?
0082nobodyさん
2009/02/21(土) 05:09:33ID:???質問内容が今ひとつ分からない。
package Parent;
sub new {
my ($proto) = @_;
my $class = ref($proto) || $proto;
return bless { greeting => 'hello' }, $class;
}
package Child;
use base qw(Parent);
sub new { $_[0]->SUPER::new }
package main;
use Data::Dumper;
print Dumper(Child->new); # new
print Dumper(Child->new->new); # clone
0083nobodyさん
2009/02/21(土) 05:32:46ID:???メソッドが実装されていなければ、親のクラスを辿って実行するよ。
package Parent;
sub new { bless { greeting => 'hello' }, $_[0] }
sub greeting { return $_[0]->{greeting} }
package Child;
use base qw(Parent);
package main;
print Child->new->greeting, "\n"; # Parentのメソッドが呼ばれる
0084nobodyさん
2009/02/21(土) 08:40:32ID:???具体例を出すべきでしたね、すみません。
package Parent;
sub new { bless {},shift }
sub whoami { print "parent\n" }
package Child;
use base 'Parent';
sub whoami { print "child\n" }
package main;
my $obj = Child->new;
$obj->whoami; # child
$obj->SUPER::whoami; # エラー。"parent\n"を出してほしい
0085nobodyさん
2009/02/21(土) 08:42:04ID:???上記のように、Childクラスでオーバーライドしたメソッドがあるとき、スーパークラスのメソッドを呼びたいのです。
0086nobodyさん
2009/02/21(土) 08:43:10ID:???0087nobodyさん
2009/02/21(土) 10:14:01ID:???プログラムの実行中に同じスカラー変数のリファレンスであるにも関わらず値が変わってしまいます。
同一のスカラー変数のリファレンスであればその変数が消滅しない限りリファレンスを同じと思っていたのですが、
変わってしまう可能性があるのはなぜなのでしょうか?
知ってる方がいたら教えてください。
0088nobodyさん
2009/02/21(土) 10:57:17ID:???とりあえずソースコード晒せ。
0089nobodyさん
2009/02/21(土) 13:06:29ID:???すみません、レスしようと思って書き始めて気がつきましたが、
完全に自分の勘違いでリファレンスの値は変わっていませんでした。
リファレンスが不変となると、さらに別の疑問が。。
インサイドアウトオブジェクトを使用するときに、identを使う意味がなくなるように思うのですがどうなんでしょうか?
(例)
use Class::Std::Utils;
{
my %value_of;
sub new {
my($class, $opt) = @_;
my $obj = bless \do{my $anon_scalar}, $class;
return $obj;
}
sub set_value {
my($self, $value) = @_;
$value_of{ident $self} = $value; <===ここの ident を消しても動く。
return;
}
・
・
}
この中でidentを削除しても普通に動いてしまいます。
リファレンスが不変なら、なぜわざわざidentで一意の値を取得する必要がわかりません。
0090nobodyさん
2009/02/21(土) 13:08:00ID:???としたときに、呼び出し先のある関数に huga というエイリアスを張ろうとしています
ですが、どうやら importer が自動で起動しないようです
hoge.pm の &importer が呼び出されないことってあるんでしょうか?
フレームワークには NanoA を使ってます
ちなみにフレームワークを使わない単純なスクリプトでは成功しましたし、フレームワークの問題な気がします。
もし使えないことがあるなら代替方法を考えたいです
use で渡された引数を受け取る手段って他にないんでしょうか?
009190
2009/02/21(土) 14:31:01ID:???プログラムのほうはちゃんとそうなってました
0092nobodyさん
2009/02/21(土) 14:34:37ID:???そういうのは考えたことが無かったな。
SUPER.pm使うぐらいしか思いつかない。
package main;
use SUPER;
my $obj = Child->new;
$obj->whoami; # child
$obj->super('whoami')->();
>>89
ユニークな値ならなんでもよし。
0093nobodyさん
2009/02/21(土) 15:01:05ID:???SUPERはカレントパッケージの@ISAから探そうとする
Can't locate object method "whoami" via package "main" at ./tmp.pl line 19.
と言われるようにカレントパッケージがmainなのでwhoamiは見つからない
0094nobodyさん
2009/02/21(土) 18:31:27ID:???同じ名前で呼び出すことにこだわるなら、必要なときに分岐できるように
ChildのCをさらにオーバーライドすると思う。
それか、別名で定義するか
0095nobodyさん
2009/02/21(土) 18:32:52ID:???0096nobodyさん
2009/02/21(土) 18:34:39ID:???オブジェクトをハッシュにキーにしてはいけないと聞いたことがある。
何故かはしらね
オーバーロードしてるよきに困るからじゃないか?
0097nobodyさん
2009/02/21(土) 20:18:48ID:???PersonをインターフェイスにしてChildに多重継承させてもいいけど、
ちょっとゴチャつきそう。
package Person;
sub new {
my $class = shift;
return bless { @_ }, $class;
}
sub whoami {}
package Parent;
use base 'Person';
sub whoami { print "parent\n" }
package Child;
use base 'Person';
sub new {
my ($class, $parent) = @_;
return $class->SUPER::new(parent => $parent);
}
sub whoami { print "child\n" }
sub parent { shift->{parent} }
package main;
my $parent = Parent->new;
my $obj = Child->new($parent);
$obj->whoami; # child
$obj->parent->whoami; # parent
0098nobodyさん
2009/02/21(土) 20:31:17ID:???そういう形になりますか、ありがとうございます。
オーバーライドしたとき、元のメソッドを呼びたいときっていうのは、珍しいことでしょうか?
■ このスレッドは過去ログ倉庫に格納されています