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

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

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

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

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

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

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1189939783/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0222nobodyさん2008/03/26(水) 01:00:59ID:???
sort { $hash{$b} <=> $hash{$a} } keys %hash;
0223nobodyさん2008/03/26(水) 01:01:47ID:???
>>221
質問が漠然とし過ぎてるんで、この辺一通り読んでから来て。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html
http://perldoc.jp/docs/perl/5.8.8/perldsc.pod
0224nobodyさん2008/03/26(水) 01:05:19ID:???
>>222さんのでわかりました!
>>223さんのも読んでおきます!
どうもでした!!
0225nobodyさん2008/03/26(水) 09:29:51ID:LilkylgS
CGI.pmを使ってアップロードされたファイルの途中まで読んで
そこで終わりにしたい場合はどうしたらいいでしょうか?

どうも全部読むか、失敗かの選択しかないみたいなんですが。。
0226nobodyさん2008/03/26(水) 14:32:04ID:???
そんな需要は稀なんだろ
一旦保存してから読み直せば?
0227nobodyさん2008/03/26(水) 14:47:06ID:???
>>225
httpd が受け取る/受け取らないという話でなく、
プログラム中の処理の流れでという意味なら
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
の「ファイル・アップロード・フィールドの作成」の項
0228nobodyさん2008/03/26(水) 22:35:17ID:OE9DSfjk
しつもん

定数なんかを別ファイルに置いてそこから取得したい。

---const.pl---
my $x="あいうえお";
1;

---main.cgi---(ヘッダとかは略)
use strict;
require "./const.pl";
print $x;


とするとGlobal symbol "$x" requires explicit package nameという
$xが定義されていませんエラーになります。
use strict外すと$xは空白です。

http://q.hatena.ne.jp/1190815879
とかを見るとどう見てもこれで正しいようにしか思えないのですが何故?


他にこんなところで迷ってる人居ないから環境の問題なんだろうか?
CoLinux,perl5.8.6
0229nobodyさん2008/03/26(水) 22:45:43ID:???
同じ変数でも名前空間が異なれば別物
0230nobodyさん2008/03/26(水) 22:57:38ID:???
>>228
<q cite="http://perldoc.jp/docs/perl/5.10.0/perlfunc.pod#item_my_EXPR_my">
my はリストアップされた変数を、囲っているブロック、ファイル、eval の中で
ローカルな (レキシカルな) ものにします。
</q>

http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html#Perl_Modules
0231nobodyさん2008/03/26(水) 23:12:52ID:???
my と use strict を取っ払ってみると print されたり。
変数の局所化とか strict とは無縁になるけど。

はてなでやり取りしてる人らはそうしてるんじゃないかな。
0232nobodyさん2008/03/27(木) 01:07:20ID:???
local
0233nobodyさん2008/03/27(木) 01:23:34ID:R/qLdwoI
>>228
hoge.pm

package hoge;
sub kaze_hiita{
"hayaku neru"
}
our $x = 1;
1;

foo.pl
use hoge;
print hoge::kaze_hiita; -> 早く寝る
print $hoge::x; -> 1
$hoge::x = 10;
print $hoge::x; -> 10

関数のときのみ::じゃなくて->が使えるんだぜ。
あと関数の尻尾には();って書いてあると俺はうれしい。
ハッシュで渡すとさらにうれしい。

あと、そゆのがコンフィグを一杯つかうなら
普通に Auto-Config使うべし。
http://memo.majide.com/index.php?%A1%DAPerl%A1%DBConfig-Auto%A4%CB%A4%E8%A4%EB%C0%DF%C4%EA%A5%D5%A5%A1%A5%A4%A5%EB%A4%CE%C6%C9%A4%DF%B9%FE%A4%DF

