トップページ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/
0002nobodyさん2009/02/16(月) 11:42:52ID:gvPTpodw
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
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
ム板Perlスレより 2 of 2

[モジュール]
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:???
前スレ999です。
嘘つきました、すいません。
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:???
title とるだけのために Web::Scraper とか大げさすぎだろ
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:???
perl でちょっと大きめなファイルを扱うコンソールアプリを作ろうとしています。
処理中に進捗を表示しようとしてるのですが、普通に何パーセント終わったというのを出すと

1% finished.
2% finished.
 ・
 ・
 ・
100% finished.

と延々と100行も続きます。
DOS にはエスケープシーケンスというのがあり、カーソルの移動とかが出来て同じ場所に違うテキストを上書き表示をすることが出来ます。
しかし perl からエスケープシーケンスを出力しても文字化けで終わってしまいます。
ANSI.SYS を組み込めばエスケープシーケンスは有効ですが、出来る限り古い環境 (ANSI を組み込むという事は COMMAND.COM を使うことになりレガシーな環境になります)
を使わないで済むような方法はありますでしょうか?
0012nobodyさん2009/02/17(火) 15:40:15ID:???
今Windows rubyしかなくて試せないんだけど、"\r"を出力してもだめ?
0013nobodyさん2009/02/17(火) 15:41:52ID:???
print '1% finished.';
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:???
Smart::Commentsのプログレスバーは?
http://search.cpan.org/~dconway/Smart-Comments-v1.0.3/lib/Smart/Comments.pm
0016nobodyさん2009/02/17(火) 15:56:11ID:???
>>13
キャリッジリターンの存在をすっかり忘れてましたw
希望通りの動作ができました
感謝です

>>14
一旦そのやりかたも考えましたが、一度考えた表示の仕方から逃げるみたいでなんかイヤだったんですよね^^;



