Perlコーディング初心者質問スレ Part 57 at PHP
[2ch|▼Menu]
1:nobodyさん
08/02/25 19:25:51
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >2 以降

前スレ スレリンク(php板)
過去ログ倉庫 URLリンク(user.ftth100.com)


2:nobodyさん
08/02/25 19:26:15
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: URLリンク(www.site-cooler.com)

[本]
リャマ: URLリンク(www.oreilly.co.jp)
駱駝: URLリンク(www.oreilly.co.jp)
Effective Perl: URLリンク(www.ascii.co.jp)
クックブック: URLリンク(www.oreilly.co.jp)
Perl ベストプラクティス: URLリンク(www.oreilly.co.jp)
Perl Hacks: URLリンク(www.oreilly.co.jp)

[オンラインマニュアル] (追加)
最新のドキュメント: URLリンク(search.cpan.org)
perl5.8.xのドキュメント(一部): URLリンク(www.kt.rim.or.jp)
perl5.005_03 のドキュメント: URLリンク(www.kt.rim.or.jp)
日本語ドキュメント検索: URLリンク(www.cpan.jp)
perldoc.jp: URLリンク(www.perldoc.jp)
Perldoc.com: URLリンク(www.perldoc.com)


3:nobodyさん
08/02/25 19:26:39
ム板Perlスレより 2 of 2

[モジュール]
CPAN.com: URLリンク(search.cpan.org)
河馬屋二千年堂: URLリンク(homepage3.nifty.com)

[テクニック]
Perlメモ: URLリンク(www.din.or.jp)
Perlのページ: URLリンク(homepage1.nifty.com)
Perlの小技: URLリンク(homepage3.nifty.com)

[Perl5.8Unicodeメモ]
URLリンク(www.pure.ne.jp)
URLリンク(www.namazu.org)
URLリンク(www.lr.pi.titech.ac.jp)


4:nobodyさん
08/02/25 22:05:56
WindowsXP+XAMMP+Perl Add-onで、WWW:Mixiを利用して、
URLリンク(digit.que.ne.jp)
↑のHPのコードを動かしているんですが、

500 Can't locate object method "configure" via package "Net::HTTP"

というエラーが出ます。同じCGIをXREAで動かした場合は正常に動作しました。
これはどういった理由でエラーが起こっているんでしょうか?

5:nobodyさん
08/02/25 22:17:42
>>4
鯖にモジュールがインストールされてないんじゃない?
/usr/lib/的なフォルダに/Net/HTTP.pmを入れてみたら?

6:nobodyさん
08/02/25 22:28:05
>>5
確認してみたのですが、HTTP.pmは既にモジュールとして入っていました。
HTTPというフォルダも同じ場所にあったので、競合してるのかなと思い名前などを弄ってみたのですが、
フォルダ名をいじった場合でもHTTP.pmを移動した場合でも、エラーは

501 Can't locate object method "new" via package "LWP::Protocol::http"

となりました。LWP/Protocol/http.pmも既に入っていました・・・orz

7:nobodyさん
08/02/25 22:31:43
>>6
URLリンク(www.google.co.jp)

8:nobodyさん
08/02/25 23:24:10
perlで書いた2つのCGIがあるのですが、
1つ目のCGIを実行中にエラーが起きた時に$ERROR=1等として
エラーフラグに数値を入れて、その値を2つ目のCGIに渡して
2つ目のCGIでエラーメッセージを表示させたいのですが、
色々調べているのですが上手く行きません。

何か上手く2つ目のCGIに値を渡す方法がありましたら、
よろしくお願いします。


9:nobodyさん
08/02/25 23:44:14 JDOb3tEV
Aフォルダの中にある10〜30.txtファイルがあります。
Aフォルダの中身はこれが全てでこれを全部開きたいのです。

open(FILE, '10.txt') or die "$!";
while (my $line =<FILE>) {
print $line;
}
close(FILE);

これだと一つのファイルの中身は見れますが、フォルダの中全てを開きたい
僕にとってこれは違う気がします。
なんとか、方法はないでしょうか?宜しければ教えてください。

10:nobodyさん
08/02/25 23:55:34
>>9
>>2
URLリンク(www.site-cooler.com)

11:nobodyさん
08/02/26 01:25:07
オブジェクト指向を勉強中です。
あるメソッドが、自分自身のクラス内のクラスメソッドを呼び出すには
どのように書いたらよいでしょうか。
クラスメソッドは普通Package->hoge()とするようですが、
自分自身のパッケージをわざわざ書くのが正しいのかと
疑問に思いました。よろしくお願いします。

12:nobodyさん
08/02/26 01:59:04
__PACKAGE__->hoge();

13:nobodyさん
08/02/26 02:33:17
ありがとうございます!

14:4
08/02/26 07:45:15
>>7
色々と見てみましたが未だ解決しませんorz

15:nobodyさん
08/02/26 09:29:48
>>14
XAMPPには詳しくないですが、
出力とは別にエラーログに書かれてないですか?
XAMPP/log/error.logみたいに

16:nobodyさん
08/02/26 11:40:40
ライブラリを読み込む優先順位なんですが、
カレントディレクトリを最優先したいので、
unshift @INC, pop @INC; ってしたいと思うんですが、
環境によってうまくいかなかったりします?

自分の環境で@INCを表示すると
C:/usr/site/lib C:/usr/lib . となるんですが、
unshift @INC, '.';のほうが良いんですかね?

17:nobodyさん
08/02/26 11:59:34
.がどこにあるかは環境によって違うから、除去と追加は.を明示した方がいいんじゃないか。

18:nobodyさん
08/02/26 12:45:05
>>16
use lib '.'; で良きに計らってくれる。
URLリンク(search.cpan.org)

5.00503 の lib.pm だと重複除去をしてくれないから

BEGIN {
  my %dup;
  @INC = grep !$dup{$_}++, ('/path/to/your/extlib', @INC);
}

なんて書いたりするけど。

19:nobodyさん
08/02/26 13:03:29
>>17 >>18 ありがとう
use FindBin;
use lib $FindBin::Bin;
で解決しました。