当然だがファイル間は文字コードは統一しとけよ
それでしんだひとをみたことがあります。>俺自身
0234nobodyさん2008/03/27(木) 10:30:16ID:???
>>233
説明で「 -> 1」とかを使ったら混乱するだろjk
0235nobodyさん2008/03/27(木) 12:35:04ID:???
正直すまんかった
234が責任を持って書き換えます。おながい。
0236nobodyさん2008/03/27(木) 12:36:10ID:???
>>228
こうするのさ。

---const.pl---
$x="あいうえお";
1;

---main.cgi---
use strict;
our $x;
require "./const.pl";
print $x;
0237nobodyさん2008/03/27(木) 16:59:46ID:???
our wwwwwwwwwwwwwwwwwwwwwwwwww
0238nobodyさん2008/03/27(木) 19:04:51ID:???
○|_|| ̄ wwwwwwwwwwwwwww
0239nobodyさん2008/03/27(木) 22:17:48ID:???
oL/
02402282008/03/27(木) 23:49:16ID:OO8NUyXN
>>229-236
さっぱりわからんがサンクス。調べてみる
iniファイルやPHPみたいに簡単に取得できる方法はないのかのう・・・
0241nobodyさん2008/03/27(木) 23:56:27ID:???
>iniファイルやPHPみたいに簡単に取得できる方法
だからモジュール紹介されてるやんけwww
0242nobodyさん2008/03/28(金) 00:17:56ID:???
ワロタ
02432332008/03/28(金) 00:26:56ID:???
>>240
感想でいいからくれ
何がさっぱりわからんと思ったか書いてくれれば分かりやすくもういっかい書くよ。

1. リンクを開いたと思うんだが、何が意味不明だと思った(全部ってのはなしで)
2. 何を作っててプログラム暦何年か教えてくれ。

スレ汚しならすまん。ちょっと個人的に技法よりも心理障壁に興味がある。
0244nobodyさん2008/03/28(金) 10:02:51ID:???
新人教育かw
0245nobodyさん2008/03/28(金) 15:01:30ID:jpsDmJfA
ログに保存されている日付を以下のように整形するにはどうしたらいいんでしょう?

2008/03/28(金) 09:30:08
↓
08/3/28 9:30
0246nobodyさん2008/03/28(金) 15:33:52ID:???
>>245
sub reduce_date {
  my @date = split /\D+/, $_[0];
  $date[0] -= 2000;
  sprintf '%02d/%d/%d %d:%d', @date[0..4];
}

print reduce_date('2008/03/28(金) 09:30:08');
0247nobodyさん2008/03/28(金) 15:36:13ID:???
use strict;

my $orgdate = '2008/03/28(金) 09:30:08';
my @splitdata = $orgdate =~ /(\d{2})+/g;

printf("%02d/%02d/%02d %02d:%02d:%02d", @splitdata);
0248nobodyさん2008/03/28(金) 15:46:09ID:???
s{\d\d(\d\d/\d+/\d+)[^ ]+( \d+:\d+):\d+}{$1$2};
0249nobodyさん2008/03/28(金) 15:48:45ID:???
指定がないけど %02d/%d/%d %d:%02d を期待されてそうな気がする
0250nobodyさん2008/03/28(金) 15:57:20ID:???
なるほど。

s{\d\d(\d\d)/0?(\d+)/0?(\d+)[^ ]+ 0?(\d+):(\d+):\d+}{$1/$2/$3 $4:$5};
0251nobodyさん2008/03/28(金) 16:45:45ID:???
my @splitdata = $orgdate =~ /(\d{1,2})+/g;
my $datetime = sprintf("%02d/%d/%d %d:%d:%d", @splitdata);
0252nobodyさん2008/03/28(金) 16:49:23ID:???
間違えた

my @splitdata = $orgdate =~ /(\d{1,2})+/g;
my $datetime = sprintf("%02d/%d/%d %d:%d", @splitdata);
print $datetime;
0253nobodyさん2008/03/28(金) 16:59:35ID:???
2008/03/28(金) 09:30:08から08/3/28(Fri) 9:30にするにはどうする?

0254nobodyさん2008/03/28(金) 17:35:24ID:???
>>247-252
もはや、知らない奴が見たら暗号でしかないなw

