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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/05/30(水) 11:34:01ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2-10

前スレ http://pc11.2ch.net/test/read.cgi/php/1171102883/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0662nobodyさん2007/08/04(土) 17:43:21ID:RQKCxjR+
>>661 もう一つ教えてください。下記の2種類あるんでが
どれを選択すればいいんですか?

Windows (x86)
AS package
MSI

Windows 64-bit (x64 AMD64)
AS package
MSI
0663nobodyさん2007/08/04(土) 18:25:57ID:???
>>662
http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.822-MSWin32-x86-280952.msi
0664nobodyさん2007/08/04(土) 18:30:12ID:???
msi のがいい
64bit は OS が 64bit である場合のみ
既に開発してて過去の古いソースが有りソレを何が何でも生かしたいのであれば 5.6 系がいいかもしれないけど
そうでなければ Perl は Ver 5.8 系をオススメ
06656562007/08/04(土) 19:43:16ID:???
>>657->>659

有難うございます。
さっそく試してみます。
0666nobodyさん2007/08/04(土) 19:53:57ID:???
build818以降PPM4になってアレだから5.8.8build817が個人的にはよい。
build815もいいけど、816はバイナリ互換がないから死ぬ。
0667nobodyさん2007/08/04(土) 20:01:14ID:???
>>666
アレって何だよ! 具体的に言えよ!
0668nobodyさん2007/08/05(日) 04:19:15ID:???
>>667
GUIバージョンになったのがイヤとかいう話じゃね?
それでも ppm3 で以前のを使えると思うが。
0669nobodyさん2007/08/05(日) 05:40:21ID:ZbLLWuy9
perlをこれから学びたいと思っているのですが
jcode.plって必ずつかわなければいけないのでしょうか?

文字コードはeucで作る予定です。
0670nobodyさん2007/08/05(日) 06:34:40ID:???
>>669
やめた方がいいと言われそうだけど、俺は好きだw
0671nobodyさん2007/08/05(日) 09:31:45ID:???
jcode.plはできる限り使わないほうがいい。
0672nobodyさん2007/08/05(日) 10:59:54ID:???
今からやるならせめてJcode.pm、できればEncode.pmがよさげ。
# 新しいJcodeはEncodeのラッパーだったっけ?
0673nobodyさん2007/08/05(日) 11:07:42ID:???
>672
です
Encode.pm が全部やってるはず
0674nobodyさん2007/08/05(日) 20:17:05ID:???
>>669
use Encode;

文字コードはUTF-8でやった方がいいよ。
0675nobodyさん2007/08/06(月) 17:56:09ID:???
在庫管理の機能をつけたいのですが
入荷毎の履歴から古いものから順番に在庫を減らす工程がわかりません。

$num='30';
---log
1<>29<>
2<>4<>
3<>16<>

---
というログをwhileで読み込んで行き、
$readline_num-$num がマイナスになるようなら
差分数値を次のreadline_numに…
という流れだと思うのですが
どうにもこうにも形にできません。

結果的には最初のlogが
---log
1<>0<>
2<>3<>
3<>16<>

---
という風になり、最終的に全部が0になるようならエラーを返したいのです。

アドバイスよろしくお願いいたしますm(_ _)m
0676nobodyさん2007/08/06(月) 18:03:22ID:???
エスパー頼む
0677nobodyさん2007/08/06(月) 18:06:59ID:???
というか素朴な疑問。
テキスト系DB作ってる人って、区切り文字は何にしてる?
俺はタブなんだけど、<>って良く見るけど、どういう意味があるんだろう。
データに<>を含まないからっていうのは、もちろんだけど。
0678nobodyさん2007/08/06(月) 18:18:04ID:???
>>677
KENT流れ
0679nobodyさん2007/08/06(月) 18:32:44ID:???
漏れ的にはデータ内にHTMLタグが含まれてたときには
全部排除する前提だから<>という入力は
100%ありえないという前提で<>にしている、と思う
0680nobodyさん2007/08/06(月) 18:37:53ID:???
でも、セコイこと言うと、<>の方が1バイト多くね?
フィールドが数十個あって、レコードが1000以上とかあると、バカに出来ないような気がする。