重複してるけど、除去しなくても
確実にカレントディレクトリで見つかれば問題ないですよね?

20:nobodyさん
08/02/26 15:20:10
>>15
apacheのerror.logならあるのですが、
perl実行時のエラーを吐き出しているlogはありませんでした。

WWW:Mixiで使っているモジュールがあるかどうかなども確認したのですが、
全て揃っていて、Winの自鯖なので権限なども関係ないと考えているのですが・・・解決しません。

21:nobodyさん
08/02/26 16:11:53 rftlSzSy
WIN鯖はなにかと問題が多いんで
切り替えることをおすすめしますよ。

22:nobodyさん
08/02/26 16:27:13
>>20
XAMPPとかWWW::Mixiがどんな仕様か詳しくは知らないけど、
普通のPerl-CGIなら、そのApacheのerror.logにエラーが出力されてるハズ。

23:初心者
08/02/28 15:16:09 GDQH6oGX
最終的に曜日を知りたいので、指定した○年○月1日まで、今から何日前なのか後なのかを計算する
方法をどなたか教えてください。

24:nobodyさん
08/02/28 15:55:55
>>23
URLリンク(search.cpan.org)
URLリンク(perldoc.jp)
use Date::Calc qw(Day_of_Week);
my $dow = Day_of_Week($year,$month,$day);

25:nobodyさん
08/02/28 15:57:12
Windowsの英語版と日本語版を区別する方法ってないですか?
$^OでOS名は取れるのですが…
現在はシステムの`date /t`の戻り値を見て判断しています。

26:初心者
08/02/28 16:11:55 GDQH6oGX
>>24さんありがとうございます。
出来ればモジュールを使わずに日数を計算する方法はないんでしょうか?

27:nobodyさん
08/02/28 16:36:04 TYs56hmn
>>24
>>1

28:nobodyさん
08/02/28 16:36:24 TYs56hmn
間違えたwすまんw
>>26
>>1

29:nobodyさん
08/02/28 16:55:57
>>25
URLリンク(homepage3.nifty.com)

30:nobodyさん
08/02/28 17:21:40
知恵を貸してください
ログインスクリプト作ってるんですが
最初の画面でhttpかhttpsを選択
httoの場合は普通に次の画面でCookie食べておしまい

https(SSL)の方はpost後代理鯖(共有SSL)でCookie食べる
locationで元の鯖に飛ばしてhttpの方もCookie食べる
という処理なのですがlocationなので当然丸見えなんです。。。
何かスマートな方法ありましたらご教示願います。

31:25
08/02/28 17:24:53
>>29
サンクス。解決したよ

32:nobodyさん
08/02/28 21:20:30
LWP::UserAgentについて質問があります。
下ページを取得しようとすると、CPU使用率が100%になったままで
応答がなくなり?ます。ページも取得できません。
こんな場合、途中で諦めたいのですが、タイムアウトを設定しても変化なし。
どうすれば良いかアドバイスお願いします。

#!/usr/bin/perl

use strict;
use LWP::UserAgent;

my $url = 'URLリンク(www.mother-house.jp)';
print "$url\n";
my $ua = LWP::UserAgent->new;
$ua->timeout(30);
my $request = HTTP::Request->new(GET => $url);
$request->header('Pragma' => 'no-cache');
my $response = $ua->request($request);
if ($response->is_success) {
print $response->content;
} else {
print "(´・ω・`)ショボーン\n";
}
exit;

33:nobodyさん
08/02/28 22:07:20
そのページ3G近くあんじゃんwブラウザで開いて焦ったw
たぶんメモリが足りないだけなんじゃないかな
$ua->max_sizeで上限決めたりヘッダにrange付けて小分けにリクエスト投げるといい

34:nobodyさん
08/02/28 22:32:37
>>33
そんなに大きかったのですか!w
すみません、でもお陰で$ua->max_sizeを知ることができましたし、
デフォルト無制限なのを知ることも出来ました。
どうもありがとうございました。

35:nobodyさん
08/02/28 23:44:29 txq/MTXf
push(@list, {'num1' => 1, 'num2' => 2});

上記データのnum2をキーにしてをsortを行うことは可能でしょうか。
もし可能でしたら方法をご教示いただけますと幸いです。

宜しくお願いします。


36:nobodyさん
08/02/29 00:12:26
@sorted = sort { $a->{"num2"} <=> $b->{"num2"} } @list;

37:nobodyさん
08/02/29 01:24:59
>>33
???
そのページ30MB位しかないぞ。
content-lengthも29239056ってなってるし。
たしかにブラウザで開いたらCPU100%で1分くらい固まったけど・・。
でも、取得できたから、保存して、テキストエディタで開いてみたら、やっぱり30MBくらいだったぞ。

>>32
で、LWPなんだが、ウチの環境でも、ファイルサイズが大体3〜4メガ位より大きくなると、
とたんに反応が無くなる。ちなみにメモリは1G積んでて、余りも800M以上ある状態で・・・。
何故だかはわからん。

ちょっとソース読んでみるか。

38:nobodyさん
08/02/29 01:31:25
でも、そんな非常識なサイトを取得する意義ってあるのかな。
まあ、そういうことがしたいってことなら仕方ないけど、そういう非常識なサイト対策って意味で、
>>33-34あたりの対策をしておく必要があるんだなっていう意味で参考になった。

39:nobodyさん
08/02/29 12:47:11
ありゃあ30Mか見間違えてた
3Gと勘違いしてて実行しなかったけど
今試してみたら引っかかることなく問題なく取得できたよ

colinuxでメモリ126M割り当て
$ perl -v
This is perl, v5.8.8 built for i386-linux-thread-multi
$perl -MLWP::UserAgent -e 'print $LWP::UserAgent::VERSION'
2.036

40:30
08/02/29 15:29:10
他あたって見ます
失礼しました

41:初心者
08/02/29 17:30:27 VfFNtRxq
カレンダーを表示する時に

 日 月 火 水 木 金 土
| | | | | | 1 | 2|
 _ _ _ _ _ _ _  ← 線はもっとうえに