0255nobodyさん2008/03/28(金) 19:09:17ID:???
javascriptのプログラムをPerlに移植しようとしていて、複合代入演算子の挙動が違うのでとまどっています。
例えばjavascriptで
var c=1;alert(c=c+(c*=10)+(c*=100));
は1011
Perlで
my $c=1;print($c=$c+($c*=10)+($c*=100));
は1020
になります。
そこで、この問題について載っているサイトがあれば教えてください。
0256nobodyさん2008/03/28(金) 20:04:35ID:???
式の途中で値を変えるやり方がまずいとは思うけどね
0257nobodyさん2008/03/28(金) 23:58:05ID:???
加算の評価順は定義されてないという事を知らずに
> var c=1;alert(c=c+(c*=10)+(c*=100));
こう書くのはクズグラマー。
0258nobodyさん2008/03/29(土) 03:54:49ID:???
>>255
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
0259nobodyさん2008/03/29(土) 04:33:29ID:???
>>253
年を二桁にしたら100年後に困るぞ!
0260nobodyさん2008/03/29(土) 08:45:59ID:???
>>253
s/^\d\d//;
s/^(\d\d\/)0/$1/;
s/金/Fri/;
s/:\d\d$//;
0261nobodyさん2008/03/29(土) 14:59:25ID:???
>>259
19xxから20xxに変わったが、2桁で困ってないので100年後も同様に困らない。
0262nobodyさん2008/03/29(土) 17:09:47ID:???
>>259
百年後なんて俺等死んでるから気にする必要ないw
0263nobodyさん2008/03/29(土) 17:56:41ID:???
そういう屑のせいで困る人たちもいるわけだ
0264nobodyさん2008/03/29(土) 19:27:22ID:???
>>262
医学の進歩は目覚しいから、お前のような底辺奴隷はむしろ死ねないかもしれない。
02652592008/03/30(日) 22:02:27ID:???
ジョークを真に受ける馬鹿がこんなに多いとは・・・
0266nobodyさん2008/03/30(日) 23:27:37ID:???
>>265
更にジョークを真に受けた馬鹿の登場ですか?
0267nobodyさん2008/03/30(日) 23:58:51ID:???
>>266
言っとくけど俺をあまりナメないほうがいいよ
vipでコテハンやってるしこのスレ潰すくらいの影響力は持ってるから
くだらないことで刺激して後悔しないようにね
0268nobodyさん2008/03/31(月) 01:08:05ID:???
>>267
そのコピペには、もう飽きた\(^o^)/
02692592008/03/31(月) 07:25:32ID:???
>>266
後出しジャソケソカコワルイ
0270nobodyさん2008/03/31(月) 10:11:33ID:???
どっちが後出しだよw
0271nobodyさん2008/03/31(月) 12:02:54ID:???
中出しの方が気持ちいいぞ。
0272nobodyさん2008/04/01(火) 21:14:09ID:???
HTML::Templateっていうモジュールを使おうとしたら
鯖管理してる人が入れたくないです。っていうので
HTML::Templateの代わりになるような標準モジュールって何かありますかね?
個人的にはHTML::Templateの<TMPL_IF>みたいなのが使えれば大満足なんだけども

自分で作っちゃったほうが早いかな?
0273nobodyさん2008/04/02(水) 01:00:40ID:???
普通にディレクトリでも作って放り込んで、useで使うのは駄目なん?
0274nobodyさん2008/04/02(水) 10:50:31ID:???
HTML::TemplateはPurePerlだからディレクトリ作ってほうりこめばおk
0275nobodyさん2008/04/02(水) 14:04:47ID:???
昨日からperlに興味持っています
perlには大きくわけて2つあると聞きました

1:恐らくActivePerlの為に書かれたであろうソースをcygwinで動かしたい
(書いた方はどちらのperlと言うこともなく消えちゃいました。他の方が「それperlだよ」と教えてくれました)

