トップページ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/
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をリポジトリに追加で行けると思う。
追加方法については、ぐぐってくれ。
0762nobodyさん2007/08/17(金) 12:05:57ID:kNB1PTWd
すごく初心者な質問で申し訳ないです

http://aaa.com/
というURLに
http://aaa.com/aaa/aaa.cgi
とくっ付けたいのです。

$url ="http://aaa.com/";;
$url = $url."aaa/aaa.cgi";

とやっても
2行に表示されてしまいます。
http://aaa.com/
aaa/aaa.cgi
こんな感じになってどうすればいいのやら・・・
0763nobodyさん2007/08/17(金) 12:17:14ID:???
>>762
$url ="http://aaa.com/";;
の一番最後に改行コードが混じってないか調べる。
0764nobodyさん2007/08/17(金) 12:22:20ID:???
>>763
改行コードが混じっていました。
ありがとうございました。
0765nobodyさん2007/08/17(金) 19:23:59ID:5ZhoqBhg
KDDIのサーバを使っているのですが、インストール済みのモジュールしか使えないと書いてありました。
ピュアパールのモジュールを使いたいのですがどのようにしたら良いでしょうか?
07667652007/08/17(金) 19:30:54ID:???
すみません、インストール済みのモジュールしか使えないと言うより、useが使えません。
0767nobodyさん2007/08/17(金) 19:43:10ID:???
pure perl なら
use lib qw(./path);


そんなの糞環境にしかならないですし use が使えないわけ無いのでは?
0768nobodyさん2007/08/17(金) 20:07:18ID:???
useって書いてあるところに差し掛かった瞬間、エラーで終了する
って設定のサーバーが結構あるよ。
0769nobodyさん2007/08/17(金) 20:44:42ID:???
useはコンパイル時に解釈されるから差し掛かった瞬間にエラーで終了というのは・・

Perlインストール時にuse使えないようにコンパイルした可能性がないとも言えない
0770nobodyさん2007/08/17(金) 20:51:26ID:???
コンパイル時にどういうオプションつけたらそうなるの?
0771nobodyさん2007/08/17(金) 22:20:54ID:???
use使えないのは不便極まりないな。
0772nobodyさん2007/08/18(土) 00:34:04ID:???
Bフレッツひけばすべて解決だろ。
0773nobodyさん2007/08/18(土) 12:44:15ID:???
そこそこの来訪数を期待してる鯖を開けるプロバイダってどのぐらいあるんだ?
0774nobodyさん2007/08/18(土) 12:47:38ID:???
というか、ここの住人が使ってる鯖ってどれくらい?○つけてよ。

・専鯖、ハウジング系 
・自宅鯖(Windows系) 
・自宅鯖(UNIX系) 
・レンタル鯖(月5000円以上) 
・レンタル鯖(月1000円以上) ○
・レンタル鯖(月500円以上) 
・レンタル鯖(月500円未満) 
・無料のレンタル鯖 
・プロバイダーの無料スペース 
0775nobodyさん2007/08/18(土) 12:53:27ID:???
友達のところに間借り
0776nobodyさん2007/08/18(土) 14:09:22ID:???
プロックスの何とかアドバンスってやつ
サーバー管理は出来ない知り合いに管理するの約束でただで使わせてもらってる
知り合いはつてで小さい会社のホームページ(静的なページのみ)とメール預かって金作ってるみたい
0777nobodyさん2007/08/18(土) 17:19:19ID:???
・専鯖、ハウジング系 
・レンタル鯖(月1000円以上)

この2つかなー。片方は仕事だが。
0778nobodyさん2007/08/19(日) 15:53:31ID:t6VsRWnY
ソースがutf8で出力がshiftjisの掲示板作ってるんですが、
@ABCD等の数字を対応出来なくて困ってます。