うまく書けてなくて申し訳ないですが、数字を囲むような形で常に5行表示させるには
どうしたらよいでしょうか。どなたか教えてください。

42:nobodyさん
08/02/29 17:44:40
>>36
遅ればせながら、有難うございました。
助かりました。

43:nobodyさん
08/02/29 18:16:34
質問です。
2進数から10進数に変換したいんですけど
どうすればできますか?

>>41
テーブルタグでも使ったほうがいいんじゃないですか?

44:43
08/02/29 18:22:40
質問が変なので追記
$a = 10101010;
となっている場合に
$a = '0b' . $a;
$dec = oct $a;
のようにしてます。
もっとスマートに0bを付けられないでしょうか?

45:nobodyさん
08/02/29 18:33:58
>>43-44
my $dec = oct "0b$a";

URLリンク(mikeneko.creator.club.ne.jp)

46:nobodyさん
08/02/29 19:50:41
>>45
簡単でしたね…。ありがとうございます。

47:37
08/02/29 20:11:23
>>39
あれ、そうなん?って思って、ウチでもちょっと実験してみた。
人のサイトにリクエスト送りまくるんは、ちょっとアレなんで、LAN上に50MBほどのファイルを用意してやってみた。

perl -v
This is perl, v5.8.8 built for MSWin32-x86-multi-thread (WinXp + ActivePerl5.8.8-822)
LWP/5.808 LWP-UserAgent/2.036
の環境だと、この50MBのファイルを受け取って書き出すまでに、実に573秒(9分33秒)かかった。
ちなみに、ab で計測すると約4.7秒で転送できる。
その時、タスクマネージャーで監視していると、CPU80-90%くらいで、システム(グラフの赤色)が40%を占めてる。
で、メモリの使用量が、1〜2秒おき位に、30〜40MB位まとめて、増えたり減ったり激しく変動してる。

そこで、
perl -v
This is perl, v5.8.8 built for i386-linux-thread-multi (Linux/CentOS5.1 + i386.rpm)
LWP/5.808 LWP-UserAgent/2.036
の環境で同じことをやってみたら、ファイル書き出し完了までで、なんと5.3秒!
ab での計測で約4.6秒はWin環境とほとんど変わらず。コレにDisk書き込みの時間が足されてまあこんなもんか。

ちょっとソース読んでみたけど、LWP内部で特に問題になるようなところはなさそう。
WinとLinuxで違いもない(Version同じだから当たり前か)。
多分、IO::Socketとか、もっとCoreに近い部分が原因で、とくにActivePerlとWin環境だけで>>32>>37みたいになるのかな。

>>38
確かに、HTMLやテキストファイルだけでそんな容量使ってるサイトは、非常識と言えるかも知れないけど、
画像や音楽、動画、アプリケーションのzipやtarなんかだと、数MB〜数十MBなんかはザラにあるから、
そんなんクロールして取得しようとか以前思った時に、>>37みたいな現象に遭遇したんだ。
まあそん時は、Win環境しかなくて、今回みたいに検証すらしなかったんだが・・・。
おっしゃるように、max_sizeで小分けにするのがベターなやりかたかな。

48:nobodyさん
08/02/29 21:04:20
$ua->requestにcallback関数とサイズ渡したほうが
range対応して無くても使えるしいいんじゃないかな?


49:nobodyさん
08/03/01 04:06:42
>>48
そうなんだよな。
確かにそんなことも出来たようなことを、かつてdocument流し読みした時にあったな〜って思って、もっかいmanualを詳しく読んでみたら、
なにも$ua->request()に、code_refを投げなくても、直接$filenameを渡せば、Discにcontentsを書いてくれるそうなんで、いっちょやってみた。
そしたら、Win環境でもNetwork転送時間+書き込み時間位で取得できるようになった。
ファイルサイズを100M,200M,500MとでかくしてやってもLWP(Perl)がハングすることなく、大体見積もり程度の時間で取得出来るようになった。

これだと、取得したHTMLをさらにParseして、処理をかけるってことをやろうとすると、ファイル開かないといけないけど、
まあバイナリファイル取得する分には十分だな。

なんつうか、ちゃんとドキュメント読めよオレ!っていう結論だ。

50:nobodyさん
08/03/02 22:25:56
全部メモリに読み込む以外のインターフェース用意するのは当たり前だ。そのくらい気付いてドキュメント嫁。
それ以前に、数百MBのデータ読み込もうとするな。へぼ。

51:nobodyさん
08/03/03 05:44:20
>>50
いやいや、今回の場合は、メモリに十分余裕があるのに、たかだか5Mとか10M位でも
Win(ActivPerl)環境だと激しく遅くなるのに、Linux環境だとそうはならない。ってとこで色々やって見たわけなんだわ。
まあ確かに、ちゃんとドキュメント読んでたら、最初の質問出たときに素早く正確なレス返せたかもしれないけど、
そこらへんヘボなんは認めるよ。まあ初心者スレなんだし。

だけど、俺なんかはPerlで数百M〜GBクラスのファイル読み込みとか普通にするし、
Perlの使用メモリが2G近くまで行ったりもするけど、今までそんな使い方してて、異常だとか思ったことなかったけど・・。
(そりゃあ、レンサバとか共用マシンとかでやるのは非常識だと思うし、CGIとかの鯖環境ではオレもそんなことしないけど、
自分専用で使う分にはええんでないの。今回みたいな検証したり、ベンチマーク取ったりもするし。)

52:nobodyさん
08/03/05 05:02:04 yN6MH4LB
ファイルパスを引数として受け取り
受け取ったファイルパスにファイルを作るサブルーチンを作りたいんですが、
ファイルパスが正しいかチェックするための正規表現がどうしてもかけません。
マッチする条件として
・ドットで始まるファイルは不可
・拡張子は必須/\.[a-z]+$/
・チルダ不可
・先頭のみ./は許可。../は不可。
・ディレクトリ、ファイル名は/[A-Za-z0-9\-]/にマッチ
・連続するスラッシュ、ドットは不可
・m|^/|も許可
書いてみてもものすごく長くなって、結局破綻してしまいます。
たすけて

