トップページ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/
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
0855nobodyさん2007/08/27(月) 17:35:48ID:???
>>850
use してなければいろいろエラーは出ると思う。
08568402007/08/27(月) 18:50:06ID:/hovVpUg
エラーは出なくなりましたが
目的の外部HTMLはいろいろ処理(タイトルが変化や色が変わる)していて
表示処理が完全に終わったソースを
perl側から見ることはできないでしょうか?
0857nobodyさん2007/08/27(月) 18:51:22ID:???
もう少しHTMLの勉強をした方がいいと思うな、うん
0858nobodyさん2007/08/27(月) 20:37:22ID:???
背伸びする必要ないと思うなぁ。うん。
それにしても、未だに CGI なんか作ってる人たちっているのかぁ。
0859nobodyさん2007/08/27(月) 21:09:29ID:???
単体なら需要あるしね
0860nobodyさん2007/08/27(月) 22:15:58ID:???
それどんなひねくれた需要?
0861nobodyさん2007/08/27(月) 22:56:41ID:???
本当にわからないならただの無知だな
あとスレ違いだからこの辺にしとこうぜ
0862nobodyさん2007/08/28(火) 03:36:17ID:???
> 本当にわからないならただの無知だな
> あとスレ違いだからこの辺にしとこうぜ

答えれなくなるとそうやって逃げるんだよな。www
0863nobodyさん2007/08/28(火) 08:26:21ID:???
webprog板の55まであるcgi(&初心者)スレで858みたいな事書くのが
信じられん、、、
0864nobodyさん2007/08/28(火) 11:02:31ID:???
Web2.0(笑)
0865nobodyさん2007/08/28(火) 11:45:37ID:???
>>856
もしかしてPOSTじゃなくGETしたいんじゃないの?
0866nobodyさん2007/08/28(火) 12:13:31ID:???
(; ^ω^)・・・?
0867nobodyさん2007/08/28(火) 13:59:00ID:???
うおっ! このスレレベル高っ!
0868nobodyさん2007/08/28(火) 17:03:57ID:???
perlコーディングに関する質問が来ない罠。
0869nobodyさん2007/08/29(水) 01:05:13ID:???
Perlでさ、ブラウザからサーバーのファイルを管理できるソフトを作ってる途中なんだけど、こんなCGI作ってる人って他にもいるかな?
0870nobodyさん2007/08/29(水) 01:11:29ID:???
いますね。そういうのは既にあります
0871nobodyさん2007/08/29(水) 06:39:40ID:XYYl0jHZ
質問です。

コマンドプロンプトからActivePerlを使っていますが、
perldoc Jcode::Nihongo
とした時に文字化けします。
どうしたら正常に表示されますか?

それから、CygwinからもPerlを使ってますが、
$ perldoc
Segmentation fault (core dumped)
$ perl -V
Segmentation fault (core dumped)
$ cpan
Segmentation fault (core dumped)

といった表示が多発しています。
これはどうしたら直りますか?

0872nobodyさん2007/08/29(水) 10:44:32ID:???
perlコーディングに関する質問が来ない罠。
0873nobodyさん2007/08/29(水) 12:32:27ID:???
>>871
perldoc -T Jcode::Nihongo | perl -MJcode -p -e "$_ = Jcode->new($_, q(euc))->sjis"

Cygwinは使ったことないが、
それだけでは、誰にも分からないだろう。
0874nobodyさん2007/08/29(水) 13:27:36ID:???
EncodeじゃなくてJcodeなの?
0875nobodyさん2007/08/29(水) 13:53:19ID:???
どっちでもいいだろw
0876nobodyさん2007/08/29(水) 14:01:41ID:???
Jcodeはラッパーなので微妙ながらタイムラグが出来ます
0877nobodyさん2007/08/29(水) 16:47:36ID:???
Encode使う時点で重いから、どうでもいい。
0878nobodyさん2007/08/29(水) 21:19:54ID:???
> Encode使う時点で重いから、どうでもいい。

どうでもいいなら、どうしてここに反応を書き込むの?
キモい2次元絵見ながら黙ってチンコでもいじってればいいだろ。
08798712007/08/29(水) 21:44:47ID:P8i/jgkh
>>873

回答ありがとうです。
勉強なります。

>>876

Encodeのほうが最近向きなんですね。
ちょっと調べてみました。


