10/06/09 22:41:24
use strict するとエラーが発生するCPANモジュールは登録しないで欲しい。
535:デフォルトの名無しさん
10/06/10 00:15:55
>>534
まさかstrictにrefs入れてないよね?
536:デフォルトの名無しさん
10/06/10 02:01:07
use stritc;
しておいて必要なところだけブロック切って
no strict 'refs';
だろjk
537:デフォルトの名無しさん
10/06/10 12:14:48
>>534
obsoleteなブツなんでないの?
同等以上の新しいモジュールがあるだろ。
538:デフォルトの名無しさん
10/06/10 17:21:59
test.txt文書内にある
abc001.jpg
abc002.jpg
という2行の文字列を
<Vol.001>abc001.jpg
<Vol.002>abc002.jpg
と書き換えてoutput.txtに書き出すPerlスクリプトを書きたいと思っています。
しかし、test.txt内の文字列が1行の場合には上手くいきますが、
例のような複数行では
<Vol.001>abc001.jpg
abc002.jpg
となってしまいます。
どこが間違っているのでしょうか?
#!/usr/bin/perl
use strict;
use warnings;
$a="test.txt";
$b="output.txt";
open my $in , '<', $a or die "Cannot open '$a': $!";
open my $out, '>', $b or die "Cannot open '$b': $!";
while(<$in>){
s/abc(.+?)\.jpg/<Vol\.$1>abc$1\.jpg/;
print $out $_;
};
close($in);
close($out);
539:デフォルトの名無しさん
10/06/10 17:55:00
そのままコピペしたけどちゃんと動いたぞ?
あと関係ないけど、せっかくuse strictしてるんだから$a , $b はつかうな
540:デフォルトの名無しさん
10/06/10 20:11:20
配列の宣言についての質問なんですが
my @x=(1,2,3,4,5,6,7,8);
my $y=100;
my @pi =(@x/$y);
この様に@で配列を制限し
my @piの中身を1/100,2/100,3/100,4/100,・・・
として以下の計算につなげたいのですが、
どうしても上手くいきません・・・
foreach文なども試してみましたがダメでした
非常に低レベルの質問ですがどうかご教授よろしくお願いします
541:デフォルトの名無しさん
10/06/10 20:19:29
my @x=(1,2,3,4,5,6,7,8);
my $y=100;
my @pi;
foreach my $tmp (@x){
push(@pi, $tmp/$y);
}
foreach my $tmp (@pi){
print "$tmp, ";
}
542:デフォルトの名無しさん
10/06/10 21:06:34
key1, key2, ..., keyN, Value (N=10程度)
のようなレコードを持ったCSVファイルに対して,
keyA=AAAかつkeyB=BBBのレコードのValueの合計,平均,...etc
といった統計を計算する最もスマートな方法を教えてください.
レコード数は数十万~数百万行を想定しています.
543:デフォルトの名無しさん
10/06/10 21:38:31
>>524
ourで宣言すればおk。
でも保持できるのはプロセス単位だから共有メモリ使った方がいいと思う。storableとか
544:デフォルトの名無しさん
10/06/10 22:03:32
>>540
URLリンク(perldoc.jp)
my @pi = map $_ / $y, @x;
545:デフォルトの名無しさん
10/06/10 22:19:50
my @pi = map {$_ / 100} (1 .. 8);
print "$_, " for (@pi);
546:540
10/06/10 23:13:47
>>541、>>544、>>545
わざわざ理解しやすい回答ありがとうございます
早速スプリクトに組み込んでみます
547:デフォルトの名無しさん
10/06/11 00:01:18
>>542
その数ならDBに突っ込んでSQLでやる
548:デフォルトの名無しさん
10/06/11 00:24:13
合計と平均なら頭から読んで足したり数えたりするだけで
いいと思うけど。
549:デフォルトの名無しさん
10/06/11 03:47:48
>>539
コメントありがとうございます。
問題点は、入力用ファイルの改行コードでした。
改行コードをUnixではなくMacの改行コードにしていたので、
2行が1行と認識されてしまっていたようです。
ずっと正規表現の問題だと思っていたので、コメントのおかげで別の観点で見直すことができました。
素人なのでもう一つ質問させてください。
>$a , $b はつかうな
というのは、意味のない変数名を使うのではなく、
$infile,$outputfileなどのように一目で意味のわかる変数名を使いなさいということでしょうか?
550:デフォルトの名無しさん
10/06/11 03:51:22
>>549
$aと$bはsortの時に使われる。つか、use strictしてるのにmyなしで動いてる時点で「あれ?」ってなったでしょ?
perldoc -f sort
> global variables $a and $b
551:507
10/06/11 06:33:39
>>550
丁寧にありがとうございます。
色々調べてやっと仰っていることが理解できた気がします。
やはり、初めてのPerl初版本を読んでいた弊害がありそうです。
でもこのサンプルコードによるPerl入門は素晴らしいですね。
URLリンク(d.hatena.ne.jp)
552:デフォルトの名無しさん
10/06/15 18:38:48
指定の処理を行いログを出力するプログラム hoge.plと
そのログを読み込み解析し出力する analyst.plを作り、
普段はhoge.plを使いたまにanalyst.plを実行するという事をしてきました。
今回その解析済みログを利用するためにhoge.plの中でanalyst.plを実行させたくなったのですが
require('analyst.pl');としたところ"\x{00cd}" does not map to cp932 at analyst.pl line 12.
というエラーが大量に出ました。
これは両方のplファイルにuse utf8; binmode STDOUT ":encoding(cp932)";があり
analyst.plでutf8からcp932に変換されたものがhoge.plでさらにcp932に変換されているからのようで
analyst.pl内のbinmode~;をコメントアウトするとうまく動くようになりました。
しかしanalyst.plの単独実行時にうまく動かなくなりました。
このような場合どうすれば両立させることができるのでしょうか?お知恵を貸して欲しいです。
This is perl, v5.10.1 built for MSWin32-x64-multi-thread
553:デフォルトの名無しさん
10/06/15 19:01:09
>>552
ちょっと面倒だけど新たにAnalyst.pmを作成し、そこにanalyst.plの機能を全部放り込んだサブルーチンを作り、
hoge.plとanalyst.plはそれを読み込み実行すれば両立出来るよ。
hoge.plとanalyst.plの二つのファイルだけでは・・・できるのかな?
554:デフォルトの名無しさん
10/06/15 20:02:21
>>553
そこまでするならモジュール化すればいいだろw
555:デフォルトの名無しさん
10/06/15 20:06:22
試してないけど ':raw :encoding(cp932)' みたいにレイヤー重ねがけすればとりあえず動くんじゃね
556:デフォルトの名無しさん
10/06/15 20:43:23
>>552
requireする前にbinmode STDOUT=>":raw";
あるいはanalyst.pl内のbinmode文をbinmode STDOUT=>":raw:encoding(cp932)";
557:552
10/06/15 21:25:50
なるほど、:rawを重ねると生データにリセットできるんですね。
requireする前に一行追加することで簡単に実現出来ました。
呼び出し前に:rawにして呼び出し先で:cp932に再セットされるという流れもなんだか良いです。
>>553-556
みなさんレスありがとうございました。
558:552
10/06/15 21:54:21
このスレ雰囲気良いね
559:デフォルトの名無しさん
10/06/16 03:43:58
一気に雰囲気が悪くなった
560:デフォルトの名無しさん
10/06/16 05:22:30
そんなこというなよ…
561:デフォルトの名無しさん
10/06/16 17:53:09
perlスクリプトファイルのコメント部分だけ取得する良い方法はないでしょうか?
単純に # より前を消すみたいのを自分で作ってたんですが、print '#'; とか、s#a#b#;
というのも考えられるなとか、ヒアドキュメント中の # はどうするとか、、、
私の脳みそでは確実に無理なので、なにかないでしょうか?
562:デフォルトの名無しさん
10/06/16 19:11:59
つ正規表現
563:デフォルトの名無しさん
10/06/16 19:59:14
m{
hoge # not comment
}
と
m{
hoge # comment
}x
の区別とか想像しただけで嫌になるよなw
564:デフォルトの名無しさん
10/06/16 20:23:53
>>561
perltidyとかは?
565:デフォルトの名無しさん
10/06/16 20:30:46
$_ = '1"##"#a"';
print qq#\# match #, '#', "\n" if /"#a/ && m#[^\#]\##; # こめんと; { #" ですよ}
考えてみようとして例を作っただけでつらくなってきた
566:デフォルトの名無しさん
10/06/16 20:42:23
PPIとか使ってみれば? 正規表現の中のコメントは対応
できてないみたいだけど、他は結構いけるようだよ。
567:デフォルトの名無しさん
10/06/16 23:08:27
正規表現のxオプション使ってる?
568:デフォルトの名無しさん
10/06/17 00:40:40
>>561
Text::Balanced とかは?
569:デフォルトの名無しさん
10/06/17 03:22:58
とりあえず#の後に;がない行を抜き出してみて、それでどれくらい引っかかるか見てみれば?
厳密にやろうと思えば何らかのPerlパーサを使わないと、正規表現でちょいちょいやるっていうのは無理だろうな。
570:561
10/06/17 10:33:00
>>562-569
ありがとうございます。なかなか難しいんですね・・。
気づいたのですが、秀丸とか(ほぼ)ちゃんとコメント色分け出来てますよね。
やっぱり偉大なソフトですね・・。
571:デフォルトの名無しさん
10/06/17 11:57:22
どの辺までフォローしてるのかしらんけど
Regexp::Common::commentとか