53:nobodyさん
08/03/05 05:08:29
追記
open(FH,">",$file);
で作れるファイル名なら問題ないです。
ただし、カレントディレクトリ以下です。

54:nobodyさん
08/03/05 05:42:23 ImwXiBY3
use lib qw( ./lib );
use Data::Alias;

Can't locate loadable object for module Data::Alias
と言われます。

./lib/Data/にAlias.pmをポコッと置いてるだけなんですけど
何が足りないんでしょうか?


55:nobodyさん
08/03/05 08:19:07
>>54
@INCを出力してみたら?
フルパス打ってみるとか

56:nobodyさん
08/03/05 10:04:58
>>54
「Can't locate loadable object」とあるように
Data::Alias は pure perl なモジュールじゃない。
URLリンク(search.cpan.org)

57:nobodyさん
08/03/06 03:17:10
>>52

無理してひとつの正規表現で済ませなきゃいーじゃん。


58:nobodyさん
08/03/06 05:45:50 F1MYa2qu
たしかに
マッチしないものをどんどんはじけば処理少なくならないか?

59:nobodyさん
08/03/06 15:48:54
レンタルサーバにMT入れてブログをやってるってだけで、
社内でネットプログラムに一番詳しい人にされてしまいました。
材料仕入れて加工して個人に売るという会社なのですが、DQN取締役から
「在庫管理と顧客管理をブラウザから処理できるシステムってできるでしょ?
年度始めまでにお願いね」
と言われて涙目です。
プログラムは未経験で何をどうしていいかすら分かりません。
在庫管理のデータベースシステムの概要や、スクリプトの流れが
理解できるような書籍があったら教えてください。
ラクダ本は買ってみたのですが一から勉強するにはちょっと時間が足りません…

60:nobodyさん
08/03/06 16:06:45
「できません。」って言う

61:nobodyさん
08/03/06 16:19:02
フリーで落ちてる奴でも使っておけ

62:nobodyさん
08/03/06 16:56:54
できませんが一番

63:nobodyさん
08/03/06 20:17:17
URLリンク(xn--lckja1b6r.jp)
URLリンク(xn--lckja1b6r.jp)