まあ、大量のデータ扱うなら、DB使えっていうことでFAなんだろうけどw
0681nobodyさん2007/08/06(月) 18:43:51ID:???
俺の場合は毎度車輪の再発明してもしょうがないので、csvにするかStorableにするか
DB使うかといったあたりで場合に応じて使い分けだな。独自形式でテキストに保存って
いうのは基本的にやらない。
0682nobodyさん2007/08/06(月) 18:56:30ID:???
>>681
でも、csvって"の扱いがいやらしくない?そういう車輪は発明されてるんだろうけどw
0683nobodyさん2007/08/06(月) 18:59:48ID:???
>>675
whileでループ作って1行ずつマイナス処理してマイナスなら数値を0に置き換えて次の行、
プラスならその数値に置き換えてループ脱出して終了
ファイル(または配列)の終端に達したら、エラー送出してループ終了
でいいんじゃないの?

とりあえずなんかコード書いてみれば?
0684nobodyさん2007/08/06(月) 19:06:10ID:???
>>675
俺的には、何でもforeachとsplit
perl書くようになって、この2つは一番汎用してるかも。
0685nobodyさん2007/08/07(火) 02:30:26ID:???
今はData::Dumperは流行らないか。
06866692007/08/07(火) 02:43:38ID:???
遅くなりました。
たくさん回答頂いてしまい恐縮です。
Encode.pmを使ってみることにします。
ありがとうございました。
0687nobodyさん2007/08/07(火) 09:10:50ID:???
最近はaudreyのYAML::Syckをよく使う
0688nobodyさん2007/08/07(火) 10:41:18ID:???
Encode.pmって半角カナに完全対応してたっけ?
日本語入力がある場合は結局jcode.plが最適だったのでは。
0689nobodyさん2007/08/07(火) 10:50:16ID:???
あの手軽さを考えたら未だにjcode.plから抜け出せない。
0690nobodyさん2007/08/08(水) 08:23:14ID:???
>>688-689
何をもって「完全」かは知らんけど、Encode::JP::H2Z のような実装は
用意されている。jcode.pl は UTF-8 扱えない時点で選択肢外なので、
1. Encode + 自前の補助コード
2. Jcode Ver 0.88
3. Unicode::Japanese
の優先順位で使ってるかな。
0691nobodyさん2007/08/08(水) 10:53:06ID:???
半角カナより機種依存とか拡張外字とかの扱いに困ってるんですが
みなさんどうしてますか?
0692nobodyさん2007/08/08(水) 21:52:51ID:???
もう大分定着してきたと思うが、shiftjis使ってるやつは
cp932にしたら大分マシになると思う。
0693nobodyさん2007/08/08(水) 23:28:38ID:???
教科書立ち読みしてたら
シフトJIS使うときは、
2バイト文字の後半部分がC5のもの、
たとえば表とかつかうときは
表¥
ってしないと文字化けするから!
とかって書いてあって、はぁ?とおもった
これってperlでなくてもwebアプリつくるひとは
全員必須の知識なの?
0694nobodyさん2007/08/08(水) 23:34:32ID:???
知ってて損は無いけど、古すぎな知識。
0695nobodyさん2007/08/09(木) 00:51:15ID:???
正確に言えば、Webアプリ限定ですらないよな。
0696nobodyさん2007/08/09(木) 00:55:40ID:???
unicode万歳やで〜
0697nobodyさん2007/08/09(木) 01:01:57ID:???
utf-8がいちばん扱いやすい。
0698nobodyさん2007/08/09(木) 01:22:31ID:???
Unicodeキライ
0699nobodyさん2007/08/09(木) 01:59:23ID:???
結局DBも使わず、jcode.pl、eucでショッピングカート作った。
0700nobodyさん2007/08/09(木) 03:02:11ID:???
>>699
設置サーバや運用者の技術レベルによってはありかもね。
「文字コードって何?」ってレベルだと Shift_JIS で問題が
出ないよう作った方が後々面倒が無くていいけど。
0701nobodyさん2007/08/09(木) 08:19:14ID:???
文字を変更したのに
表示される文字が変更されない

my $msg="abcdefg ".$DT->{unkoname}."あいうえお".$count."かきくけこ";

