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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/11/27 11:35:03ID:DJwiGeFM
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0263nobodyさん04/12/10 16:45:53ID:???
ここはコーディングスレだよな。
0264nobodyさん04/12/10 16:57:05ID:???
$ perl
@fuga = qw(a b c d e f);
$hoge[0] = \@fuga;
($a,$b,$c)=@{$hoge[0]}[1,3,5];
print "\$a=$a \$b=$b \$c=$c\n";
$a=b $b=d $c=f

リファレンス、デリファレンスがわかってないだけ
026525904/12/10 17:08:40ID:???
ありがとう
精進します
0266nobodyさん04/12/10 17:18:07ID:???
>>262
入力をquotometaしてもほとんどどうにもならない。ソースコードの中に
出てくる「表」とかがやばい。というあたりを理解してないあたりで、
たぶんはまるだろうな。合掌。

まあperlのソースをSJISにしようというあたりで終わってるので、不運だ
と思ってあきらめなされ。

いっそ5.8以降にしてuse encoding 'Shift_JIS'で内部処理は全部unicode
にするのがいいかも?

0267nobodyさん04/12/10 17:25:03ID:???
quotemetaしてもあまり意味内ような。
0268nobodyさん04/12/10 21:00:25ID:???
>>262
EUC-JPのコードに依存した処理を探した方がいいかも。
案外ありそう。
0269nobodyさん04/12/10 21:11:53ID:???
正規表現とかでマッチ対象にする場合はquotemetaした方がいいと思うけど、
それがSJISに起因する問題の根本じゃないし。
0270nobodyさん04/12/10 21:40:25ID:???
SJISに移行すること自体が間違い。
0271nobodyさん04/12/10 22:30:33ID:???
sjisからeucへ移行ってのは良く聞くが、逆は聞いた事無い。っつーか正気?
正直、問題がある部分個別に対応するってのがFAかと。
一発でこうすりゃ大丈夫なんて解決策があったら、そもそも問題にならない。
そのプロジェクトマネージャーはきっと馬鹿で、PCと同じエンコードにした方が
作業効率が上がると思ってるんだろう。
0272nobodyさん04/12/10 22:58:04ID:???
そんな馬鹿がよくPMやってられるもんだ。
プロジェクトの敵は文字コードでもなく、バグでもない。
馬鹿なマネージャーの無意味な口出し。
0273nobodyさん04/12/10 23:05:15ID:???
とはいえ馬鹿なマネージャを説得するよりはまだ
バグと格闘した方が楽だったり...
0274nobodyさん04/12/10 23:32:53ID:???
時間の無駄だね。
一生フリーター気分ならそれでもいいだろうけど。
0275nobodyさん04/12/10 23:56:20ID:???
まあ5.8にしてEncode使うのがいいんじゃね?
それはそれで問題出るんだけど。〜とか。
0276nobodyさん04/12/10 23:59:18ID:???
メタキャラが解釈されてプログラムが異常終了するよりはマシ。
0277nobodyさん04/12/11 00:02:57ID:???
perlはunicodeとsjisのマッピングに問題ある?
0278nobodyさん04/12/11 00:15:28ID:???
>>277
perl特有の問題というわけではなく、そもそもunicodeとsjisの
マッピングに問題があるというべきだな。既存の文字コードに
対してちゃんと変換表を決めなかったので複数並立してわけわか
というのが現状で解決の見込みほとんどなし。
>>233のリンク先読んでみ。
0279nobodyさん04/12/11 00:26:52ID:???
>>278
サンクス。
javaだとSJISだったりMS932だったりフラフラしてて「どっちだよオイ!」
って時期があったんだが、perlはどうなのかと思った次第でした。
0280nobodyさん04/12/11 00:37:20ID:???
みんなstrictで書いてる?
0281JAPU04/12/11 00:57:12ID:???
使い捨て以外(= まともにメンテする予定)だと use strict は常識的だと思ってます。

下請けに出すときは,use strict パスしないと一切認めない(no strict は原則不可),
-w で警告つぶせ,が条件でした。
# なので,出せるところがかなり限定されてしまったのですが。

--
> useが使えないって事は無いだろ。