64: ◆TWARamEjuA
08/03/07 00:01:42 BE:871924-2BP(7072)
(´-`).。oO(やりたいよなぁ。。。)

65:nobodyさん
08/03/07 12:30:47
>59
予算もらって外注する
予算なければ出来ないっていうか、
予算相当に自分の人件費を上げてもらって頑張って勉強

66:nobodyさん
08/03/07 18:55:17 +CnMyeLv
質問です。
小数点以下の右端の0を全部取り除きたいです。
小数点以下が0しかない場合は、小数点も含めて取り除きたいです。

3.00 → 3
3.02000 → 0.02

どう書けばよいのでしょうか?
my $result = sprintf("%g", num); とすればいけるかと思いましたが、numが19120730.0000の場合に
1.91207e+07となり、だめでした(19120730となってほしい)。
さっき正規表現スレで聞いたんですが、正規表現は関係ないとレスされました。
宜しくお願いします。


67:名無し募集中。。。
08/03/07 19:05:18
=~ /[0.]$//
で削っていけば?

68:nobodyさん
08/03/07 19:22:48
>3.02000 → 0.02
3.02じゃなくて?

3.02なら*1すりゃいいだけだけど・・・

69:nobodyさん
08/03/07 19:28:01
>>66
一旦数値コンテキストで評価。
print "$_ => ", $_ + 0, "\n" for qw(3.00 3.02000 19120730.0000);

70:nobodyさん
08/03/07 19:40:11
>>67->>69
レスありがとうございます。

>>68
> 3.02じゃなくて?

そのとおり、3.02でした。

*1でも+0でも可能でした。ありがとうございました。

71:nobodyさん
08/03/09 04:23:14
>>59
そんなもんJifty使って1時間もあればプロダクションまでいけるおれが答えよう。
(「在庫」の複雑さにもよるが)

これからプログラムやりたいんであれば、なんとしてでもこの機会を利用しろ。
開発用マシン買ってくれとか、本買ってくれとか、時間くれとか。
どんな言語がやはっていても、RDBMSの知識は常に使える。
3rd manifestoまではまだ10年以上かかるだろう。

プログラムやるきがなくて、この社内アプリが手柄になるなら外注しろ。

どれでもなければ、「できません」だな。

72:nobodyさん
08/03/09 06:21:52 kv7E/tC/
MT使ってるだけでこんなの押し付けられる会社だぜ?
期待に応えたりしたらさらに良いように無理難題押し付けられるのが関の山だ
にげちまえ

73:nobodyさん
08/03/09 10:38:47
>>59
「外注」というと上司が文句を言う場合は、部品(ライブラリ)を
買うと言ってみてはどうだろう?

use ZAIKOKANRI
ZAIKOKANRI->new( -option=>... );

みたいな形で起動する、ライブラリという名のアプリケーション。
実際、漏れの上司は何故か外注を嫌がるが、「ライブラリを買う」
というと許可が下りるので、フリーのプログラマの知り合いに
頼んで作ってもらってる。

74:nobodyさん
08/03/09 16:08:58
>>73
知り合いに発注すると、背任に問われかねない。

75:nobodyさん
08/03/10 16:46:11
すみません、下のソースで、sendmailをcloseしたときにエラー($?=256)が返されてしまうのですが、
これはどう対処すべきなのでしょうか…?

#タイトルのエンコード
$subject = encode('iso-2022-jp', $subject); # iso-2022-jpにエンコード
$subject = encode_base64($subject, ''); # Base64にエンコード
$subject = '=?iso-2022-jp?B?' . $subject . '?='; # ヘッダー文字列の追加
# 本文のエンコード
$content = encode('iso-2022-jp', $content); # iso-2022-jpにエンコード

# メール送信
$cnt=<<"EOT";
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=iso-2022-jp
From: $from
To: $to
Subject: $subject

$content
EOT
open MAIL, "| /usr/sbin/sendmail -t" or &err("Cannot open sendmail: $!");
print MAIL $cnt;
close MAIL or &err("Cannot close sendmail: !=$! ?=$?");

76:nobodyさん
08/03/10 17:53:13 dzM4A1jo
マルチポスト君に応える回答は御座いませぬ
他池

77:75
08/03/10 19:29:36
自己解決出来たので報告です。
>>75のは、「文字コードが意味不明だゴラァ」と言われていたようでした。
(『encode』とは『UTF-8から』sjisやらiso-2022-jpやらにエンコードする機能。
 一度UTF-8に『decode』しなければならなかった。)

 以上、スレ汚し失礼しました。

78:nobodyさん
08/03/10 22:41:42
$lineの内容と同じ行がlog.txtになかったら、$lineをlog.txtの末尾に追記する
といったものを作りたいのですが上手く行きません。

症状は、エラーは吐かず、同じ行があっても末尾に追記されてしまいます。
ご教授いただけたら助かります。

foreach my $aaa ( @{$data->{'aaa'}} ) {
$line="This is $aaa->{'msg'}";
$chk=0;
open( DAT, "./log.txt" );
while ( <DAT> ) {
if( $_ == $line ){
$chk++;
}
}
close( DAT );
if( $chk == 0 ){
open(FILE, ">>./log.txt");
$line="$line\n";
print FILE $line;
close(FILE);
}
}


79:nobodyさん
08/03/10 22:51:05
chomp使えばいいんじゃない?

80:nobodyさん
08/03/10 23:25:05
問.localtimeは配列を吐きますが、localtimeの動作の逆(配列を入れたら経過秒数合計が返ってくる)はどうしますか。

81:nobodyさん
08/03/10 23:34:28 dzM4A1jo
たしかGMTから秒数を返すモジュールがあったはず
比較的簡単に見つかるはずだからググッてみそ

82:nobodyさん
08/03/10 23:42:22
>>78
==

83:nobodyさん
08/03/10 23:43:47
>>81
ありがとうございます。
別サイトのRSSのタイムスタンプを読み、データベース化するのに秒数の方が効率がいいと思いました。
ただ標準実装では出来ないようなのでYYYYMMDDhhmmssで行こうと思います。

チラシの裏
RSSの仕様のいい加減さと各サイトの独自拡張と欧文フォーマットの日付表記ウザすぎですね。
少々殺意を覚えました。YahooやgooやニュースサイトのRSSを見てみると、バージョン違いで
タグが違う(pubDateやらdc:dateやら)はまだ許せますが、フォーマットもめちゃくちゃですね。

Mon, 10 Mar 2008 19:17:02 +0900
Mon,10 Mar 2008 11:02:29 +0900
2008-03-10T21:56:00+09:00

少なくとも3パターンはあるようで、非常に嘆かわしいと思いました。

84:nobodyさん
08/03/11 00:00:51 kt3GGsX4
XMLが自由すぎて使いづらいのが難点よねw

85:nobodyさん
08/03/11 00:17:08
安易に拡張性を求めたら墓穴を掘るいい例だよね
自由にできるのは結構なことだけど,良く使う日時のフォーマットくらい統一してほしいぜ・・・

86:nobodyさん
08/03/11 00:31:27
>>83
Time::Local (の timelocal) は組込関数ではないが標準モジュール。
故意に抜かない限り入っている。

87:nobodyさん
08/03/11 00:55:54
フォーマットを統一するものを書いてみました。無駄があったらご指摘お願いします。
#!/usr/local/bin/perl
sub DateFmt{
my $str=$_[0];
my $i,$temp,$num;
if($str =~ /[0-9]{4}?(-[0-9]{2}?){2}?T[0-9]{2}?:[0-9]{2}?:[0-9]{2}?\+[0-9]{2}?:[0-9]{2}?/){
return $str;
}
$str =~ s/^[a-zA-Z]{3}?\,//;
$str =~ s/^\ +//g;
@mname = ('Jun','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
$i=1;
foreach $temp (@mname){
$num=sprintf("%02d",$i);
$str =~ s/$temp/$num/i;
$i++;
}
($day,$month,$year,$hms,$jst) = split(/ /,$str);
$jst =~ s/\+(..)(..)/+$1:$2/;
return "$year-$month-${day}T$hms$jst";
}
print &DateFmt("Mon, 10 Mar 2008 19:17:02 +0900");
print "\n";
print &DateFmt("Mon,10 Mar 2008 11:02:29 +0900");
print "\n";
print &DateFmt("2008-03-10T21:56:00+09:00");
print "\n";

88:nobodyさん
08/03/11 05:18:16
読むのもめんどくせえよ

use Date::Parse;
print str2time($_), "\n" for <DATA>;
__DATA__
Mon, 10 Mar 2008 19:17:02 +0900
Mon,10 Mar 2008 11:02:29 +0900
2008-03-10T21:56:00+09:00

89:nobodyさん
08/03/11 05:24:13
XML::RSSでEUCのRSSを読み込むにはどうしたらいいんだ

90:nobodyさん
08/03/11 09:52:01
変換してから読み込めば?

91:nobodyさん
08/03/11 09:53:07
>>87
+0900の部分はグリニッジ比だから-から始まることもあり得る。

92:nobodyさん
08/03/11 12:11:54 PA7R3QgS
CPANモジュールのSpreadsheet::WriteExcelを導入しています。
このモジュールのあるバージョン以下の場合はメソッドA実行、それ以外はメソッドB実行
といった振り分けを行いたいのですが、モジュールのバージョンをperl上で調べるには
どうすればいいのでしょうか?
print $SpreadSheet::WriteExcel::VERSION;
としても、何も表示されませんでした。

93:nobodyさん
08/03/11 12:35:37
version 2.18 はそれできちんと表示された。その他の version は知らん。
ソースに当ってみたら?

94:nobodyさん
08/03/11 13:47:11
>>93
レスありがとうございます。わざわざ調べて頂きどうもです。

やってしまいました。
print $SpreadSheet::WriteExcel::VERSION;
ではなく、
print $Spreadsheet::WriteExcel::VERSION;
でした。これははずかしい(*´Д`)
バージョン2.15、2.20とも表示されました。大変失礼しました。

95:nobodyさん
08/03/11 14:00:50
どっちも同じなのだがw