2:1行目に書かれていた 「 #!/perl/bin/perl 」 を 「 #!/cygwin/bin/perl 」 に書き換えた
  2行目にあった 「 # /usr/bin/perl はないはず 」 を削除した
 読み込ませるファイルをcgi-binフォルダーに置いた

3: Internet Explorer ではこのページは表示できません

cygwinとActiveperlは書き換える箇所があるのですか?
基本は同じと聞いたのですが細かく言うと変更すべきところもあるんでしょうか?

どなたかよろしくお願い致します
0276nobodyさん2008/04/02(水) 14:28:33ID:???
>>275
>perlには大きくわけて2つある
ファイルを置けば動くPurePerlと、installが必要なバイナリの2種類かな?

>恐らくActivePerlの為に書かれたであろうソースをcygwinで
プログラムファイル自体にその差は無い
よって
>cygwinとActiveperlは書き換える箇所があるのですか?
書き換える箇所は無い
ただしActivePerlでは動かないものもあるかもしれない

cygwinはUNIXエミュレータ(みたいなもの)
ActivePerlはWindows版のPerlインタプリタ
同列に並べるのはおかしい

> Internet Explorer ではこのページは表示できません
このエラーが出るってことはおそらくパーミッション
0277nobodyさん2008/04/02(水) 15:21:24ID:???
>>275
書いた人です。「それは Perl だ」と言ったのも自分。

あれはCGIではなくてCLIスクリプト(=コンソールアプリ)なので、
Perl実行環境さえあればWebサーバだの何だのは要りません。
# 「標準出力に何も吐かない」ブツはCGIではない。

あなたのしたいことは、Web制作板ともWebProg板とも関係のないことです。

ブツ自体はActivePerl だろうが cygwin 上の Perl だろうが動きます。
プロンプトから perl hoge.pl するだけ。以上。

ただ、glob() に2万ファイル食わせるのはやめといたほうがいいと思うな。
0278nobodyさん2008/04/02(水) 15:33:03ID:???
直接やれwww
0279nobodyさん2008/04/02(水) 15:40:45ID:???
元ネタはここか
http://pc11.2ch.net/test/read.cgi/hp/1205922529/100

ほんとか?
0280nobodyさん2008/04/02(水) 15:52:10ID:???
>>275です
>>276
詳しくありがとうございます
勉強になります

>>277
手取り足取りスレでお世話になりました
>>277さんのお陰で目標までの道が見えたような気がします
本当に感謝しております
HTMLとTXTそれぞれ3枚づつ置いてテストしてみようとしたのですが
上記の通り読み込めませんでした
hello.plで試したところ読み込みはできているようなので
書き込み用のファイルを用意しておくべきなのかわからないです
サーバなしで動くのでしたか私はサーバを通して操作するものかと勘違いしてましたすいません
perlでできると教えてくれて本当にありがとうございます

板違いになるのかーショボーン
どこに行けばいいのか・・・
みなさんありがとうございました
02812772008/04/02(水) 16:00:03ID:???
スレ汚しまくりで、本当にごめんなさい。 > all
とりあえず、物凄い勢いで板違い。>>275さんには、教えてgoo辺りがお勧め。
当分消えよう。

>>278
間接でも偏頭痛がしたので勘弁してください。
放置するとめんどくさい流れになりそうだったので出てきました。すみません。