utf8のままで解決出来るんでしょうか?
0779nobodyさん2007/08/19(日) 16:42:09ID:???
Shift JISには@なんて文字はありません
0780nobodyさん2007/08/19(日) 17:04:05ID:pOFLTECe
しばらくPerlってなかったので質問なんですが
今でもフォームからの受け取りは CGI.pm 等がデファクトスタンダードでしょうか?
cgi-lib.pl とか古い知識しかないので、CPANなどで最新の方法など御教示ください。
0781nobodyさん2007/08/19(日) 17:44:44ID:???
Catalyst でも使うといいよ。
0782nobodyさん2007/08/19(日) 19:03:51ID:???
>>778
Windowsの文字コードを使うならcp932へ変換する必要がある。
0783nobodyさん2007/08/20(月) 01:16:07ID:???
>>781
catalystって今後生き延びそうですか?
0784nobodyさん2007/08/20(月) 03:04:12ID:???
>>783
Perlハカーをヲチしてください
0785nobodyさん2007/08/20(月) 11:49:55ID:O2ADjgGz
しょぼい質問ですがお願いします・・・
Search::Namazuを使用して得たNamazuの検索結果(オブジェクトの配列)をダンプしました。
ですが、このダンプしたデータの呼び戻し方がどうしてもわからないです・・。
検索結果(@result)内のデータは例えば以下のとおりです。
$VAR1 = bless( { 'name' => 'hoge', 'score' => '82' }, 'Search::Namazu::Result' );
$VAR2 = ・・・

次のようにすると上記したような文字列としては読み込めますが、できたのはそこまで。
for (@result) { print $_, "\n"; } # => $VAR1 = ・・・

ダンプせず直接書き出す場合は$_->nameでhogeが出力されるんですが・・・
07867852007/08/20(月) 11:52:52ID:O2ADjgGz
※訂正※真ん中の段
×文字列としては読み込めますが
○文字列としては書き出せますが
07877652007/08/20(月) 18:34:36ID:U/5QePTj
>>767-768
ありがとうございます。また、すみません。
useが使えないというのは勘違いで、@INCに何も入っていないだけでした;

けれど、BEGIN { unshift(@INC, 'hogehoge'); }してもコンパイル時の
モジュール見つかりませんエラーに表示される
@INCの中にはhogehogeは入りませんでした。
スクリプトの中で@INCを(printなどして)参照すると確かにhogehogeは@INCに入っているのですが。。
どうにかしてモジュールを使う方法は無いでしょうか?
07887852007/08/21(火) 10:37:32ID:???
>>787
案外ちょっとしたコーディングのミスだったりしない?
例えばModule名と中のPackage名が違ってて、use Package名にしてるとか・・・

あとは指定したパスが地味に間違ってるとか。
use FindBin qw($Bin);
use lib "$Bin";
とすると@INCの先頭にカレントディレクトリのパスが入るから確認してみては。
例えばuse lib "$Bin/../hogehoge"とすると、相対パスでひとつ上にあるhogehogeが指定される。

>>785で質問させてもらったんですが、解決しました。
Storableでファイルへの保存、呼び出しをしてたのですが、
表示する際にData::Dumperで整形してたのです。(バカな話だけど)
それで当然、もとのオブジェクトとしては扱えなくて。
Storableで戻した配列に対してそのままアクセスしたら復元できましたm(_ _)m