96:nobodyさん
08/03/11 14:26:49
大文字小文字

97:nobodyさん
08/03/11 14:34:32
あ〜ww

98:nobodyさん
08/03/12 10:02:54
>>94
use strict汁!

99:nobodyさん
08/03/12 20:50:08
突然すみません。
Perlの勉強中で簡素なプログラムを作成しているのですが
POSTでデータがうまく送信できなくて困っています。
同じコードでMETHOD="GET"とすると送信できるのですが
パスワード入力などをするため、URLにパラメータを表示したくないのです。
お知恵を拝借させてください。よろしくお願いします

100:nobodyさん
08/03/12 20:55:51
>>99
POSTで送ることがわかってるなら調べれば簡単だと思うんだが。
CGI.pmとか使うと簡単にできる

101:nobodyさん
08/03/12 21:02:36
送信出来ないのでなく受信したあとの処理が出来てないに1000ペリカ

102:nobodyさん
08/03/12 21:04:45
>>100
迅速なレス、感謝します。
浅学でお恥ずかしいのですがCGI.pmについてこれから調べてみます。
ありがとうございます。

103:nobodyさん
08/03/12 21:10:03
>>101
レスありがとうございます
受信後の処理は、次のような処理を記述しております

if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $form, $ENV{'CONTENT_LENGTH'});
} else {
$form = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $form);
foreach (@pairs) {
($name, $value) = split(/=/, $_);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/>/>/g;
$value =~ s/</</g;
&jcode'convert(*value, 'sjis');
&jcode'convert(*name, 'sjis');
$FORM{$name} = $value;
}

GETだとうまく処理されるので2行目の
read(STDIN, $form, $ENV{'CONTENT_LENGTH'});
が怪しそうですね。
CGI.pm?で調べられるのかどうなのかまだよくわかっておりませんが
まずいところの見当すらつかなかったので助かります。
ありがとうございます。

104:nobodyさん
08/03/12 21:18:29
ぱっと見た感じ問題なさそうだけどな

しかしnameにも日本語を使ってるのか

105:nobodyさん
08/03/13 00:55:15
KENTのコピペ臭がするのは俺だけ?

106:nobodyさん
08/03/13 01:19:37
>>103
うーん、区切りがほんとに’&’なのかな。
一回、 print $form ; やってみれば?

107:nobodyさん
08/03/13 02:21:43
Perl4時代のこの定番処理がいまだに使われてるってのもなぁ


108:nobodyさん
08/03/13 03:58:19
そこでcgi-lib.plですよw

109:nobodyさん
08/03/13 13:54:44
最近、GET/POSTのデータやテキストファイルを自前で読み込まなきゃならないことがあって
「あれ? どうやるんだっけ?」と本気で焦った俺。

使わないとそんなもんだよな。


110:nobodyさん
08/03/13 20:56:52
>>109
ライブラリが整備されてそっち使うと忘れるんだよな

111:nobodyさん
08/03/14 00:19:02 jE/64EXv
くだすれにも書き込んだ者ですが。

$aaa=1;
if($aaa==1||$aaa==3)
これをもっと簡潔に書くにはどうすればいいですか。

あと、「$aaaが8のn倍ならマッチさせる」というのも
わかりませんでした、おねがいしますm(_ _)m

112:nobodyさん
08/03/14 00:26:38
!($aaa % 8) ← これで8の倍数のチェックだけど、マイナス値は試してないのでわかんないw

8で割ってみて余りが0なら割り切れてるので8の倍数ということ

113:nobodyさん
08/03/14 00:34:03
$aaa=1;
if($aaa==1||$aaa==3)

if ($aaa =~ /^[13]$/)
こんなのできないこともないけど、そのままでいいんじゃないか?

114:111
08/03/14 00:40:08 jE/64EXv
>112
そういうやりかたもあるんですね。

>113
極端にいえば
if($aaa==1||$aaa==5||$aaa==13||$aaa==17||$aaa==25||$aaa==34||)
こんなに長くなってしまう。
これじゃあまりにもじゃないですか?

115:nobodyさん
08/03/14 01:07:31
$aaa==9 や $aaa==21 が入ってなくて $aaa==34 が出てくるから
長くなるんだと思う。

116:nobodyさん
08/03/14 01:13:26
ありえる数字を列挙させて、それのチェック対象が1つの変数なら
1つの変数に対して配列で一気にチェックできた気がする

grep 使ったような使わなかったような・・・ごめん。 俺にはもう無理w

117:nobodyさん
08/03/14 01:41:34
長くて見づらいけど、処理量が多くて重くなるよりはマシかな。
そんな劇的な違いは無いとしても気分的になんとなくw

118:nobodyさん
08/03/14 01:51:12
重いと言っても何百万回も繰り返さないから、こうしちゃうなw
if($aaa =~ /^(1|5|13|17|25|34)$/)

119:nobodyさん
08/03/14 06:02:08
%tmp = map { $_ , 1 } ( 1, 5, 13, 17, 25, 34 ) ;
if ( defined $tmp{$aaa} ){
 print "俺の名を言ってみろ\n" ;
}

120:nobodyさん
08/03/14 11:41:19
>>116
grep使う方法だとこうかな?

if ( grep { $aaa == $_ } qw( 1 5 13 17 25 34  ) ) {
    # code here
}

121:nobodyさん
08/03/14 11:42:57
# no 5.10
grep { $aaa == $_ } qw/1 5 13 17 25/;

#
use List::MoreUtils qw/any/;
any { $aaa == $_ } qw/1 5 13 17 25/;

# use 5.10
$aaa ~~ [qw/1 5 13 17 25/];

122:nobodyさん
08/03/14 11:53:06
ほとんどの場合、ブロックより式の方が早いので
my %tmp = map +( $_ => 1 ), ( 1, 5, 13, 17, 25, 34 );
grep $aaa == $_ ,( 1, 5, 13, 17, 25, 34 );



123:nobodyさん
08/03/14 14:50:45
dankogaiがエントリ書いてた
URLリンク(blog.livedoor.jp)