>>279
そこで正解です…。
0282nobodyさん2008/04/02(水) 17:09:09ID:???
winならActivePerlでいいやん。
0283nobodyさん2008/04/02(水) 21:09:16ID:???
おまえらstrawberryperl知らんのか
0284nobodyさん2008/04/03(木) 00:13:59ID:???
知らないかダメダメだから話題に出ない
それぐらい察してくれるとありがたい
0285nobodyさん2008/04/03(木) 03:38:43ID:x8vlzbgB
colinuxでいいじゃん
0286nobodyさん2008/04/03(木) 10:28:20ID:???
いろいろ出すと混乱しちゃうぉw
0287nobodyさん2008/04/03(木) 13:05:14ID:???
colinuxとクリネックスて似てるね
0288nobodyさん2008/04/03(木) 14:21:42ID:???
初心者ならActivePerl、中級者以降ならStrawberry Perlだな。
0289nobodyさん2008/04/03(木) 16:36:19ID:???
超上級者ですが ActivePerl 使ってます
0290nobodyさん2008/04/03(木) 18:06:58ID:???
perl開発者ですがperl使ってません
0291nobodyさん2008/04/03(木) 19:03:25ID:???
自分はStrawberryPerlが有り難すぎるのだけど、前はActivePerl使ってた。
StrawberryPerlと比べてActivePerlはどういうメリットがあるのかな。
PPMが便利なこともあるけど、CPANが使いやすいStrawberryPerlの方が自分は便利。
ActivePerlの方を推す方の意見を聞きたいです。
0292nobodyさん2008/04/03(木) 19:56:47ID:???
ActivePerl に一致する日本語のページ 約 560,000 件中 1 - 50 件目 (0.04 秒)
Strawberry Perl に一致する日本語のページ 約 13,000 件中 1 - 50 件目 (0.37 秒)

ActivePerl入れっぱなしだから特に探さなかった
0293nobodyさん2008/04/03(木) 20:05:15ID:???
じゃ、今のActivePerl使ってみな。
0294nobodyさん2008/04/03(木) 20:05:58ID:???
>>293 → >>291
0295nobodyさん2008/04/03(木) 22:08:39ID:???
おーこんなんあったのか
存在すらしらなかった
0296nobodyさん2008/04/03(木) 22:33:14ID:???
ActivePerlにはppmがあるし、最近は日本人がやってるppmリポジトリ(tcool)があるから
何かあっても日本語で済ませられるからなぁ。あそこだとCatalyst+DBIC+TT2もJiftyもPlaggerもそろってるし。
0297nobodyさん2008/04/04(金) 04:20:23ID:???
winでweb開発するならvmwareとかcolinuxとかいれるだろ情交
0298nobodyさん2008/04/04(金) 10:07:57ID:???
>>297
たしかにそれはもっともなんだが、クライアントの要望でWinで動かなきゃだめ、ってのでも
対応できて助かる。ほんと。
0299nobodyさん2008/04/04(金) 14:10:52ID:???
vmwareとかcolinuxって何に必要なんだ?
特殊なことをするのでなければ、cronとSpeedyCGIぐらいしか思いつかない。
0300nobodyさん2008/04/04(金) 16:49:23ID:???
サーバ機のOSにwin使うの?それならば何も言わんけど
0301nobodyさん2008/04/04(金) 17:29:46ID:???
話がどんどんズレてるぞおまいら。
0302nobodyさん2008/04/05(土) 00:28:43ID:???
PerlからDBI::ODBCでMS Accessに接続しようと思います。
SQLに日本語が混じっているときSJISだとうまくいくのですが
UTF8だと文字化けしてエラーになってしまいます。
Unicodeでも文字化けしない方法はないでしょうか?
0303nobodyさん2008/04/05(土) 03:41:48ID:???
DB 側に文字コードを指定できたはず
0304nobodyさん2008/04/07(月) 18:30:35ID:/Zogy0zf
もの凄く抽象的な質問ですがご容赦ください。


現在、mod_perl下で動いているプログラムがあります。
必要があり、これを修正してみたところ、何が悪かったのかそのままサーバダウン。

サーバダウン直前の挙動、エラーメッセージ、mod_perlの特性などから検証した結果、
プログラムの必要メモリ量が極端に増え、それに伴いメモリ不足で落ちたのではないかという結論に至りました。


さて、ここからが質問なんですが、
mod_perlのプログラムを書くにあたり、メモリ使用量などに関して、
コーディングのコツ、書くときの注意、メモリ使用量を見る方法などがありましたら教えてください。