ありがとうございました m(_ _)m
0017nobodyさん2009/02/17(火) 22:06:02ID:???
文字化けになった「エスケープシーケンス」って何?
0018nobodyさん2009/02/17(火) 22:25:23ID:???
>>17
ttp://www.mars.dti.ne.jp/~torao/program/appendix/esc.html
0019nobodyさん2009/02/18(水) 16:50:38ID:???
配列の要素を吐き出す際に、3の倍数の時に改行を入れようと
if($in/3 = 整数型)
上記のような事を考えていましたがperlでは整数型等の指定が出来ないみたいです。
何か方法がございましたら教えて頂けないでしょうか。よろしくお願いします。
0020nobodyさん2009/02/18(水) 16:55:58ID:???
>>19
if ($in % 3 == 0)
0021nobodyさん2009/02/18(水) 17:17:10ID:???
>>20
ありがとうございました。
条件式に余剰が使えるという発想がありませんでした。
もっと色々考えないといけませんね。
0022nobodyさん2009/02/18(水) 17:28:53ID:???
print "\n" if !($in % 3);
0023nobodyさん2009/02/18(水) 19:30:14ID:???
>>22
unlessの事もたまには…
0024nobodyさん2009/02/18(水) 19:34:19ID:???
そういや、そんな子も居ましたね・・・
0025nobodyさん2009/02/19(木) 02:34:53ID:???
unless ($hoge or $huga) とか unless ($hoge and $huga) とか、ぱっと見で意味が分からん
考えてもわからんけどな
0026nobodyさん2009/02/19(木) 02:40:24ID:???
周辺にコメントで
# if (!($hoge or $huga))
とか
# if (!($hoge and $huga))
って書いておけばいいんじゃねw
0027 ◆TWARamEjuA 2009/02/19(木) 07:16:44ID:???
(´-`).。oO(偶にはuntilのことも思い出してあげてください。。。)
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:???
>>28
OK だけど、a とか b だけの変数名はオススメしない

>>29
こういうデータを希望してるのに、こんなデータになってしまう
ぐらいの言葉書けないの?
バカなの?
死ぬの?
0031nobodyさん2009/02/19(木) 14:45:02ID:???
open(OUT, "> data.txt");
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:???
strictの勉強してるんだけど、外部から読み込んだハッシュのコピーする時に
our宣言が必要な場合は、

my %hoge = our %moge;

って感じで書くとエラーでないけどこういう書き方は問題ない?

our %moge;
my %hoge = %moge;

って書くべき?
0034292009/02/19(木) 16:28:52ID:???
単純に変数のつづりを間違っていただけでしたありがとう御座いました
0035nobodyさん2009/02/19(木) 16:53:49ID:???
>>33
どちらでも言語的には正しいが、俺は見易さから後者にするね。
わざわざourとか使うぐらいだからそれなりに大きいプログラム
なんだろうし。
0036nobodyさん2009/02/19(木) 17:36:11ID:???
あれ、perldocにmy/ourが何を返すか書いてないことないか。
0037nobodyさん2009/02/19(木) 19:03:07ID:???
Win32::Soundの使い方について質問です。
wavファイルを繰返して再生したいのですが

#! perl
use Win32::Sound;
$file = "sound.wav";
Win32::Sound::Play( $file, SND_ASYNC, SND_LOOP);

と書きましたが、音が出ず終了してしまいました。
意図する動作をさせるための書き方を教えてください。
0038nobodyさん2009/02/19(木) 20:24:56ID:???
ourで宣言した変数を、初期化しないで、すぐにmyで宣言した変数に代入するって、そういうのが必要なケースってある?
0039nobodyさん2009/02/19(木) 20:45:17ID:???
同じ事考えたのか、あるいは似たような事かはわからないが、
requireでhashだけ書き込んであるスクリプトを読み込んで、
そのhashを使おうとした時にourで宣言しないと駄目だった気がする。

いちいちデータを整形するのが面倒だから、
hashをそのまま読み込めるようにスクリプトとして直接出力して使った俺も俺だがw
サブルーチンの形で出力してrequireすれば戻り値使えてour使わず済むんじゃない?
そこまでいくと色々な意味で違う気がするがw
0040nobodyさん2009/02/19(木) 21:02:24ID:???
>>37
Win32::Sound::Play($file, SND_ASYNC|SND_LOOP);
0041402009/02/19(木) 21:04:59ID:???
>>37
言い忘れた。適当にウェイトかまさないと音が出ないで終了するから注意。
0042nobodyさん2009/02/19(木) 22:18:51ID:???
>>40
どうもです!
0043nobodyさん2009/02/20(金) 09:00:28ID:???
>>39
昔からPerlの定数は無引数のサブルーチンを使うのが普通ですよ。
constantプラグマも中身はそうなってる。
0044nobodyさん2009/02/20(金) 14:17:51ID:???
>>39
データ永続化にはStorable
0045nobodyさん2009/02/20(金) 15:33:35ID:vekYyWEG
300行程度のプログラムを動作させたら、エラー表示が出ずに変数の中身だけが壊れる謎の現象が起きたのですが
そういった事が起こった経験のある方いませんか?
詳しい現象は足し算を5回し50になるはずの計算値が1.02010301020104e+15という数値になります。
プログラムの記述には問題は無いはず。
(エラーの表示はでていない、足し算、引き算以外は用いていない、小数も用いていないのにエラーは少数)。

メモリーエラーとかハード面ではないかと疑っています。
0046nobodyさん2009/02/20(金) 15:47:47ID:???
はいはいコード晒そうね。
0047nobodyさん2009/02/20(金) 16:09:11ID:???
果たしてそれが少数なのか って話だが・・
0048nobodyさん2009/02/20(金) 16:17:25ID:???
>>45
再現性のあるコードを晒してからだな
話にならん
0049nobodyさん2009/02/20(金) 16:24:13ID:vekYyWEG
困った、賞味300行程度あってサイトアドレスなどさらせないものが含まれてて問題の変数にはプログラム全体が関わっています。
一部分を抽出して同じエラーが出たらその部分をさらします。
0050nobodyさん2009/02/20(金) 16:28:05ID:???
晒せないところは伏字にすればいいだろ
0051nobodyさん2009/02/20(金) 17:01:26ID:vekYyWEG
if () {}
if () {}
if () {}

if () {}
elsif () {}
elsif () {}
に変えたら直りました。上記だと2個の条件を同時に満たしたときにバグるようです。
下記だと同時に条件を満たしたとき先に記述された条件のほうを優先するようです。
なぜだかさっぱりわかりません。
0052nobodyさん2009/02/20(金) 17:03:40ID:???

そんなレベルの奴が書いた300行のスクリプト…
0053nobodyさん2009/02/20(金) 17:18:50ID:???
>>52
for next などの繰り返し処理や
サブルーチンの使い方などが良くわからないのでやたら長くなりました

ちなみに賞味300行なので空行を入れて印刷すると15ページになりました。
連動する別のファイルのスクリプトをあわせると30ページ以上になりました。
やっぱりサブルーチンは覚えるべきだとおもいました。
0054nobodyさん2009/02/20(金) 17:30:01ID:???
>>53
本とか買えば?
0055nobodyさん2009/02/20(金) 17:34:37ID:???
>プログラムの記述には問題は無いはず。
こういう自信って何処から来るんだろう。
0056nobodyさん2009/02/20(金) 17:45:10ID:???
「我は全知全能なり」という自己認識
0057nobodyさん2009/02/20(金) 17:51:45ID:???
>>55

単純にエラーの表示が出なかったからです。
>>54
本は難しすぎてよくわかりませんでした。
0058nobodyさん2009/02/20(金) 17:53:27ID:???
>>51
てめぇは本をまず買えよw


if () {}
elsif () {}
else {}



もし 〜 なら {}
そうではなくて、もし 〜 なら {}
そうでなけりゃ {}

ってなって、1つでも TRUE となれば他は評価されません。

if ばかり並べると全てが評価されます。
0059nobodyさん2009/02/20(金) 18:36:53ID:???
「コンパイルが通れば単体試験OK」
を思い出した。
0060nobodyさん2009/02/20(金) 18:37:19ID:???
最初に買うなら、初めてのPerlが一番いいと思う。
0061nobodyさん2009/02/20(金) 18:42:56ID:???
プログラミングをはじめようとしてる人に薦めてるのは

「はじめてのperl」 など、サンプルが載ってるもの
ポケットリファレンス

の2冊を同時に買うように進めてる

ネット見りゃ済むって思うだろうけど、それはよほどやる気の有る奴か
なんでもかんでもググりたいようなやつとか、そういう人種にしか出来ないw

やっぱ始めのうちは 「紙で読むこと」 が重要だと思う
0062512009/02/20(金) 18:46:04ID:???
>>58
ありがとう
>>60-61
了解
0063nobodyさん2009/02/20(金) 18:51:29ID:???
明らかにネタだろ。
答えを期待しない質問とか、for next とか、本が難しいとか
真剣さがいささかも感じられませんね。
0064nobodyさん2009/02/20(金) 19:09:45ID:???
ネタでも「あぁなるほど」と思う人間もいるんだぜ?
1つの質問に対する回答が、質問者しか助けないと思ったら間違いだ
0065nobodyさん2009/02/20(金) 19:41:50ID:???
「あぁなるほど」は2chの楽しみの一つやね。
0066nobodyさん2009/02/20(金) 22:16:49ID:???
>>65
あぁなるほど
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:???
それだと、1,9800.05とかでも通っちゃうよなあ
0069nobodyさん2009/02/20(金) 23:04:44ID:???
if ( $data =~ /^[0-9,.]+$/ ){
 #数字,.のみ
}else{
 #それ以外もあるよ
}
じゃダメなのかな?
0070nobodyさん2009/02/20(金) 23:09:49ID:???
同じサーバーに、こんな人がいませんように(-人-)
0071nobodyさん2009/02/20(金) 23:18:50ID:???
てか、何でもいいじゃん動けば。

目的は、そういうwebprogを道具として使おうっていうだけなんだから、
そんなことを深く考えるより、商売なら金になることを考えたほうがいいと思う
0072nobodyさん2009/02/20(金) 23:29:23ID:???
Scalar::Utilのlooks_like_numberは?
0073nobodyさん2009/02/20(金) 23:29:29ID:???
> てか、何でもいいじゃん動けば。

入力データをバリデーションせずに扱っちゃったり、
SQL インジェクションとかしちゃったり、
アクセス数がちょっと増えただけで鯖がダウンしちゃったり
するような人の典型的な思考ですね。

> 商売なら金になることを考えたほうがいいと思う

金のなる木になるどころか、負け犬になりますよw
0074nobodyさん2009/02/20(金) 23:37:37ID:???
>>73
そういうことが起こってから考える
0075nobodyさん2009/02/20(金) 23:54:52ID:???
>>74
SQL インジェクションが起こってからだと洒落にならない件。
0076nobodyさん2009/02/21(土) 00:19:11ID:???
そもそもDBは知らなくて使えない
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+)?$/){
■ このスレッドは過去ログ倉庫に格納されています