ファイルから呼び出したオブジェクトの配列リファレンス($result)に対して
for my $i (0..$#{$$result}) { printf "%s : %s\n", $$result[$i]->name, $$result[$i]->score; }
みたいな感じで。
というか質問自体がわかりにくかったですね。スマソ
0789nobodyさん2007/08/22(水) 02:37:38ID:pj3xRAc/
次のページにrefreshを使わずに瞬時にリンクしたいのですが
どうすればいいのでしょうか?
0790nobodyさん2007/08/22(水) 02:39:50ID:???
>>789
何故ここで聞く…スレ違いじゃね?
CGIならLocationでおk
07917892007/08/22(水) 02:44:24ID:???
質問の内容が漠然としてるみたいなので変えます
次のページに瞬時でリンクした時、次のページに
データを渡したいのですがどうすればいいのでしょうか。
07927892007/08/22(水) 02:45:28ID:???
>>790
即レスありがとうございます
Locationを検索してみます
0793nobodyさん2007/08/22(水) 10:48:13ID:???
リンクしなきゃいいんじゃね?
0794nobodyさん2007/08/22(水) 10:50:22ID:???
二行目を詳しく
0795nobodyさん2007/08/22(水) 12:11:37ID:???
>>794
まさかLocationがわからないとか…ないよな?
0796nobodyさん2007/08/22(水) 12:16:22ID:???
>>795
>>791の2行目の事じゃね?

>>791
「次のページ」が2つ出てきているが、それらは何なのか。またリンク元から見てどこに位置するのか。
「瞬時でリンク」とは何か。
これがわからないと答えようが無い。
07977892007/08/22(水) 12:19:59ID:???
自分が探してたのLocationみたいだったので解決しました
レスありがとうございました
0798nobodyさん2007/08/22(水) 22:14:48ID:sWD+Yq++
ユニコードだとlength($x)で日本語も一文字扱いになるけど、
日本語のバイト数拾うのはどうすると良い?
0799nobodyさん2007/08/22(水) 23:19:26ID:???
どの文字コードにするかでバイト数は異なるから、
お望みのコードにencodeしてlengthとるのが正攻法。

perlの内部表現(utf8)のバイト数でよければbytes::length
0800nobodyさん2007/08/23(木) 00:35:43ID:???
>731
0801nobodyさん2007/08/23(木) 07:54:48ID:uXF+dyLC
>>799
なるほど。ありがとうございました。
0802nobodyさん2007/08/23(木) 18:57:09ID:uXF+dyLC
>>800
うほ!
0803nobodyさん2007/08/24(金) 18:26:53ID:rvbxrzrr
質問させてください
移動平均原価法で原価計算をしたいと思ってます
@COST=(
'2000','3','6000',
'3000','4','12000',
'1000','5','5000',
'4000','3','12000'
);
左から単価、個数、合計という@COSTの配列を作りました
ここからがわかりません。。foreachでまわしてはみたものの、
最初は2行で区切り計算をしてその結果を次の行と計算・・・という流れが作れません
どなたかヒントくださいますでしょうかm(_ _)m
0804nobodyさん2007/08/24(金) 18:34:52ID:???
>>803
移動平均原価法じゃ何も分からん。スレ違い。
せめてもっとソースを示して、こうやりたいと書くべき。
0805nobodyさん2007/08/24(金) 18:47:18ID:???
すみません、ソースを晒したいのは山々なのですがforeach内が全てわからなく、、。
上の例から行くと
1| (6000+12000)/7=2572
2| 2572*7=18004
3| 1000*5=5000
4| (18004+5000)/12=1917
5| 1917*12=23004
6| 4000*3=12000
7| (23004+12000)/15=2334
という順番に計算していき結果的に2334と出したい状況です。
0806nobodyさん2007/08/24(金) 19:04:13ID:???
汎用的に書いて
0807nobodyさん2007/08/24(金) 19:09:19ID:???
> 移動平均原価法じゃ何も分からん。スレ違い。
> せめてもっとソースを示して、こうやりたいと書くべき。

坊やはつまんないKENT CGIでも改造してオレすごいぜーとか思いつつ引きこもっておけばいいじゃん。www
人様に迷惑かけんなよ。wwww
0808nobodyさん2007/08/24(金) 19:18:28ID:???
よくわからん計算法だな。全部足して割り算したほうが

(2000*3+3000*4+1000*5+4000*3)/(3+4+5+3)

わかりやすいような気がするのだが。

各ステップで小数点以下を丸めてわざと誤差を余計に
蓄積させるのが肝??
0809nobodyさん2007/08/24(金) 19:20:09ID:???
#!/usr/bin/perl
use strict;

my @COST = (
['2000','3','6000'],
['3000','4','12000'],
['1000','5','5000'],
['4000','3','12000'],
);

use Data::Dumper;
my ($avarage_cost, $total_pieces, $total_price);
for my $param (@COST) {
my ($unit_cost, $pieces, $price) = @$param;
$total_pieces += $pieces;
$total_price += $price;
$avarage_cost = $total_price / $total_pieces;
print "$avarage_cost\n";
}
0810nobodyさん2007/08/24(金) 19:20:53ID:???
>>808
移動平均法と簿記知らない人は黙っててください。
0811nobodyさん2007/08/24(金) 19:26:14ID:???
#!/usr/bin/perl
use strict;
use POSIX;

my @COST = (
['2000','3','6000'],
['3000','4','12000'],
['1000','5','5000'],
['4000','3','12000'],
);

my ($avarage_cost, $total_pieces, $total_price);
for my $param (@COST) {
 my ($unit_cost, $pieces, $price) = @$param;
 $total_pieces += $pieces;
 $total_price += $price;
 $avarage_cost = $total_price / $total_pieces;
 $avarage_cost = ceil($avarage_cost);
 $total_price = $total_pieces * $avarage_cost;
 print "$avarage_cost\n";
}
0812nobodyさん2007/08/24(金) 19:35:19ID:???
Moving Average Method perl pm
でぐぐれ
0813nobodyさん2007/08/24(金) 19:38:00ID:???
>>812
どのページ?
0814nobodyさん2007/08/24(金) 19:44:36ID:???
それは探せよwww
0815nobodyさん2007/08/24(金) 19:52:53ID:???
それって、結局何も示してないのと同じだよね。
0816nobodyさん2007/08/24(金) 20:47:14ID:???
質問者回答者共々に
馬鹿なのは珍しいな
見物させて貰うよ
0817nobodyさん2007/08/24(金) 20:50:44ID:???
> 質問者回答者共々に
> 馬鹿なのは珍しいな
> 見物させて貰うよ

馬鹿であると認識しつつ見物するというのは何らかの精神障害でもお持ちですか?
0818nobodyさん2007/08/24(金) 21:55:07ID:???
簿記も移動平均法もよく分からんが書いて見る。

use POSIX qw(ceil);

my @cost = ([2000,3],[3000,4],[1000,5],[4000,3]);

my ($avg, $num) = @{$cost[0]};
foreach(1..$#cost){
$avg = ceil(($avg*$num+$cost[$_]->[0]*$cost[$_]->[1])/($num+$cost[$_]->[1]));
$num += $cost[$_]->[1];
}
print $avg, "\n";
0819nobodyさん2007/08/24(金) 22:07:07ID:???
動物園で猿を眺める感覚なんじゃない?
0820nobodyさん2007/08/25(土) 00:34:26ID:???
どうして猿?
0821nobodyさん2007/08/25(土) 10:30:06ID:???
>>809 >>811 >>818
ヒントというかコピペで使える答えを有難う御座います!!
全て試しましたところ3つとも希望通りの動きをしてくれました。
すごくわかりやすくて綺麗なソースです。感謝です
0822nobodyさん2007/08/26(日) 13:21:03ID:???
$obj = new Pkg();

はエラーになるけれど、

$obj = Pkg->new();

または

$obj = Pkg::new('Pkg');

はエラーにならない原因は何が考えられるでしょうか。
0823nobodyさん2007/08/26(日) 14:14:37ID:???
カレントパッケージにnewやPkgというサブルーチンがある場合いくない時がある

package main;
sub new { print "main::new\n" }

Pkg->new();
new Pkg();

package Pkg;
sub new { print "Pkg::new\n" }
08248222007/08/26(日) 16:43:34ID:???
>>823
ビンゴでした!
ほんとありがとうございます!
0825nobodyさん2007/08/27(月) 01:16:35ID:/FKQmVjf
一般的な質問になりますが、
掲示板をPerlで作るとき、データは皆さんどのようにして保存しますか?

私が考えたのは

・連番テキストファイル
・連番XMLファイル
・一つのXMLファイル

ぐらいですが、他にもいい方法などありますか?
0826nobodyさん2007/08/27(月) 01:17:26ID:???
db
0827nobodyさん2007/08/27(月) 01:35:16ID:???
DB
0828nobodyさん2007/08/27(月) 01:43:22ID:/FKQmVjf
あ、スミマセン。
外部からも、元データを簡単に参照できるようにしたいので、SQLなどは除外して考えています
0829nobodyさん2007/08/27(月) 01:51:46ID:???
データベース
0830nobodyさん2007/08/27(月) 01:57:04ID:???
db
0831nobodyさん2007/08/27(月) 01:57:55ID:???
db
外部からの参照時は1枚被せる
0832nobodyさん2007/08/27(月) 02:10:27ID:/FKQmVjf
やっぱり、データベースが良いですか
では、これを機にSQlite+Perlでも勉強してみます
0833nobodyさん2007/08/27(月) 03:13:28ID:???
別に無理して RDBMS 使わなくてもいいんじゃない?
どうせいっぱいいっぱいになって途中で投げ出すよw
0834nobodyさん2007/08/27(月) 07:19:52ID:???
テキスト保存だろうが何だろうが、DBを名乗っても別に問題は……。

まあ、冗談は別として。
なんで連番ファイルにしようと思ったん?
0835nobodyさん2007/08/27(月) 12:21:06ID:???
フォームからCSVファイルのPOSTで、処理の機能ごとにsubでまとめ、
DB入力だけ別鯖へ投げようと思ってます。
(そのDB鯖は外部からのDB接続は許可してない)

それでLWP::UserAgentで外部鯖へPOSTさせた場合の動作で、
CSVが100行あった場合、ループ内で100回のPOSTになりますが
その時に外部鯖の処理速度もループに影響しますよね?
0836nobodyさん2007/08/27(月) 12:25:46ID:???
ファイルごと投げないのは何故?
0837nobodyさん2007/08/27(月) 12:54:31ID:???
ファイルをアップロードしてそのままインポートさせりゃいいのでは?
08388352007/08/27(月) 12:57:01ID:???
DB鯖はFTPアカウント貰えないのですよ・・・

ループ内に処理は書いてなく、LWP::UserAgentでPOSTしてるだけですが、
結局DB鯖での処理が終わってreturn受けてから次のループ というフローでOKでしょうか?
0839nobodyさん2007/08/27(月) 13:31:30ID:???
そう思うならそうしろよ
フォームでどうやって投げてると思ってんだろうね
0840nobodyさん2007/08/27(月) 13:50:36ID:/hovVpUg
外部のHTMLソースを表示するってことperlで可能でしょうか?
0841nobodyさん2007/08/27(月) 13:51:18ID:???
LWP
0842nobodyさん2007/08/27(月) 14:09:38ID:???
そんな糞スクリプトでやるんじゃなくて、ふつーに外注すればいいのに。
0843nobodyさん2007/08/27(月) 14:23:42ID:???
>>838
HTTPでファイルをアップロードすれば?
08448352007/08/27(月) 15:03:22ID:???
いくつもレス頂きありがとうございます。

ただDB鯖の方は全く操作できない(させてもらえない)環境なので、
CSV処理のCGIを1つかまして、そこから個別に1件ずつPOSTするフローにしました。

こういった場合、何かこうしろみたいな方法はありましたら御教示よろしくお願いします。
※外部DB鯖の管理元に解決のお願いをするのは無しの方向でw
0845nobodyさん2007/08/27(月) 15:23:24ID:???
全部いっぺんに送ればよくない?
08468352007/08/27(月) 15:55:05ID:???
>>845
未熟すぎで申し訳ないです。全部いっぺんにというのはLWP::UserAgentの処理方法でしょうか?
それとも全く別の方法でしょうか?今現在はこういった感じになってます。

# リクエスト生成
my $url = 'http://example.com/index.cgi';
my %formdata = ('Name'=>$Name[0], 'Age'=>$Age[0]);
my $request = POST($url, [%formdata]);
# UserAgent生成処理
my $ua = LWP::UserAgent->new;
my $res = $ua->request($request);
print $res->as_string;
0847nobodyさん2007/08/27(月) 16:00:44ID:???
フォームからCSVアップロードしてるのにそれをなぜ1行ずつ転送するんだ
0848ミューズイングリッシュ2007/08/27(月) 16:21:52ID:???
みなさんこんにちは
小さな英会話教室をしていて、ホームページを作っています。
そこでスケジュールカレンダーをphpで、できるとのことだったので、
友人からもらったプログラムをリンクさせましたが、
ログインすると、
Parse error: parse error, unexpected T_STRING in /www/a-mail/muse-eng.jp/public_html/schedule/Calendar.class.php on line 85

と、このようにでます。
ド素人なのでプログラムの書き換えもわかりません。
デザインは出来ていています。
phpプログラムを見て適正に修正して頂ける方探しています。
もちろん謝礼贈呈します。予算がないので10,000円で考えていますが、
お力添えいただける方、宜しくお願いいたします。
対象のホームページ www.muse-eng.jp
ご連絡先メールアドレス aimaniajp@yahoo.co.jp
宜しくお願いいたします。
0849nobodyさん2007/08/27(月) 16:52:11ID:???
ここに田代しろっていうフリだよね?
08508402007/08/27(月) 16:55:57ID:/hovVpUg
LWP::UserAgent;
use HTTP::Request::Common qw(POST);

my $url = 'http://yyyyyy';
my %formdata = ('uuu' => 'uuuuuuuu', 'iiiii' => 'iiiiiii');
my $request = POST($url, [%formdata]);

my $ua = LWP::UserAgent->new;
my $res = $ua->request($request);
print $res->as_string;

my $ua = LWP::UserAgent->new;の記述でscriptエラーでるのですが
これはサーバーの不備でしょうか?
0851nobodyさん2007/08/27(月) 17:02:57ID:???
>>835
もしかして、そのDB鯖って、インターフェイスがフォームしかない(笑)とか?
08528352007/08/27(月) 17:21:20ID:???
>>851
通常の入力フォームはありますが、1件ずつが大変だしデータフォーマットを合わせるために、
CSVのデータからCGIで各値の変換(英数字を半角など)をしてからPOSTする予定です。
0853nobodyさん2007/08/27(月) 17:32:31ID:???
こういうのを社畜って言うのか。
上から言われたら反抗もせずに無駄な労力を費やすと。www
0854nobodyさん2007/08/27(月) 17:35:01ID:???
なんで一々POSTでおくらなきゃいけないのかと
普通にDBに接続しろってw
■ このスレッドは過去ログ倉庫に格納されています