実はPerl4 (ギャー
0282nobodyさん04/12/11 01:05:57ID:???
perl使いってperl使いのクセにこだわる奴は妙にこだわるよな
俺もそれ気味だけど
0283nobodyさん04/12/11 01:17:40ID:???
strict,-w,carp、全部リリース時は外すんだが、そんなもん?
あくまでデバッグ用。Cのassert()に近い感覚なんだが。
0284nobodyさん04/12/11 01:25:27ID:???
あー、でもstrictはともかく、-wとかwarningとかfatalsToBrowserとかが
ネット配布スクリプトにあるとちょっと萎える。
0285nobodyさん04/12/11 02:07:29ID:???
CGIでの事なのだけれど、
use CGI::Carp qw(fatalsToBrowser set_message);
BEGIN {
$CGI = new CGI;
sub handle_errors {
my $msg = shift;
print $CGI->start_html(-title=>'システム-エラー');
print $CGI->h1('システム-エラー'),
$CGI->p($msg),
$CGI->hr,
$CGI->center( $CGI->a({href=>"javascript:history.back()"},"[戻る]") );
print $CGI->end_html;
}
&set_message(\&handle_errors);
}
みたいな風にして、エラー時dieで殺してエラー表示するのってやめた方がいいかな?
028626204/12/11 03:33:34ID:???
皆さん、助言感謝です。
とりあえずまずやることをまとめてみました。


月曜日にプロジェクトマネージャを説得してみます。
0287nobodyさん04/12/11 07:30:08ID:tdpIuDpB
perl OLE で EXCEL のセルを取得すると
日付のところが
Win32::OLE::Variant=SCALAR(0x19e99fc)
となってしまいます

これを元の H16.12.9 の文字列に戻すにはどうしたらよいのでしょうか?
0288nobodyさん04/12/11 07:44:59ID:???
>>287
http://search.cpan.org/~gsar/libwin32-0.191/OLE/lib/Win32/OLE/Variant.pm
元号表記がどう処理されてるかは知らんけど。
0289nobodyさん04/12/11 08:47:42ID:tdpIuDpB
>>288
use Win32::OLE::Variant; すると
普通に 2004/12/09 の文字列が取れるようになりました
元号はこの際どうでもいいです。
どうしても必要なら2004から16に変換します。
0290nobodyさん04/12/11 11:53:42ID:???
use strict;
でundefな変数参照の警告が鬱陶しい。ヒアドキュメントに埋め込むときは特に。
みんなどうしてる?
0291nobodyさん04/12/11 13:18:29ID:i36zMpTH
jcode.plにバグがあってsjisに変換できないのですが、
どうしたらいいのでしょうか?
0292nobodyさん04/12/11 13:23:00ID:???
・・・・・・。
バグだと思う個所を修正してcontribすれば?
029329104/12/11 13:25:27ID:???
>>292
ええっ!?
俺がライブラリを弄るんですか!?
029429104/12/11 13:30:20ID:i36zMpTH
検索したら、バージョン2.xxだとそういうことが起こるらしいんです。
バージョン1.xxならば解決されるらしいです。
そこで1.xxの最終バージョンを入れてやってみたのですが、エラーの量が増えましたorz
029529104/12/11 14:18:27ID:i36zMpTH
ちゃんとしたjcode.plを配布しているサイトはありませんでしょうか?
さっきオフィシャルページからダウソしたやつにはなぜかHTMLタグが入っていました。
HTMLタグを削除してもエラーの個数は変わりませんでした。
もう俺の手元にあるjcode.plはわけがわかりません。
0296nobodyさん04/12/11 14:27:42ID:???
http://www.srekcah.org/jcode/
0297nobodyさん04/12/11 14:42:15ID:???
>>291
もまいの方がわけわからん。もまえが思うバグの内容も書かずにどうしたらいい?とは何様のつもりだ。
029829104/12/11 14:49:05ID:i36zMpTH
これです。

[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Premature end of script headers: c:/yukino/mb.cgi
[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Operator or semicolon missing before & at ./jcode.pl line 171.

[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Ambiguous use of & resolved as operator & at ./jcode.pl line 171.

[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Bareword found where operator expected at ./jcode.pl line 171, near "$&"

[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1]   (Missing operator before amp?)

[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Operator or semicolon missing before & at ./jcode.pl line 171.

[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Ambiguous use of & resolved as operator & at ./jcode.pl line 171.

[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] syntax error at ./jcode.pl line 171, near "$&"

[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Compilation failed in require at c:\yukino\mb.cgi line 22.
#この22行目に require "jcode.pl" を記述してある。


今はエラーの解決よりもちゃんとしたjcode.plが欲しいのですが・・・
0299nobodyさん04/12/11 14:52:29ID:???
ここはコーディングスレ
030029104/12/11 14:56:04ID:i36zMpTH
>>299
すいません、どこで質問すれば教えてもらえますか?
0301nobodyさん04/12/11 14:59:10ID:???
そのエラーでバグ呼ばわりされるjcode.plもかわいそうに・・・

ウザいから終わらせてやる。
jcode.plではなくスクリプトのせい。
作者に聞け。
030229104/12/11 15:05:44ID:???
>>301
俺のスクリプトですか!!!???
でも、それが分かっただけでもOKです。
ありがとうございます、スクリプトを弄ってみます。
0303nobodyさん04/12/11 17:22:34ID:???
>>290
undefな変数参照の警告って

Use of uninitialized value in string at 〜

ならそれはstrictじゃなくてwarnings(または
-wオプション)で出てるものだよ。

普通に書けばはじめから出ないようにできる
と思うけど、どうしてもうざければなるべく
狭い範囲をブロックで囲んで

{
no warnings qw(uninitialized);

...
}

ですかね

0304nobodyさん04/12/11 18:16:16ID:???
defined使えばいいんでないの?長くなるけど。
0305nobodyさん04/12/11 21:28:10ID:???
>>303
それっす。
-wとusr strict;は常に使えとしつけられたので...
HTML::Template使うと良く遭遇した気がします。(最近perlでの開発から離れてるから忘れ気味)
0306nobodyさん04/12/12 21:09:08ID:LYqEO+UH
$hoge = "aaa<br>IMG=img/hoge.jpg<br>bbb<br>ccc<br>IMG=hoge.jpg<br>";
↓
aaa<br><img src="img/hoge.jpg"><br>bbb<br>ccc<br><img src="hoge.jpg"><br>;

このように置換したいのですが、うまくいきません。
$hoge =~ s/IMG=(\S+(.jpg))/<img src="$1">/g;
1回目の「.jpg」をスルーして、最後の「.jpg」までいっちゃいます。
教えてください。
0307nobodyさん04/12/12 21:19:54ID:???
>>306
$hoge =~ s/IMG=([^<]+)/<img src="$1">/g;
030830604/12/12 23:13:37ID:???
おみそれしました。
0309nobodyさん04/12/13 01:12:16ID:UkWYfRd/
2バイト文字(Shift_JIS)をパターンマッチさせたいのですが、どうしたらいいのでしょうか?
テンプレのサイトを見てもよく分からなかったので自分で検索して、
このページが出てきたので書いてある通りにやってみたのですが、
できませんでした。
ttp://mind.f.fiw-web.net/program/perl/tips0502.html
0310nobodyさん04/12/13 01:20:10ID:???
>>309
>1: 自分はこういう事がしたい。
>2: それでこんな風にやってみたが・・・
>3: こんなエラーが出て上手く行かなかった。
031130904/12/13 01:54:21ID:UkWYfRd/
>>310
すいません。

>1: 自分はこういう事がしたい。 
2バイト文字(Shift_JIS)をパターンマッチさせたい

>2: それでこんな風にやってみたが・・・ 
テンプレのサイト([テクニック])を見てもよく分からなかったので自分で検索して、 
このページが出てきたので書いてある通りにやってみた
ttp://mind.f.fiw-web.net/program/perl/tips0502.html

>3: こんなエラーが出て上手く行かなかった。 
エラーは出てません。。
一致したら変数に1が入るようにしてあるのですが、それが入らないんです。
1byte文字ならマッチしたときにちゃんと1が入ります。
0312nobodyさん04/12/13 02:33:04ID:???
>>311
そのサイトコピペしてやったけど普通にできるが。
eucでマッチしなくてsjisではマッチしたことを確認したよ。
0313JAPU04/12/13 03:47:58ID:???
>>307 に補足しておくと。

Perlの正規表現では繰り返し("*", "+") を指定するとなるべく長くマッチしようとします。
なので,
1. "*?", "+?" などの最短マッチ
2. [^<]* のように文字を限定
のいずれかを使用する必要があります。

寝よう…
0314nobodyさん04/12/13 10:17:09ID:???
最近ようやくモジュールというものを覚えてきたのですが、例えばNet::SMTPなどを使用する際に、
use Net::SMTP;
$smtp = Net::SMTP->new('mailhost');
$smtp->mail($usr);
$smtp->to('postmaster');
などと記述しますが、
この場合の$smtpというのはインスタンスのようなもので、
上記の場合のmailやtoというのは、引数を指定した関数呼び出しということでしょうか?
0315nobodyさん04/12/13 10:30:32ID:???
モジュールの中身見てみれ
この場合だとSMPT.pmな
サブルーチンでmailとかtoとかdatasendとかあるから
031630904/12/13 11:10:21ID:rJW07thI
>>312
コピペでやってみましたができませんでした。

検索対象の文字コードと、検索語句の文字コードはどちらもsjis。
出力して確認してみたのですが、
双方とも同じ文字列かつ、同じ文字コードであるにも関わらずパターンマッチしません。

関係あるか分かりませんが・・・
検索対象の文字列はサーバー側に保存してあるデータを取り出し、
それをsplitで区切って準備しています。
その文字列は保存する際にsjisに変換して保存しています。
検索語句の文字列はブラウザから入力された文字列をCGI内部でデコードし、
jcode.plを使用してsjisに変換しています。
0317nobodyさん04/12/13 11:43:29ID:???
>>316
とりあえず再現する最小コードをカキコ汁。
031830904/12/13 13:32:52ID:rJW07thI
>>317
これです。
最小コードで、コマンドラインから確認しました。

#!C:/perl/bin/perl

require "jcode.pl";

$word="変数の型";
$s="型";
&jcode::convert($word,"sjis");
&jcode::convert($s,"sjis");

$sjis=q{
    [\x00-\x7f]|[\xa0-\xdf]|
    [\x81-\x9f\xe0-\xfe][\x40-\x7e\x80-\xfc] };

########マッチするかどうか
if ($word=~/(?:$sjis)*?$s/){
    print"OK\n";
}else{
    print"NG\n";
}

exit;
0319nobodyさん04/12/13 15:32:49ID:???
2byte文字の正規表現は
(?:[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])
ではないかと。
0320nobodyさん04/12/13 16:29:18ID:hnMBax6X
現在perlでWEB作成をしておりますが
sendmailでつまづいております。
if (!open(MAIL,"| $sendmail -t $to")) { return(1); }
ユーザが入力したメールアドレス($to)に不正なアドレスが
入力されるとsendmailでエラーを吐いて、落ちてしまいます。
(Invalid host name・・・・)
メールアドレスを正規表現を使って全てチェックするのが
困難なのでsendmailのエラーをキャッチしたいのですが
無理なのでしょうか?
0321nobodyさん04/12/13 16:58:37ID:???
$!
0322nobodyさん04/12/13 17:01:58ID:???
>>320
Email::Valid
Email::Valid::Loose
0323nobodyさん04/12/13 17:37:37ID:???
322>>
ありがとうございます。
携帯(docomo等)でも受け付けるため Email::Valid::Loose
を使用するということまではわかりました。

少し試してみます。
0324nobodyさん04/12/13 17:39:15ID:???
>>322
ところで・・・sendmailのエラーをそのまま
キャッチする方法はないのですか?
無いなら、無いで結構です。
調べてもなかったので気になったもので・・・。
0325nobodyさん04/12/13 18:04:58ID:???
ここで質問する内容にあってるかどうかわかりませんが・・・

MySQLが使えるレンタル鯖を借りてMySQLを使用する
ショッピングカートのCGIを設置したのですが、まったく動きません。
レンタル鯖のサポートへ確認したところ
「うちの鯖はMySQL+PHPだけのサポートでPerlからのMySQL操作はサポートしていません。」
と言われましたorz

んで、色々と調べたところDBI.pmやDB.pm、mysql.pmとかをCGIファイルと同じ場所に置いて
requireで呼び出せば use DBI が使用できるというようなことがわかったのですが、
それを呼び出してもやっぱりエラーが出て使用出来ませんでした。

require "./DBI.pm";
require ",/DB.pm";
require "./mysql.pm";
use DBI;

としているのですが、他に必要なモジュールがありましたら教えて下さいm(_ _)m
ちなみにDBIを使用しないCGIは正常に動作しています。
ショッピングカートCGIも、ローカルPCのWin環境での動作確認はOKでした。

結構高いお金払ってるのでなんとかこのレンタル鯖でCGI-MySQLを動かしたいのです。
どうしようもなければPerlでMySQLの操作をサポートしているレンタル鯖へ乗り換えますが・・・

レンタル鯖の仕様は
 Sun Cobalt RaQ550 / Linux
 Apache(バージョン不明)
 Perl 5.6.1
 Mysql 3.23.56
です。
宜しくお願いしますm(_ _)m
0326nobodyさん04/12/13 18:15:35ID:???
>>325
DBI だけでなく DBD::mysql が必要。
ただし DBD::mysql は xs モジュールなので、mysql.pm を置くだけでは動かない。
make する作業が必要 (Cコンパイラ必須)。
0327nobodyさん04/12/13 18:19:59ID:???
>>324
>>321 が答えているし、公式ドキュメントの FAQ にも書かれている。
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#How_can_I_capture_STDERR_from_an
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#How_can_I_capture_STDERR_from_an
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#Why_doesn_t_open_return_an_err

>>325
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html#Perl_Modules
http://homepage3.nifty.com/hippo2000/perltips/module_install.htm
032832704/12/13 18:23:53ID:???
>>327
訂正。
s/capture_STDERR_from/open_a_pipe_both_to/;
032932504/12/13 18:33:18ID:???
>326,>327
回答ありがとうございます。
DBD::mysqlのコンパイルにチャレンジしてみます。

ちなみにCPANからのモジュールインストールはやってみたんですが、
「モジュールインストールは許可していません」ってレンタル鯖業者から怒られましたorz
0330nobodyさん04/12/13 18:34:42ID:???
>>329
あたりめーだ
0331nobodyさん04/12/13 20:21:11ID:???
>>318
if ($word =~ /(?:$sjis)*?\Q$s\E/){
クォートメタを忘れずに。

型は\x8c\x5eというコード。
\x5eこと"^"は正規表現の先頭にマッチだから、
マッチすることなく常にNGとなる。
>>54-58あたりを参照。
0332nobodyさん04/12/13 23:51:01ID:a6u3bRjN
DBI DBD::mysql つかって MySQLサーバに問い合わせするとき
スクリプトがMySQLサーバに送信するデータの漢字コードってどうやって決まるの?

多分MySQLサーバに接続するときに、このキャラクタセットを使いますよって言ってる
と思うんですけど、そのキャラクタセットはどうやって決められてる?
0333nobodyさん04/12/14 06:27:56ID:???
>>332
http://dev.mysql.com/doc/mysql/ja/Charset-connection.html

以後、MySQL の質問は DB 板へ。 http://pc5.2ch.net/db/
少なくとも Perl::DBI スレへ。 http://pc5.2ch.net/test/read.cgi/php/1015943725/
0334nobodyさん04/12/14 07:07:42ID:???
ちょっと思いついたんですが、SJISで全角数字を半角にするには、

$num = "20041214";
$num =~ s/[\x82]//g;
$num =~ tr/O-X/0-9/;

こういうのって何か問題あったりしますか?
0x82はSJISの2バイト目にも現れないようなのですが、他にいい方法があったりしますかね。
0335nobodyさん04/12/14 08:33:46ID:???
>>325
すなおにPHPの使えばいいんじゃないの
0336nobodyさん04/12/14 09:23:02ID:???
SJISって/0-9/みたいな指定ってできたっけか
&jcode::tr (\$value, "0123456789", "0-9");
これで動かない?
0337nobodyさん04/12/14 12:41:51ID:???
>>334
$numがSJISの数字のみからなる文字列と保証できるなら
それでいけるだろう。

でもSJISは何かとperlでは扱いにくいので避けたほうが
いいと思うけどな。入り口出口で変換して内部はEUCが
楽だと思う。

unicodeが日本語についてあんなに変じゃなけりゃ5.8
以降でunicode使うともっと楽だったんだろうけどね。
0338nobodyさん04/12/14 14:14:33ID:XUzVLI8W
LinuxのPerl(ver5.005_03)にて、あるファイルを定期的に解析し、結果を
=========================
・・・・・・・・
・・・・・・・・
open(OUT,">> log.csv");
print(OUT "$count\n");
close(OUT);
exit;
=========================
のような感じでログを出力するスクリプトを作成しました。

しかし、コンソールから直接起動すると正常に出力が完了するのですが、( # /フルパス/script.pl )
同じコマンドをcronにて実行すると、上記の出力の部分のみが実行されません。
(上記の出力部 以前は実行されます)

この原因として何が考えられますでしょうか?

ちなみに、コンソール、cronともrootで実行しており、
出力先フォルダ、出力ファイル(log.csv)の所有者名・グループ名はともに「root」
実行ファイル(script.pl)の権限は「755」、出力ファイル(log.csv)は「644」です。

スクリプトに問題がありそうということでしたら、
詳細の内容を記載させていただきます。

よろしくお願いします。
0339nobodyさん04/12/14 14:22:22ID:???
なぜ出力ファイルが644なのか教えてもらおうか
034033804/12/14 14:26:55ID:XUzVLI8W
補足です

上の書込みでは 「 /フルパス/script.pl 」のように書いてしまいましたが、
実際に起動してるコマンドは以下です。
( script.sh から script.pl を読込み )
「/フルパス/script.sh」

コンソールからは正常に動作しcronでは実行されない現象は、

 1.「/フルパス/script.pl 引数1 引数2」
 2.「/フルパス/script.sh」

1,2 のどちらのコマンドでも発生します。
また、script.shの権限も「755」です。

■crontab の内容(毎時5分に実行)
5 * * * * /フルパス/script.sh

■script.sh の内容

/フルパス/script.pl 引数1 引数2
/フルパス/script.pl 引数1 引数2
/フルパス/script.pl 引数1 引数2
・・・
・・・(全20行)

なんかPerlの質問じゃないみたいになってしまいました、すいません
034133804/12/14 14:30:57ID:XUzVLI8W
>>339

所有者(root)の書込み権限があれば良いと思い
「-rw-r--r--」
と設定してます
0342nobodyさん04/12/14 14:47:00ID:???
コンソールから実行できて cron で実行できない場合にまず疑うべき項目としては

1. 実行権限に問題は無いか
2. スクリプトや入出力先をカレントからの相対パスで指定していないか
0343nobodyさん 04/12/14 14:58:29ID:???
>>338
open(OUT,">>log.csv");
実際のソースにもスペースあんのか知らんが・・・
0344nobodyさん04/12/14 15:00:03ID:???
log.csv がフルパスじゃないじゃん
034533804/12/14 15:06:20ID:XUzVLI8W
>>342
解決しました!
> 2. スクリプトや入出力先をカレントからの相対パスで指定していないか
が原因でした。

open(OUT,">> log.csv");       の部分を
open(OUT,">> /フルパス/log.csv");
とすることで目的の動作を行うことができました。

基本的なミスで、板汚し申し訳ございませんでした。
でもとても参考になりました。ありがとう!
0346nobodyさん04/12/14 15:41:30ID:???

- - - - - ここまでは、ご覧の釣堀の提供でお送り致しました - - - - -
0347nobodyさん04/12/14 16:09:00ID:???
openの戻り値ぐらいはちゃんと見ろよな
0348nobodyさん04/12/14 18:58:59ID:???
>>334
文字列に数字以外が混じると嫌だから、もうちょっと安全に書くかな。
(規格上は\x82も2バイト目に含まれるから、頭からかじらないとダメなんだけど…。)

my %z2h_num;
@z2h_num{qw(0 1 2 3 4 5 6 7 8 9)} = (0..9);

my $num = "20041214";
$num =~ s/(\x82[\x4f-\x58])/$z2h_num{$1}/g;

元の仕様のままでいいなら、
$num =~ tr/O-X\x82/0-9/d;
とかが効率良さそう。
0349nobodyさん04/12/15 00:07:10ID:8kSVNViR
Encode::from_toでsjisからeucへ変換して使用しているのですが、旧漢字などの
場合に文字化けしてしまいます。

この場合に、文字化けしたかどうかを調べるにはどのようにしたら良いのでしょうか?
0350nobodyさん04/12/15 09:24:08ID:3pwV+643
見様見真似でパッケージを使ったオブジェクト指向を始めてみたのですが。
クラス(と言っていいのかな)の要素に配列を含めるとうまく動きません。
下のコードだと配列の 0 番目しか認識できませんでした。
どこが間違っているかわかりますか。
ってか、そもそも要素に配列を含めること自体は可能なことなんでしょうか。

package Test;

sub new
{
 my $this=shift;

 my @list=(9,8,7);
 my $test={
  "list" => @list
 };
 bless $test,$this;

 return $test;
}

package main;

$test=new Test();
print "test->list[0]=",($test->{list})[0],"\n";
print "test->list[1]=",($test->{list})[1],"\n";
print "test->list[2]=",($test->{list})[2],"\n";
0351nobodyさん04/12/15 09:29:58ID:8kSVNViR
\@list
035235004/12/15 10:02:46ID:3pwV+643
>>351
解決しました!ありがとうございます!
すみませんがもうひとつ質問させてください。

package Test;
sub new
{
 my $this=shift;

 my @list=(9,8,7);
 my $test={
  "list" => \@list
 };
 bless $test,$this;

 return $test;
}

sub set
{
 my $this=shift;

 # @$this->{list}=localtime(); #←だめぽ
 my @t=localtime();
 $this->{list}=\@t;
}

set っていう関数の中で list の中身を localtime に入れ替えたかったのですが
「だめぽ」の行だと「Not an ARRAY reference」と言われ失敗したので、
その下の2行にしたらうまくいきました。
配列をまるごと入れ替える場合はこうやって2行にするしか方法がないのでしょうか。
もうちょっとスマートな定番の方法があったら教えてください。
0353nobodyさん04/12/15 10:28:54ID:???
>>352
@{$this->{list}} = localtime();

これと352の下の2行は意味が違うのに注意。これは
$this->{list}に入っているリファレンスが示す配列の
中身を置き換えるが、352の方法では$this->{list}を
新しく作った配列へのリファレンスで置き換えること
になる。


0354350=35204/12/15 11:13:34ID:3pwV+643
>>353
ああ、なるほど。意味はわかっていました。
中身を書き換えたかったんです。リファレンスの置き換えは苦肉の策でした。
自分では、
@($this->{list}) = localtime();
ってのも試してましたがエラー。カッコの種類が違ったんですね…。

ありがとうございました!ほんと助かりましたです。
0355nobodyさん04/12/15 11:49:23ID:???
基礎浅杉
0356nobodyさん04/12/15 13:02:39ID:???
$test =~ s/\x0D\x0A|\x0D|\x0A| | //g;

の最後の全角スペースがどうやら引っかかっていない
みたいなのですが、全角文字は違った表記で書かなくては
ならないのでしょうか。

ご教授いただけると有難い次第です。
0357nobodyさん04/12/15 14:20:09ID:???
>>356
Perlメモ見れ
文字コードがなにかわからんけど、全角文字のマッチでバグるパターンがある
0358nobodyさん04/12/15 16:39:05ID:???
>>357
全角スペースは(?:\x81\x40)で表現しなきゃいけなかったんですね。
勉強になりました。
有難うございます。
0359nobodyさん04/12/15 17:17:16ID:???
>>358
それもあるが、1バイトずれてマッチすることもあるから
注意してね。

たとえば$testの値が「a@」なんてときは(?:\x81\x40)に
マッチしちゃうよ。(「a@」は"\x82\x81\40"なので。)

ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Match
0360nobodyさん04/12/15 20:07:39ID:M/kRzQtl
ログを表示するものを作っています。
引数のデータとログ中の一致するデータを表示する物です。
ページ送りがあるので配列の行数を得たいので
読み込んだログを配列に入れたいのですが、ここで悩んでます。

100KBのログの読み込みを250回繰り返した結果です。

1番目 2.6秒
open(FL, "パス");
while(<FL>){
push(@dump, $_);
}
close(FL);


2番目 4.3秒
open(FL, "パス");
@dump = <FL>;
close(FL);

上記の様になりました。
1行ずつ処理すると軽いといいますが、
1番目の物でも1行ずつ処理している事になっているのでしょうか?
いったん全て読み込む必要のある物は1番だと手順が増えて
2番の方がよさそうに見えていたのですが。

現在、ローカルでしかテストできる環境がないため、
実動作でも有効なのでしょうかご教授下さい。
0361nobodyさん04/12/15 20:48:10ID:???
>>360
必要なものだけ入れれば? いや、ログが膨れ上がったりしないのならいいが
0362nobodyさん04/12/15 20:51:19ID:???
> 現在、ローカルでしかテストできる環境がないため、
> 実動作でも有効なのでしょうかご教授下さい。

(´-`).。oO(何のためのローカルテストなんだろう)
■ このスレッドは過去ログ倉庫に格納されています