もう1つの質問は自己買い付けしました。
我ながらとちくるった質問の仕方でした。w
0880nobodyさん2007/08/30(木) 13:15:57ID:???
フォームから送られて来たデータを
jcode'convert(*name, 'euc');
これでEUCに変換してるんですが、
半角カタカナを入れると文字化けしてしまします。
どうすればいいのでしょうか。
0881nobodyさん2007/08/30(木) 13:29:38ID:???
送られてくるデータの文字コードを指定しましょう。
08828802007/08/30(木) 15:10:33ID:???
>>881
ありがとうございます
うまくいきました。
0883nobodyさん2007/08/31(金) 18:10:59ID:???
俺も jcode::convert(\$name, 'euc'); いまだに使ってる
0884nobodyさん2007/09/01(土) 09:16:04ID:???
POE::Component::IRCに同梱されているexamples内のdicebot.plを使ってみたら、

>Use of POE::Component::IRC->new() is deprecated, please use spawn().
>Called from main /home/xxxx/perl-lib/dicebot.pl 100

と怒られてしまいました。
これは、
POE::Component::IRC->new( 'dicebot' ) と書いてある部分を
そのまま POE::Compenent::IRC->spawn( 'dicebot' ) に書き直せばOKという意味なのでしょうか?
0885nobodyさん2007/09/01(土) 12:15:25ID:???
エラーで親切に教えてくれているというのに・・・
0886nobodyさん2007/09/02(日) 00:16:36ID:1H6hgBEM
携帯のIPを直接使ってキャリア判別したいんですけど、
どういうコード書けば良いんでしょうか?

例えば公開されてるIP帯域が127.0.0.0/24だとするなら
$ENV{'REMOTE_ADDR'} =~ /^127.0.0.[0-9]+$/
のように上位24ビットだけマッチするなら真で良いんですか?

(例の帯域はあり得ないかも知れませんがサブネットマスクについて良くわからないんで勘弁してください)
0887nobodyさん2007/09/02(日) 00:17:53ID:1H6hgBEM
↑ドットのエスケープ忘れた
0888nobodyさん2007/09/02(日) 00:21:59ID:???
my @quadip = split(/\./, $IPADDRESS);
my $ipdec = 0; # 10進に変換された IP
my $basedec = 256 * 256 * 256 * 256; # ベースとなる値

for(my $i = 0; $i < 4; $i++){
  $basedec = $basedec / 256;
  $ipdec += $basedec * $quadip[$i];
}

これで $ipdec に10進数にされた IP アドレスが入るので、同じように公開されてる IP アドレスの範囲も10進数に変換して
その範囲内に収まってるかどうかで確認できる。

0889nobodyさん2007/09/02(日) 00:23:50ID:???
これも追記
## IP の範囲やサブネットから IP の最小値と最大値を10進数で返す
sub getipminmax{
  my($ip) = $_[0] || "";
  my(@retip) = (0, 0);

  # $ip に数字、/、- 以外があればエラーリターンする
  if($ip =~ /[^\d\.\-\/]/){ return @retip; }

  # - か / で分割する
  if($ip =~ /\-/){ # IP の範囲
    my ($ipaddr1, $ipaddr2) = split(/\-/, $ip);
    $retip[0] = &ip2dec($ipaddr1);
    $retip[1] = &ip2dec($ipaddr2);
  }elsif($ip =~ /\//){ # サブネット
    my ($ipaddr, $subnet) = split(/\//, $ip);
    my $subnetdec = (2 ** 32) - (2 ** (32 - $subnet));
    my $ipaddrstart = &ip2dec($ipaddr) & $subnetdec;
    $retip[0] = $ipaddrstart;
    $retip[1] = $ipaddrstart + (2 ** (32 - $subnet)) - 1;
  }else{ # 単一の IP
    $retip[0] = &ip2dec($ip);
    $retip[1] = 0;
  }
  return @retip;
}
08908862007/09/02(日) 00:45:58ID:???
>>888-889
凄い…。
ありがとうございます。

できれば>>888の2,3行目についてもう少し詳しく教えて貰えますか?
0891nobodyさん2007/09/02(日) 01:22:15ID:???

質問です。

ユニークな6〜8文字の英数字文字列があるのですが、この文字列を他の文字列(英数字10文字)にしたいんですが、
それもユニークにしたいんです。
ならべく元の文字列がわからないようにしたいんですが、何か方法はありますでしょうか?

ユニークな文字列は5万行ぐらいあります。
■ このスレッドは過去ログ倉庫に格納されています