124:nobodyさん
08/03/14 15:48:58
>>111 >>113-122
URLリンク(www.kt.rim.or.jp)

125:nobodyさん
08/03/14 22:34:42 exCIvuwa
Perl初心者です。宜しくお願いします。

ディレクトリ探索し、ディレクトリの中の「.txt」をファイルを見つけたら
その行数を出力したいのですが、「open(FH, "$_") or die;」のところで
落ちます。何がいけないのでしょうか?


---ここから
use File::Find;

my $dir = 'TestDir';

find(\&print_file, $dir);

sub print_file {
  $_ = $File::Find::name;

  if (/.+\.txt/) {
    print "$_ \t";

    open(FH, "$_") or die;
    1 for <FH>;
    print $. . "行\n";
    close(FH);
  } else {
    print "$_ \n";
  }
}

126:nobodyさん
08/03/14 22:50:02
>>125
open(FH, "$_") or die "$! [$_]";
1 while <FH>;

とでもして吐かれたエラーメッセージを読む。

127:nobodyさん
08/03/14 23:25:19
>>125
File::Find の find では pwd が変りますが、
$File::Find::name で得られるのはこの場合は $dir からのパス。

use Cwd ;
して if 文の中に
print getcwd ;
して確認してみそ。

簡単な解決方法は、$dir にゼッタイパスを突っ込め。
それから perldoc File::Find くらいしろ。

128:nobodyさん
08/03/16 19:27:01 483Ek7KZ
Commonで漢字を含むデータをPOSTしたいのですが、漢字部分が出力されません。
以下で生成されたcontentをチェックしても、漢字だけ消えています。
どの様にすれば良いでしょうか。
よろしくお願いいたします。
use encoding "shift-jis";
LWP::UserAgent;
use HTTP::Request::Common qw(POST);
my %form=('test'=>'漢字123');
my $request = POST('URLリンク(test.test)',[%form]);
my $con=$request->content;
print "test:$form{test}\n";
print "content:$con\n";

出力
test:漢字123
content:test=123

129:nobodyさん
08/03/16 22:26:04
>>128
# use encoding "shift-jis";
# LWP::UserAgent;

130:nobodyさん
08/03/16 23:03:42 eaCmNgRi
はじめましてこんにちは。
自作の掲示板を作ってまして、ある書き込みにレスが付いた場合は
そのレスの数をカウントして画面に表示させる、という事をやってます。
現状はこんな感じです。

print "($res)<br>\n" if ($res ne "");

レスがある場合は(9)とかの某かの数字、レスが付いてない場合は空白という所までは
上手く行ってるのですが、
この(9)の部分を赤で出力したいと思ってます。

出来れば上記の命令の中だけで完結させたいのですが、無理でしょうか?


131:nobodyさん
08/03/16 23:16:51
>>130
print qq|<span style="color:red;">($res)</span><br>\n| if $res;

Webサイト制作初心者用質問スレ Part 194
スレリンク(hp板)

△▲ WebProg 初心者の質問 Part17 ▼▽
スレリンク(php板)

132:nobodyさん
08/03/17 02:23:56 WVXzjYIy
>>129
ありがとうございました。
ただ、UserAgentは使うのでコメントアウトできません。
EUCでソースを書き、1行目だけコメントアウトで解決しました。


133:nobodyさん
08/03/17 11:04:17 +D1UxdpV
>>126
>>127
ありがとうございました。解決しました。

134:130
08/03/17 21:21:26 iYfDDUad
>>131
ありがとうございました、無事に解決いたしました。
これを応用して、文字のサイズを変える事もやってみましたが上手く行きました!

ところで考え方の確認を1つ。。。
admin.cgiで生成した画面から、subって画像をUPロード。
その画像を、album.cgiという別の画面上に表示させていて上手く動いてるのですが、
「その画像がUPされた日時をalbum.cgiの画面上に表示させる。」という事を考えています。

すごーく単純に考えて、
「subる直前に日時を取得して、それを変数に格納。その変数をalbum.cgiに渡して、その変数をprintすればOKかも。」
と考えてやってますが上手く行きません。(表示すらされない。)

もともとCOBOラーなもんで、この手のコーディングは激苦手なのですが四苦八苦しながら何とかやってます。
変数の初期化は?変数は共通変数なのかpg内変数なのか?受け渡しはどうやってやるのか?
などなど色々疑問は尽きませんが、そもそも上記の考え方でおかしくはないですか?



135:nobodyさん
08/03/17 22:03:37
>>134
>>1-3

△▲ WebProg 初心者の質問 Part17 ▼▽
スレリンク(php板)

CGI: Common Gateway Interface part 13
スレリンク(php板)

136:nobodyさん
08/03/18 10:37:05
>>134
CGIプログラム:バッチ
htmlフォーム:コマンドライン
と考えれば、おのずと答えが見えると思われ。

各バッチ処理間でデータをやり取りするには、
・ファイルまたはDBに格納する
・コマンドラインオプションを利用しうまく受け渡す方法を考える
のいずれかになる。

CGIプログラム間でうまくデータを受け渡すには
・セッション(ファイルまたはDB)を利用する
・htmlフォームデータとして生成しPOSTする(値を変えられたくなければHIDE要素にする)
のいずれかになる。

137:nobodyさん
08/03/18 11:07:18
小難しく考えるなよ
stat使えばいいだろ

138:nobodyさん
08/03/18 17:51:36 yz+TlyvN
お世話になっております。

----------------
sub test{
$hoge = shift;
$fuga = shift;
$hoge += $fuga;
}
----------------

のような感じのプログラムを作っていましたが
うまくいかなくてどうしてだろうかと考えた所
文字列として認識していたっぽいです。

この $fuga を 数字に明言したいのですが
どのようにやるのでしょうか?

以上 ご助力いただけますとありがたいです。


139:nobodyさん
08/03/18 18:20:21
>>138
デバッグの基本、$fugaをprintしてみる

140:nobodyさん
08/03/18 18:25:39
>>138
$hoge と $fuga に数字がきちんと入ってたら、最初に文字列として認識してようと、
+= の段階で数字として扱ってくれるだろ…。他の部分のミスじゃね?