参考になるサイトや書籍などでも構いません。
英語でも頑張って読んでみようとは思いますが、理解できるかどうかは甚だ怪しいです。
0305nobodyさん2008/04/07(月) 19:21:31ID:???
プロを雇いなさい。
0306nobodyさん2008/04/07(月) 19:50:42ID:???
修正前は全く問題なかったのなら修正部分見るだけで簡単に解かるから楽ジャン
0307nobodyさん2008/04/07(月) 21:42:21ID:TcHrwP/2
元に戻す
0308nobodyさん2008/04/07(月) 23:10:26ID:???
svn revert -R
0309nobodyさん2008/04/07(月) 23:27:22ID:???
ちゃんと初期化、解放したったらえーんとちゃうのん?
0310nobodyさん2008/04/08(火) 03:52:16ID:???
一定回数の呼び出しでリブートするしかなかったっけか。
0311nobodyさん2008/04/08(火) 06:53:24ID:O35wAre8
あるオブジェクトが属するクラス名(パッケージ名)はどこに入っているのでしょうか。
特定のオブジェクトを外部から判定したいとしたときなど、
文字列(ClassName=HASHxxxなど)を見て判断できるとも思いますが、
文字列変換が値の出力にオーバーライドされていたりするとダメですし・・

例えば、あるサブルーチンの引数をClassNameオブジェクトに限る、といったときに判定したいのです。
よろしくお願いします。
03123112008/04/08(火) 07:27:45ID:???
すみません見つかりました。判定に関しては
if ($obj->isa('ClassName')) {・・・}
この辺から探っていけそうでしたので、311の質問は一旦取り下げますm(_ _)m
0313nobodyさん2008/04/08(火) 09:05:59ID:???
>309
してます。
今回の場合に限りますが、解放されてないリソースが溜まり続けると言うより、1回の必要量が大きすぎた模様。

>305
いや、そんなこと言われても。

>306-309
質問文は後半だ。
0314nobodyさん2008/04/08(火) 09:13:08ID:???
>>313
>>1
【激速】mod_perl SpeedyCGI FastCGI【激速】
http://pc11.2ch.net/test/read.cgi/php/1149505269/
0315nobodyさん2008/04/08(火) 12:45:16ID:???
>>304
mod_perlかcgiかに関係なく
strictを付ける
サイズの予想できないデータは一括取り込みしない
ってのは当たり前だと思うんだが・・・

mod_perlで問題になりそうなのは
循環参照と意図しないクロージャくらいかな?

0316nobodyさん2008/04/08(火) 18:50:34ID:???
>314
ありがとうございます。
宗教戦争が勃発してる魔境にしか見えないのが辛いところですが。

>315
ちょっとだけ内部の挙動を変えたらメモリ容量が4倍に膨れ上がってしまいまして…。



こういうのを、topコマンドでリアルタイムに監視する以外の方法があれば教えてください。
0317nobodyさん2008/04/08(火) 19:19:20ID:???
4倍で落ちるってどんだけだよ
0318nobodyさん2008/04/08(火) 19:20:40ID:???
Devel::Sizeでどの変数がメモリ食ってるか調べてみれば?
0319nobodyさん2008/04/08(火) 19:26:09ID:???
http://search.cpan.org/perldoc?Devel::Size
http://perl.apache.org/docs/1.0/guide/performance.html#Measuring_the_Memory_of_the_Process

参考リンク
0320nobodyさん2008/04/08(火) 20:31:28ID:???
>317
単純計算ですが、総計にしてメモリ1GBほど増加です。

>318
ありがとうございます

>319
ちょうど英語にひぃひぃ言いながら読んでたところです。
0321nobodyさん2008/04/08(火) 20:55:45ID:???
メモリ量が4倍になったならMaxClientsを1/4にすりゃいいじゃん。


とりあえずこのへんも参考にするといい
http://iandeth.dyndns.org/mt/ian/archives/000624.html
http://www.typemiss.net/blog/kounoike/20060212-64
■ このスレッドは過去ログ倉庫に格納されています