このあいうえおの部分を
test
に変更して
my $msg="abcdefg ".$DT->{unkoname}."test".$count."かきくけこ";
にしたのに、表示されるのはあいかわらずあいうえおのまま。なんで?
0702nobodyさん2007/08/09(木) 09:15:01ID:4ANcM0VH
windowsにperlの5.6と5.8を共存させたいのですが
どのようにしたらいいのでしょうか?
0703nobodyさん2007/08/09(木) 09:24:55ID:???
>>702
つ[ VMwarePlayer ][ Linux ]
0704nobodyさん2007/08/09(木) 09:47:24ID:???
ひょっとしたら管理モードにしないで
スクリプト更新したからデーターが壊れたかも
「スクリプトをいじるときには
必ず管理モードにしてください、そうでないと
最悪、データーが壊れます」
って説明書読んだら書いてあった
0705nobodyさん2007/08/09(木) 10:14:54ID:???
>>702
仮想化なしでそのままふたつインストールする技はないのでしょうか?
0706nobodyさん2007/08/09(木) 11:14:03ID:???
入れてみろ
0707nobodyさん2007/08/09(木) 11:17:39ID:???
片方入れると片方アンインストールされてしまうんですよ
0708nobodyさん2007/08/09(木) 12:15:41ID:???
>>705
つ[Partition Logic][デュアルブート]
0709nobodyさん2007/08/09(木) 12:31:51ID:UyK8ofDd
ビスタならできるんじゃない?いや、分からんけど。
0710nobodyさん2007/08/09(木) 13:28:54ID:???
つ[ ttp://sakaguch.com/PastBBS/0030/B0015057.html ]
0711nobodyさん2007/08/09(木) 13:57:44ID:???
ActivePerl の 5.005 と 5.8 なら Win98SE上に両方インスールしてる。
インストール先を別ディレクトリにして、環境変数PATHの設定や
PPMの設定ファイルをちょこちょこ変更するだけで普通に使えている。
0712nobodyさん2007/08/09(木) 18:13:34ID:???
まあ、今時 Win98SE なんかつかってるばかは氏ねばいいと思うんだけど。
0713nobodyさん2007/08/09(木) 19:18:02ID:???
再起動の時に必ずフリーズした98SE
0714nobodyさん2007/08/09(木) 20:28:15ID:qod+hj3t
sleep関数は3日(259200秒)とか指定して実際3日待機して
くれるものなのでしょうか。

ご教示いただけますと幸いです。
0715nobodyさん2007/08/09(木) 20:33:12ID:???
…やってみれば?
0716nobodyさん2007/08/09(木) 20:33:24ID:???
サーバーのCGI実行制限時間に達するとKILLされます
0717nobodyさん2007/08/09(木) 20:42:53ID:???
>>715
今からでは試すのにちと間に合わなかったので(あさって納品)
質問させていただきました。

>>716
なるほど。
危なそうなので別の方式をとります。
有難うございました。
0718nobodyさん2007/08/09(木) 20:44:14ID:???
定期実行させたいならcronで回してくださいな
0719 ◆lVJAPUTeX. 2007/08/10(金) 03:28:51ID:???
>>677
タブ区切りにしている。
タブは空白文字に置換しても差し支えない場合が多いことと、CSV程ではないけどExcelで読み込みやすいため。

>>680
せこいこと言うと、Perlなんて遅いから全部アセンブラで書くべき。:-p

>>702
Cygwin入れて、片方は
/usr/local/perl5.6
みたいなディレクトリにインストールする作戦も。
0720nobodyさん2007/08/10(金) 03:31:07ID:???
>>717
おまえプロじゃないだろ
学校の宿題は友達にうつさせてもらえよ
0721 ◆lVJAPUTeX. 2007/08/10(金) 03:36:03ID:???
>>675
エスパーになって考えてみた。(在庫減らすところだけ。)
@zaiko = ({id => 1, num => 29}, {id => 2, num => 4}, {id => 3, num => 16})
という配列に読み込んだと想定。

my $i = 0;
while($herasu and $i < @zaiko and $zaiko[-1]{num}) {
my $s = min($zaiko[$i]{num}, $herasu);
$zaiko[$i]{num} -= $s;
$herasu -= $s;
$i++;
}
0722nobodyさん2007/08/10(金) 10:42:02ID:???
>>721さん
本当にありがとうございますm(_ _)m
0723nobodyさん2007/08/10(金) 11:00:12ID:???
でも在庫管理で難しいのは、排他処理がなってなかったり、どの段階で在庫を減らすかとか、
実物の在庫管理をどうするか、という問題の方が大きいような希ガス。perlの話と離れてスマソ
0724nobodyさん2007/08/10(金) 12:55:11ID:???
>>723さん
そうですね、排他処理は色んな方のスクリプトを参考にしていきます。
どの段階、実在庫管理、というのは永遠の課題です。アドバイス感謝です。
0725nobodyさん2007/08/10(金) 18:54:38ID:???
そんなのが永遠の課題ってすごいなwww
廃業するべき。
0726nobodyさん2007/08/10(金) 19:01:05ID:???
在庫管理で失敗するのは在庫があるかないかのフラグだけにするからだ。
0727nobodyさん2007/08/10(金) 23:52:43ID:???
在庫を管理しようとするから難しくなる。
発想を逆転させるんだ。
0728nobodyさん2007/08/11(土) 03:10:13ID:???
管理を在庫にするんだ。
0729nobodyさん2007/08/12(日) 12:56:10ID:???
在庫にたんぽぽを載せるようにするんだ。
0730nobodyさん2007/08/12(日) 21:21:39ID:sl0Dt6RW
UTF8フラグのついた文字(char)のバイト数を知りたいのですが
$byte = length($char)とすると当然ながら答えはどれも1になります。
現在は
utf8::encode($char);
$byte = length($char);
urf8::decode($char);
として凌いでいますが、もう少しスマートなというか、
違う書き方できますか?
0731nobodyさん2007/08/12(日) 21:38:11ID:???
length文をブロックで囲って中にuse bytes;って書いてみそ
0732nobodyさん2007/08/12(日) 21:41:18ID:???
みそwwwwwwww
07337302007/08/12(日) 22:01:23ID:sl0Dt6RW
>>731
ありがとうございます!
そんなuse文があったとは知りませんでした。
パッケージ内のサブルーチンでの扱いでしたので、
サブルーチン(ブロック)の先頭にuseを置いてみましたm(_ _)m
0734nobodyさん2007/08/14(火) 17:47:49ID:???
ひらがなのみを受け付けるフォームを作成しています。
正規表現で

($prm !~ /(?:\x82[\x9F-\xF1]|\x81[\x4A\x4B\x54\x55])/)

と書くことによって一応ひらがなを識別できるようにはなったんですが、
他の文字も混ざってしまうと判定ができなくなります。
例えば「aaaaaaあaaaa」のように一文字だけひらがなが入っていた場合エラーにする事ができないのです。
全て英字なら問題はないのですが。。。

ひらがなのみを受け付けるようにするにはここからどう改造すればよろしいのでしょう?
0735nobodyさん2007/08/14(火) 17:56:04ID:???
($prm !~ /(?:\x82[\x9F-\xF1]|\x81[\x4A\x4B\x54\x55])+/)
0736nobodyさん2007/08/14(火) 18:09:03ID:???
>>735
す、すみません。。
やってみましたけど結果変わらずでした。。。
?:のせいなのかなぁ。。。
0737nobodyさん2007/08/14(火) 18:38:42ID:???
自己解決しました
0738nobodyさん2007/08/14(火) 20:44:26ID:5P93CXGl
Perlerのみなさんこんにちは。質問です。

#!/usr/bin/perl -w
use strict;

my $a="Hello, world.";

my $s=substr($a, 0, 5, "Goodbye");
print $s;
を実行したところ、
Hello
と出力されました。
『初めてのPerl』第3版254ページによると、
Goodbye,world
になるはずなのですが、そうなりませんでした。
Perl 5.8.8を使っていますが、これはどういうわけなのでしょうか?
部分文字列を指定した文字列で置換して代入することをやるにはどうすればいいのでしょう?

宜しくお願い致します。
0739nobodyさん2007/08/14(火) 20:51:37ID:???
パチンコ屋かと思いました

戻りは置換された文字列
$a を出力してください

ついでに書くと $a と $b は使用しないように
0740nobodyさん2007/08/14(火) 20:56:14ID:5P93CXGl
>739さん

ありがとうございます。
教えてくださったようにやると、うまくいきました。

$a,$bの件、気をつけます。

ありがとうございました。
0741nobodyさん2007/08/16(木) 01:34:19ID:???
perlでCGIで
実体参照を出力するんだけど
&アンパサンドと
;セミコロンを含んじゃうので、
この場合、”ダブルクオーテーションで囲むのと、
’シングルクオーテーションで囲むのと、
どちらがより適切ですか?
ページの閲覧者はアメリカ人で
文字コードのデフォルト設定はたぶんUS-asciiとかで、
ソースファイル自体の文字コードはシフトJISです。
0742nobodyさん2007/08/16(木) 01:38:20ID:???
文字列に”ダブルクオーテーションか’シングルクオーテーションが含まれるなら、悩む意味があるけど、
;セミコロンだったらどっちでもいい。

個人的には変数展開しない’シングルクオーテーションの方が軽くていいかなと思うけど、

$hoge = 'ぬるぽ';
print 'ぬるぽ'.$hoge;
print "ぬるぽ$hoge";

ってどっちが軽いんだろう。
0743nobodyさん2007/08/16(木) 01:52:58ID:???
;セミコロンを打ったとたんに、
perlが、
「ああ、、、ここでこの行は終わりなんだな(ニヤリ」
とかって解釈して、勝手に行が終わるかと思ったんですよ。
0744nobodyさん2007/08/16(木) 01:56:19ID:???
あと&アンパサンドはつかっていいんですか?
エスケープしたりとか、
&アンパサンド自体を実体参照にしたりとか、
なにか特別な処理をしなくてもいいんですか?
0745nobodyさん2007/08/16(木) 05:28:27ID:???
\でエスケープすれば?
0746nobodyさん2007/08/16(木) 09:58:58ID:???

>>741-744

Perlについての質問箱 32箱目
http://pc11.2ch.net/test/read.cgi/tech/1186995713/

プログラム板の上記のスレで暴れてる

1. 読まない
2. 調べない
3. 試さない
4. 理解力が足りない
5. 人を利用することしか頭にない

クンなので、ここの住人の皆さんも華麗にスルーする事をオススメします。
もしくは、このスレの低レベルさを証明する為答えてやっても結構です。
何卒、ご協力宜しくお願いします。
0747nobodyさん2007/08/16(木) 11:47:46ID:???
>>743
ねーよwwww

>>744
はあ?
なんで必要なんだ?
0748nobodyさん2007/08/16(木) 11:58:57ID:???
無限ループかw
0749nobodyさん2007/08/16(木) 21:38:37ID:IWfAsW1M
一度
print "Content-Type: text/html\n\n";
と出力してしまったHTTPヘッダを次の行で削除することは
できないものでしょうか。

もし方法があればどうかご教示ください。
0750nobodyさん2007/08/16(木) 21:46:32ID:???
時空間を移動できる能力が身に付けば可能です
0751nobodyさん2007/08/16(木) 21:51:41ID:???
>>749
というより、どうしてそういうことがしたいのかという方が気になる…
0752nobodyさん2007/08/16(木) 21:54:51ID:???
>>749
無理

>>751
禿同
0753nobodyさん2007/08/16(木) 21:57:42ID:???
まあ、2回出力させちゃって、ページの上に Content-Type: text/html って表示させたことの
ある奴は俺だけじゃないはずw
0754nobodyさん2007/08/16(木) 22:42:00ID:???
皆様ご返答有難うございました。

事情は、>>753のとおりです。
一番先頭に出力させてしまい、500行目くらいでlocation使わなけれ
ばならなくなってしまい、どうにかできないものかと思った次第です。

できないとわかっただけで収穫です。
感謝です。
0755nobodyさん2007/08/16(木) 22:52:41ID:???
>>753
あるあrw

>>754
そういう場合は先に条件判定させて、真偽によってサブルーチン使ったりして別々にすればおkかと。
0756nobodyさん2007/08/17(金) 00:55:10ID:NJG0WVbr
すいません、たぶんアホな質問してるんだろうと思いますが思い切って聞いてみます。
perlからpostgresqlを利用したいと思いpostgresqlを調べ始め、なんとかローカル上
ではサンプルDBとか作成できたんですが、DBって1つのファイルじゃないんですか?
perlのcgiファイルみたいにサーバへアップロードするにはどうすればいいんでしょうか?

それと、ローカル上で作成したDBにperlから接続しようとしてるのですが、
Perhaps the DBD::Pg perl module hasn't been fully installed
というエラーが出てしまいます。

DBIモジュールはppmからインストールしいて、再インストールしようとしても
Package 'DBI' is already installed となっています。
DBIモジュール以外に何か足りないのでしょうか?
0757nobodyさん2007/08/17(金) 01:14:19ID:???
ポカーン・・・
0758nobodyさん2007/08/17(金) 02:05:15ID:???
>>756
ひとつのファイルとしてDBを組んで、
アップロードしたいならSQLiteでも使いなさい。
DBIだけでなくDBDのインストールも必須。
0759nobodyさん2007/08/17(金) 02:15:56ID:???
>754
こっちの方がスマートじゃない? そうでもないかな?

 (1) 変数 $output を用意する
 (2) ソースの途中でprintは使わず、代わりに $output へ文字列を追加するようにする
 (3) 最後に$outputを出力

変数に代入するだけなら、幾らでもやり直しができる。
0760nobodyさん2007/08/17(金) 02:38:15ID:???
スマートさを追求するならテンプレート使えよ
0761nobodyさん2007/08/17(金) 10:52:09ID:???
>>756
pg_dumpして、ファイルをアップロードが一番安全だろうけど、権限が必要。
専用鯖なら問題なしだけどね。

DBD::Pgは、theoryx5をリポジトリに追加で行けると思う。
追加方法については、ぐぐってくれ。
■ このスレッドは過去ログ倉庫に格納されています