141:nobodyさん
08/03/18 18:26:00
$hogeか$fugaに数字以外の記号(改行とか)が混じっていると予想

142:138
08/03/18 18:30:10 yz+TlyvN
RESありがとうございますっ

$hogeか$fugaに数字以外の記号が入っている場合もあり
ソノ場合は0として扱いたいのですが
数字が入っていた場合は数字として扱いたいのです、、、

num $fuga
int $fuga
などで数字と明言する方法があったような気がするのですが
私の勘違いでしょうか???

143:nobodyさん
08/03/18 18:35:55
勘違い。
っつーかデバッグして調べろよ

144:nobodyさん
08/03/18 19:26:34
内容が多いハッシュの値があって、それをデータベースに格納するのに、
そのままSQL文を書くと長いので
 my ( @n, @q, @p );
 foreach my $key ( keys %hash ) {
  push @n, $key;
  push @q, '?';
  push @p, $hash{$key};
 }
 my $sth=$dbh->prepare('INSERT INTO test('.join(',',@n).') VALUES('.join(',',@q).')');
 $sth->execute(@p);
という形でSQL文を構築してデータを格納しているのですが、
もう少しスマートな方法は無いでしょうか?

145:nobodyさん
08/03/18 19:50:13
 my $sth=$dbh->prepare('INSERT INTO test('.join(',',keys %data).') VALUES('.join(',',map{'?'}(keys %data)).')');
 $sth->execute(map{$data{$_}}(keys %data));
適当にmapで記述したら、ここまで短くなりましたが、map{'?'}(keys %data)の辺りは、
もうちょっとスマートな方法がありそう…。

146:nobodyさん
08/03/18 20:25:49
>>145
スマートな方法より可読性を選んだら?
keys %data を三回も呼ぶんだったらアレイに突っ込むだろ。
ついでに、join ',' も二回あるんだったらサブルーチンかなんかにしちまえ。<= 嘘。
sub foo { return join ',', @_ ;} ;
@arr = keys %data ;
my $sth=$dbh->prepare('INSERT INTO test('. &foo( @arr ) .') VALUES('. &foo( ('?') x @arr) ).')');
$sth->execute( @data{ @arr } );

てきとーに書いたから、' とか抜けてても勘弁。

147:nobodyさん
08/03/18 21:49:40
>>138
#!/usr/bin/perl -w
use strict;
use Scalar::Util qw(looks_like_number);
test(@ARGV);
test(map looks_like_number($_) ? $_ : 0, @ARGV);
sub test {
  my($hoge, $fuga) = @_;
  print "hoge:[$hoge] fuga:[$fuga] ";
  $hoge += $fuga;
  print "result:[$hoge]\n";
}

>>144
my $col = join ',', my @col = keys %hash;
my $phs = join ',', ('?') x @col;
my $sth = $dbh->prepare("INSERT INTO test($col) VALUES($phs)");
$sth->execute(values %hash);

148:138
08/03/19 16:21:54 uoUGbd4u
>147さん RESありがとうございます。
>143さん おっしゃるとおりでした。
すいません。デバッグしてみますと整数になっていなかった訳ではなくバグでした。
下記のようなプログラムでタブ区切りのファイル内の$filename
(フォーマットは「名前\t\t\t\t\t\t\t数\t\n」)
でハッシュデータで $hash{名前}->数
とやろうとして下記のようにプログラムを組んでみました。
----------------
open(FH,"$filename"); my @data = <FH>; close(FH);
my %hash = ();
foreach(@data){
my @splitdata= split(/\t/);
if(defined $hash{$splitdata[7]}){
print "<>$splitdata[7]no$hash{$splitdata[7]} ha mouaru<><br>";
}else{
$hash{$splitdata[7]} = 0;
print "$splitdata[7] wo sengen<br>";
}
}
my $key;
foreach $key ( keys %hash ) {
print "$key<br>";
foreach(@data){
my @splitdata= split(/\t/);
if($key eq $splitdata[7]){
print "$hash{$key} ni $splitdata[10] tumari $hash{$key} += $splitdata[10];wo tasu<br>";
$hash{$key} += $splitdata[10];
print "$hash{$key} : $hash{$splitdata[7]}<br>";
}
}
}
(続く)

149:138
08/03/19 16:23:18 uoUGbd4u
(続き)
----------------
それで出力が
print "$hash{$key} ni $splitdata[10] tumari $hash{$key} += $splitdata[10];wo tasu<br>";
$hash{$key} += $splitdata[10];
print "$hash{$key} : $hash{$splitdata[7]}<br>";
の所が
0 ni 2 tumari 0 += 2 ;wo tasu
0 : 0となっていたのですが どのようにすれば
ハッシュデータで $hash{名前}->数
とのハッシュデータを取得できますでしょうか?

以上 ご助力をいただけますとありがたいです。


150:nobodyさん
08/03/19 16:44:42
日本語で

151:nobodyさん
08/03/19 16:56:44
ひどすぎワロタwww

152:nobodyさん
08/03/19 17:13:34
$hash{名前}->数ってこれはリファレンス的な意味じゃないよね?
$hash{名前} = 数で取り出したいってこと?
$splitdata[10]てなに?空じゃないの?
$hashには$hash{$splitdata[7]} = 0; この部分でしか入れてないよね?


153:nobodyさん
08/03/19 17:20:14
> (フォーマットは「名前\t\t\t\t\t\t\t数\t\n」)

$splitdata[0] が「名前」
$splitdata[7] が「数」
に見える。

コードは
$splitdata[7] が「名前」
$splitdata[10] が「数」
っぽいことになってるし、いつのまにか $splitdata[10] に 2 が入ってるし、よくわかんない。

(exists $hash{$splitdata[0]}) かどうか調べて、なかったら用意して
$hash{$splitdata[0] += $splitdata[7] したいんじゃないのかな。

154:153
08/03/19 17:21:25
最後の行 $hash{

155:153
08/03/19 17:23:29
すみません。} を打とうとしたら shift + enter を押して鬱。
$hash{$splitdata[0]} の } が抜けてました。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4937日前に更新/211 KB
担当:undef