07/02/10 03:46:04
> ファイルを新規に保存するときファイルと同名のフォルダをつくりたい
なんじゃそりゃ??
603:デフォルトの名無しさん
07/02/10 03:54:30
どの OS でテストしてるんだか知らないけど、ファイルシステム側の問題だろう。
例えば Windows では同名のファイルとフォルダは作れない。
604:601
07/02/10 04:31:21
>>603
すみませんでした。windows xp, active perl環境です。
>例えば Windows では同名のファイルとフォルダは作れない。
これは知りませんでした。というか大昔に聞いたことがあるような気がしますが
盲点でした。
mkdir($filename."Folder");
のようにしたら("作成したファイル名"Folder)という名前でフォルダが出来ました。
自分の考えている機能としてはこれで十分先に進めそうです。
ありがとうございました。
605:デフォルトの名無しさん
07/02/10 13:39:41
て言うか、同名のファイルとフォルダを作れるファイルシステムってあったっけ?
606:デフォルトの名無しさん
07/02/10 13:43:46
同名のファイルとフォルダがあるとApacheがまいっちんぐしちゃうよ
607:デフォルトの名無しさん
07/02/10 15:15:31
>>605
むかし、「同名のファイルとディレクトリ作れるんじゃねえ!!」と怒った記憶がある。
608:デフォルトの名無しさん
07/02/10 17:42:01
これも拡張子を非表示にするゆとり教育の弊害か…
609:デフォルトの名無しさん
07/02/10 18:27:55
これもファイル名とディレクトリ名を同じ名前空間に置くという異常なことを
やったUNIXの弊害か……
610:デフォルトの名無しさん
07/02/10 18:44:58
初学ながらリファ本片手にCGIスクリプトを書いています。
下記のような問題にぶつかるもどうにも解決方法がわかりません。
どうすればよいか教えてください。よろしくお願いします。
【やりたいこと】
投票CGIの改造で、イエスノーの2択の選択肢の投票に応じて、表示されて
いる数字も増減されるようにしたい。 数字の増減はカウンタスクリプトを流用し
ています。
【現在書いているスクリプト(抜粋)】
open(FILE, "+<./count.dat") or die("エラー:カウントファイルが開けません");
eval { flock(FILE, 2); };
$counta = <FILE>;
seek(FILE, 0, 0);
if($item == 1 ){ print FILE $counta+1 } else { print FILE $counta-1 }
close(FILE);
【問題点】
例えば現在の$countaの値が100で、値が-1される場合、結果は99となって欲しいのに、990と
なって返ってきます。1000から999の場合なども同じです(どうも桁数が減る場合にうまく動作し
てくれない模様)。
【解決したいこと】
100が99になって欲しい場合、その動作が990とならず希望どおり表示されるようにしたいです。
【その他】
同じ桁数が変わる場合でも、99→100など、桁数が増える場合は問題が発生しないです。
611:デフォルトの名無しさん
07/02/10 18:45:26
ファイル名とディレクトリ名の名前空間が異なるなんて想像したら
そちらの方が異常だと思うが。
そもそもそいった実装のOSはあるんかえ?
612:デフォルトの名無しさん
07/02/10 18:58:46
>>609
最近それで頭に来てる。百万個を越えるファイルを持つ非常に巨大なファイルツリーを
トラバースするのにリソース食いまくり。
やっぱり分けてあるシステムってあるんだ。
613:デフォルトの名無しさん
07/02/10 19:19:45
>610
use Fcntl qw/:flock/;
open my $fh, '+<', './count.dat' or die $!;
eval { flock $fh, LOCK_EX };
$count = <$fh>;
seek $fh, 0, 0;
print $fh $item == 1 ? $count + 1 : $count -1;
truncate $fh or die $!;
close $fh;
614:610
07/02/10 19:27:24
>>613
正直、書かれている内容がさっぱり分からないので、リファ本で読み進めながら
テストしたいと思います。ありがとうございます。
615:610
07/02/10 21:14:23
>>613
早速アドバイスを実装したところ、思った通りに動いてくれました。
どうもtruncateがポイントだったようですね。ありがとうございました。
616:デフォルトの名無しさん
07/02/11 04:18:34
正規表現でマッチしたものを任意の変数に入れて(もしくは任意のエイリアスに結びつけて)、
後で取り出すことって出来るのでしょうか?
マッチした順に$1や$2ではなく、(.*?>$name)とかした時、
(.*?)のマッチを$nameで受け取れると非常に嬉しいのですが。。
どなたかアドバイスいただけると嬉しいです。。
617:デフォルトの名無しさん
07/02/11 05:58:10
>>616
マッチした後に代入しておくんじゃなんで駄目なんだ?
if (/(.*?)/) {
$name = $1;
}
618:デフォルトの名無しさん
07/02/11 06:01:14
>>616
マッチしたもののリストが返ってくるのでそれを受け取る
($a, $b) = /^(.)(.)/;
619:616
07/02/11 09:49:39
>>617-618
返信ありがとうございます _ _
なぜエイアリアスに結びつけたいかというと
βのウェブサービスのラッパーを作っていて、
正規表現がころころ変わる可能性がある(欲しい文字列が前後する可能性がある)からです。
欲しい文字列が前後してしまうと正規表現だけでなく、
その後の正規表現を受け取るコードも変更しなければならなくなってしまうので。。
# 正規表現を正規表現で自動生成するスクリプトを作っていたら、
# 文字列が前後した場合その部分は自動化できなくなってしまうことに気づき、
# 質問させて頂きました。
620:デフォルトの名無しさん
07/02/11 11:04:20
>>588,599
それは文字化けでなく、エスケープされてるだけ。
Data::Dumper の仕様
621:デフォルトの名無しさん
07/02/11 11:30:06
詳説正規表現第2版 7.8.8 名前つきキャプチャを模倣する
(.*?)(?{ $name = $^N })
622:592
07/02/11 15:22:43
タグそのものだけでなく、例えば<pre>の内側はエスケープしない、など、
ちょっと込み入っている場合、例外事後処理だと信じられないほど遅くなりました。
コーディングに問題があったかも知れませんが。
という訳でスプリット型に戻しました・・。もっとうまい方法があるでしょうか。
sub escape_limited {
my %args = (str => '', exception => [], exception_block => [], @_);
my @regexp_array;
(scalar @{$args{'exception_block'}}) and push(@regexp_array, sprintf(q!<(%s)\b.*?>.+?</\2>!, join('|', @{$args{'exception_block'}})));
(scalar @{$args{'exception'}}) and push(@regexp_array, sprintf(q!</?(?:%s)\b.*?>!, join('|', @{$args{'exception'}})));
return &loop($args{'str'}, join('|', @regexp_array));
sub loop {
if ($_[1]) {
my @scraps = split(/($_[1])/is, $_[0], 2) ;
return &escape($scraps[0]). $scraps[1]. &loop(pop(@scraps), $_[1]) if ((scalar @scraps) >= 3);
}
return &escape($_[0]);
}
}
623:デフォルトの名無しさん
07/02/11 18:28:22
>>619
たぶんアプローチが根本的に間違ってる。
624:616
07/02/11 19:05:54
>>621
ありがとうございます!知らなかったです使わせて頂きます。
URLリンク(search.cpan.org)
>>623
良くあるので、今回もそうかもしれないのですが;
URLリンク(www.nicovideo.jp)の検索のラッパーとして、
URLリンク(www.kiseki.info)を作りました。
そして、上記ラッパーの正規表現生成に、
URLリンク(www.kiseki.info)
というコードを使っていました。(>>621さんのアドバイス未導入コード)
お暇があればアドバイスいただけると幸いです。
625:デフォルトの名無しさん
07/02/11 22:38:26
前から疑問に思ってたんですが、
$input = 'hoge';
$output = $input;
$output =~ s/ho/ha/g;
return $output;
これを$outputを使わずにreturn &func($input, /ho/, 'ha');
みたいに表現することはできないんでしょうか。
626:デフォルトの名無しさん
07/02/11 22:54:33
こんなん?
join('ha', split(/ho/, $input))
627:デフォルトの名無しさん
07/02/11 23:09:34
return str_replace('ho', 'ha', $input);
628:デフォルトの名無しさん
07/02/11 23:11:41
>>627
どこの国のPHPだよ
629:デフォルトの名無しさん
07/02/12 00:06:59
関数的な操作が充実してる割に標準でついてる関数がほとんど破壊的なんだよな
630:592
07/02/12 00:10:16
すみません、うそを言いました。594さんのがやっぱり一番速いです。
遅くなったのはバグでした。スレ汚しすみません。
631:デフォルトの名無しさん
07/02/12 02:58:08
パッケージが提供してる関数の一覧って簡単に取得できますか?
632:631
07/02/12 03:15:00
ちょっとぐぐったら見つかりました。すみません。
URLリンク(search.cpan.org)
サブクラスなどにもぐっていく処理もありますが、どうもこの行がミソのようでした。
keys %{ "$module::" }
633:デフォルトの名無しさん
07/02/12 07:44:44
動的に生成された複数のPNG画像データをzip圧縮したいと考えています。
GDモジュールとArchive::Zipモジュールが活用できそう、
と調べたのですが不明点があります。
Archive::ZipモジュールのaddFileメソッドは引数としてファイル名が必要ですが、
GDモジュールのpngメソッドで動的に生成されたPNG画像データをzip圧縮するにはどうしたら良いでしょうか。
生成されたPNGデータをbinmodeを使用して画面表示するサンプルは見かけたのですが・・・
Perlを勉強し始めたばかりで基本事項も良く分からず五里霧中です。
アドバイスのほど、よろしくお願いいたします。
634:デフォルトの名無しさん
07/02/12 09:40:25
addString
635:デフォルトの名無しさん
07/02/12 13:43:39
system() で所定の場所からwgetでファイルを持ってくる処理を作っています。
必ずしもその場所にファイルがあるとは限らないので、ファイルが無かった時と
接続出来ないなどで取ってこれなかった時を判定したいのですが、どうすれば
よいのでしょうか?
636:デフォルトの名無しさん
07/02/12 13:47:37
system関数の戻り値でチェックできないの?
637:デフォルトの名無しさん
07/02/12 14:20:49
>>636
ありがとうございます。
やってみましたが、ファイルが無かった時も接続できなかった時も、戻り値は
256となるので区別がつかないです・・。
638:デフォルトの名無しさん
07/02/12 14:21:07
wgetの複雑な機能をバリバリ使ってるなら別だが、ただファイルとってくる
だけならLWP使う方がその辺のエラー処理は書きやすいと思うけどな。
639:デフォルトの名無しさん
07/02/12 14:39:33
>>638
すみません、wgetを使わないといけないので別の方法で取ってくるというのは
出来ないのです。
640:デフォルトの名無しさん
07/02/12 15:06:35
美しくないがstderr読むしかないだろう
641:デフォルトの名無しさん
07/02/12 15:11:25
接続とファイル存在チェックだけ別ルーチンで作っといて、
それがOKならwgetで取ってくるってのはどうだ?
642:デフォルトの名無しさん
07/02/12 15:59:14
>>640,641
ありがとうございます。>>640さんの方法の方が簡単そうなのでこちらで
いこうと思うのですが、
open(STDERR, ">> errmsg.txt");
$ret = system("wget ~");
close(STDERR);
とやって、$ret が256 だったらerrmsg.txtを1行づつ読み込んで
[ 404 Notfound ]という文字列が見つかったらファイルなし、無い
ならその他のエラー、という感じでいいのでしょうか?
643:デフォルトの名無しさん
07/02/12 16:27:24
というかwgetはちゃんと終了コード返すけど?
# wget -q URLリンク(www.google.com) && echo ok
ok
# wget -q URLリンク(www.google.com) || echo ng
ng
#
644:デフォルトの名無しさん
07/02/12 16:28:39
あーごめん、404と接続できなかった時とを区別したいのか。早とちりスマソ。
645:デフォルトの名無しさん
07/02/12 20:57:32
気にしてへんからええよ。
書いてくれてありがとな。
646:デフォルトの名無しさん
07/02/13 00:23:46
>>642
perldoc IPC::Open3
647:デフォルトの名無しさん
07/02/14 00:10:02
数字と文字が混在した要素からなる配列があるんですけど、これをsortすると
1~~,11~~,2~~,23~~・・・
という風になってしまいます。
これを数字順
1~~,2~~,11~~,23~~・・・
にするにはどうすればいいのでしょうか??
648:デフォルトの名無しさん
07/02/14 00:17:12
>>647
@dst = sort { $a <=> $b } @src; # 数値ソート
@dst = sort { $a cmp $b } @src; # 文字列ソート(こっちは略せる)
649:デフォルトの名無しさん
07/02/14 00:39:50
>>648
それ試したんですけど、数字順にならないんです・・orz
650: ◆TWARamEjuA
07/02/14 00:49:01 BE:3049474-2BP(6811)
@dst = sort { sprintf qq|%02d|,$a cmp sprintf qq|%02d|,$b } @src;
とかとか♪
651:デフォルトの名無しさん
07/02/14 00:53:47
>>650
Sort subroutine didn't return a numeric value
ってエラーがががorz
652:脱帽
07/02/14 00:59:09
ちょうてけとう
@dst = sort { ($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0] } @src;
653:デフォルトの名無しさん
07/02/14 00:59:59
print join qq/, /, sort { $a <=> $b } qw/21d 1aa 11b 2cc 13e 5b/;
1aa, 2cc, 5b, 11b, 13e, 21d
ちゃんとなってるけどなあ
654:デフォルトの名無しさん
07/02/14 01:08:03
>>653
いろいろ試したらできました。
splitを何回か使って要素の中の数列にまで要素を分割して比較したらうまくいきました。
俺なんかに付き合ってくれてありがとうございましたm(_ _m)
655:デフォルトの名無しさん
07/02/14 05:36:07
ひ~(悲鳴)
656:デフォルトの名無しさん
07/02/14 06:05:37
(悲鳴)
657:デフォルトの名無しさん
07/02/14 06:25:24
シュー 三(悲鳴)
658:デフォルトの名無しさん
07/02/14 06:31:03
質問~perlから直接web上のファイルを開く事はできますか?
ソースをテキストで保存したくて
open(IN,"URLリンク(****)・・・") or die "無理";
ってやってみたら無理でした。
659:デフォルトの名無しさん
07/02/14 06:56:37
startup.plに
print int rand 10;
のようなコードを入れたtest.plをrequireして実行すると
↓↓httpdプロセス番号(実行結果)↓↓
1(3), 2(3), 3(3), 1(5), 2(5), 3,(5), 1(2), 2(2), 3(2)
のように完全でない乱数がある規則で発生してしまいます。
srandを加える、もしくはtest.plを意図的に更新し共有メモリから外すと期待通り全て違う表示がされます。
なぜこのような動作になるのか教えていただけませんでしょうか。
環境はFedora core5、Perl v5.8.8、mod_perl-2.0.2-5.1、httpd-2.2.2-1.2(prefork)です。
660:デフォルトの名無しさん
07/02/14 07:17:33
>>658
URLリンク(www.kt.rim.or.jp)
>>659
【激速】mod_perl SpeedyCGI FastCGI【激速】
スレリンク(php板)
661:デフォルトの名無しさん
07/02/14 07:32:33
あ、ありがとうございます!
お陰で心置きなく寝れます。いや、仕事でした。いってきます;;
662:デフォルトの名無しさん
07/02/14 11:51:52
% cat > test.pl
#!/usr/bin/perl
$ID = "id";
$PASS = "pass";
__END__
perlと余り関係ない質問かもしれませんが..
上の様なスクリプトを作った場合ファイルを開くと$PASSの「pass」が丸見えに
なるのですがこの部分を暗号化してわからないようにしてスクリプト実行時に
何らかの処理をして$PASSをpassに戻すような事は可能でしょうか?
663:デフォルトの名無しさん
07/02/14 12:01:30
なんらかの処理をしてpassに戻ったら意味がないだろうが
SHA-1とかでハッシュにしてそれを持ってるとよろし
664:デフォルトの名無しさん
07/02/14 12:05:42
>>663
ありがとうございます
ぐぐってきます..(´・ω・)
665:デフォルトの名無しさん
07/02/14 13:30:21
音声入力でPerlスクリプトを書ける時代はいつになったら来るのかね
URLリンク(www.youtube.com)
666:デフォルトの名無しさん
07/02/14 14:08:49
>>665
なんか失敗ばっかりしているように見えるね。
667:デフォルトの名無しさん
07/02/14 14:35:28
>>665
warata
668:デフォルトの名無しさん
07/02/14 14:45:30
>>665
やべえ面白すぎるwww
669:デフォルトの名無しさん
07/02/14 15:29:03
SMTPを使わず/usr/lib/sendmail等から送る場合sendmailをパイプでopenする
手法がよく使われていますがこれらを実現出来るCPANに登録されているスタンダードな
モジュール名を教えていただけませんでしょうか。
670:デフォルトの名無しさん
07/02/14 15:39:30
途中で手入力してるしw
開発部署のあちこちのデスクから、こんなん聞こえてきたらコエー。
671:デフォルトの名無しさん
07/02/14 15:56:45
>>669
search.cpan.orgでsendmailをキーワードに検索すればいくつか出てくるので
適当に好きなのを使えばいいんじゃないか。
672:デフォルトの名無しさん
07/02/14 20:43:09
>>665
この後に、オフィスPCに切れて投げ壊してる外人おっさんの動画を
673:デフォルトの名無しさん
07/02/14 21:31:26
>>665
That was eazy.txt
ワロス
674:デフォルトの名無しさん
07/02/14 21:57:07
Thank you って言ったらそれまで入ってもうて、必死で消してるw
675:デフォルトの名無しさん
07/02/14 22:00:56
Undoできないのかな
676:デフォルトの名無しさん
07/02/14 22:03:04
5分もかかってまだ open ( INFO しか入力できてねぇしw
677:デフォルトの名無しさん
07/02/14 22:12:07
いや、INFO は結局入力できず手で入れてたし。
678:デフォルトの名無しさん
07/02/14 22:39:15
検索結果を表示させるだけのものなんですが、大文字小文字の区別がつきません
297 if ( $line =~ /\Q$in{$form1}\E/ ) {
を if ( $line =~ i/\Q$in{$form1}\E/ ) { にするとエラーが出てしまいます
syntax error at test.cgi line 297, near "$in{"
syntax error at test.cgi line 297, near "/ )"
syntax error at test.cgi line 300, near "}"
Execution of test.cgi aborted due to compilation errors.
292 sub umu1 {
293 open(IN,"$file"); #csv読み込み
294 while(1) {
294 $line = <IN>; #csvの行を&lineに代入
295 @data = split( /,/ ,$line ); #@data[0~]にcsv行を個別に代入
296 if ( $line eq "" ) { last; } #無限ループ終了条件
297 if ( $line =~ /\Q$in{$form1}\E/ ) {
298 print "$data[0]$data[1]"."<br>"."\n";
299 }
300 }
301 close(IN);
302 }
679:678
07/02/14 23:04:54
自己解決しました。なんともお粗末なミスで・・・
680:デフォルトの名無しさん
07/02/15 00:37:59
WWW::Mechanizeを使用しているのですが、RecIE(URLリンク(www.h7.dion.ne.jp))
のように、IEにhtmlの内容を表示させながらhtml解析する方法ってないでしょうか?
今はcontentで一旦ファイルに保存して、systemでIEを起動させ表示させています。
681:デフォルトの名無しさん
07/02/15 10:04:00
sub foo {
処理
return(@A,@B,@C)
}
としている関数で、
(@A,@B,@C) = &foo()
↑のような感じで返り値を配列個別に受け取りたいんですが、
Perlでは可能なんでしょうか?
682:デフォルトの名無しさん
07/02/15 10:16:08
sub foo {
hoge;
return \(@A, @B, @C);
}
($refA, $refB, $refC) = foo;
こういう感じにリファレンス渡しにしないといけない。
683:デフォルトの名無しさん
07/02/15 11:20:31
>>680
Win32OLE
JavaScriptみたいなタグの分解も一緒にやってくれる
684:デフォルトの名無しさん
07/02/16 04:43:05
Win32::GUIのListviewで行ごとに色を変えるにはどうしたらよいでしょうか?
685:デフォルトの名無しさん
07/02/16 14:44:56
>>684
カスタムドローかオーナードロー
ってかWinAPI使うならCとかC++のが断然楽だぞ?
686:デフォルトの名無しさん
07/02/16 17:14:27
>>685
カスタムロードがいいみたいですね。
Perlのサンプルコードはぜんぜんないようで。。。
困った
687:デフォルトの名無しさん
07/02/16 17:21:16
ドロー
688:デフォルトの名無しさん
07/02/16 17:36:30
>>686
Win32::GUIって自分でウィンドウメッセージ取れないのか?
取れるならC,C++のサンプルコードと同じようにできるが
できないなら知らん
689:デフォルトの名無しさん
07/02/16 19:01:28
URLリンク(perl-win32-gui.sourceforge.net)
サンプルコードは一応あるんだが、エラーが出て動かん。
カスタムドローの構造が古いのかな???
バイナリをいろいろ変換してるがよう分からんわ。
690:デフォルトの名無しさん
07/02/17 15:11:52
>>689
substr( $lParam, 48, 8, $clrText);
を
substr(unpack("P56", pack("L",$lParam)), 48, 8, $clrText);
にするとエラーは無くなるが、文字色は変わらない。
要するに、$lParamはNMLVCUSTOMDRAW構造体へのポインタ
cf. URLリンク(www.kumei.ne.jp)
であって、この構造体の中身を書き換えればいいように思えるのだが、
Perl でどうすればいいのかわからない。
691:デフォルトの名無しさん
07/02/18 17:54:02
CUIサーバープログラムで裏で1秒ごとにデータファイルを読み込みながら
クライアントにその時々の最新データを返すにはどのようにすればいいのでしょうか?
&readdata
sub readdata{
after(1000,&readdata);
}
692:デフォルトの名無しさん
07/02/18 17:55:11
Tkで使うafterのようなものがあるのでしょうか?
ということの説明のためにコードを書いていたのですが、途中で投稿してしまいましたorz
693:デフォルトの名無しさん
07/02/18 19:55:10
sleep(1)
694:デフォルトの名無しさん
07/02/18 20:26:34
ある数値が何行にもわたって書いてあるいくつかのテキストを読み込んで
指定した列の数値の平均を割り出すプログラムをperlで作りたいんですが
どのように作ればいいんでしょうか?
入門サイトなどをいくつか見てきましたが
これといったお手本が無く、行き詰まってしまいました。
お願いします。
695:デフォルトの名無しさん
07/02/18 20:47:41
>>694
もちっとデータに具体性を出してほしい
例を上げて
696:デフォルトの名無しさん
07/02/18 20:56:22
>>695
レスありがとうございます。
例というか、実際に使うテキストファイルの最初の5行をそのままコピペしますが
0; 133.44; 3180
1; 134.76; 3180
2; 168.35; 3180
3; 141.58; 3180
4; 157.86; 3180
5; 176.92; 3180
こうなってます。
一番左は列数、二列目が平均値を出したいデータ、三列目は無視してください。
二列目の数値の平均値が出したいのです。
ひとつのテキストファイルに44640行、
こんな感じの数値がずらずらと並んでいるので
二列目の数値を全部足して44640で割る、ということがしたいんです。
697:デフォルトの名無しさん
07/02/18 21:11:30
とりあえず
・ファイルをperlに読み込んで各行をループさせる
・一行の中で、2列目の数値を取り出す
といった操作が必要だけど、
ファイルの読み書きや、正規表現とか、まったく何も分からないの?
698:デフォルトの名無しさん
07/02/18 22:01:45
>>694
ちょうど最近それっぽい記事が出てた。
URLリンク(codezine.jp)
区切り記号が「,」か「;」の違いがあるとか微妙にちがうけど、
コレが理解できれば希望のスクリプトを書くのも出来るはず。
コピペだけですませようとしてるんなら無理だけど。
699:デフォルトの名無しさん
07/02/18 22:02:02
>>697
一応、基礎的なことはサイトを見て勉強してきたんで
正規表現のことや
ファイルを読み込んでコマンドプロンプトに内容を表示させたり
ファイルの作成、書き込みなどは理解しているつもりです。
ただそれらのことを組み合わせてプログラムを作るとなると
まだよくわからないんです。
もう明日中には完成させなきゃならないんで
できればヒントだけでもお願いしたいです…
700:デフォルトの名無しさん
07/02/18 22:08:59
こんな感じじゃね?試してないけど。
my $sum = 0;
my $i = 0;
for my $file (qw(unko1.txt unko2.txt)) {
open my $fh, $file or die "開けん";
while(<$fh>) { $sum += (/;\s*(-?\d\.\d);/)[0]; $i++; }
}
print "阿部怜治:", $sum / $i, $/;
701:694
07/02/18 23:30:17
>>698.700
ありがとうございます。
もう少し頑張って明日試してみます。
702:デフォルトの名無しさん
07/02/19 00:43:52
じゃ模範的なperlで
perl -pae "$l++;$s+=$F[1]}{$_=$s/$l" input.txt
703:デフォルトの名無しさん
07/02/19 00:58:40
perl -F";" -lane '$t+=$F[1]; END{print $t/$.}' input.txt
704:デフォルトの名無しさん
07/02/19 04:15:19
>>702
$F[1]}{
の
}{
って何してるの?
705:デフォルトの名無しさん
07/02/19 04:59:09
>>704
$ perl -h
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed
-p は while (<>) { ... print; } で囲まれる。
706:デフォルトの名無しさん
07/02/19 05:26:43
挙動的に同じって意味だと思ってたら、
本当にプリプロセッサのように囲まれるのね
707:デフォルトの名無しさん
07/02/19 18:41:27
if ($a) { print $a; }
この書き方と
print $a if $a;
この書き方では何か違いはあるのでしょうか
708:デフォルトの名無しさん
07/02/19 18:44:48
見た目
709:デフォルトの名無しさん
07/02/19 20:24:07
すいません、質問です。
大体5万行くらいの大きさのテキストファイルから、
重複している行
(連続して重複してるわけでは無く、内容が同じ行が
とびとびに存在してる)を一つのこして、残りは省く
というスクリプトを書く場合、
1)1行目はそのまま書き出す
2)2行目は1行目と比較して、同じだったら書き出さない、違ったら書き出す
3)3行目は1行目と比較して、同じだったら書き出さない、違ったら2行目と比較して、、、
4)以下繰り替えし
このようなスクリプトしか無いのでしょうか?
処理に非常に時間がかかるので、何か良い方法があったら、御教示下さい。
710:デフォルトの名無しさん
07/02/19 20:31:36
>>709
「perl 重複」でぐぐればいろいろテクニックが見つかる
711:デフォルトの名無しさん
07/02/19 20:36:03
>>709
5万行くらいなら全部ハッシュテーブルに詰め込んでも大丈夫そうだが
順序崩していいならソートしてから重複を除くのがいいだろう
712: ◆TWARamEjuA
07/02/19 20:38:10 BE:2613683-2BP(6811)
1. 1行目の内容をハシュのキーに詰め込む。
while (<$fh>) {
$hash{$_} = 1;
2. 読み込みが終わったら、keyを書き出す。
print for keys %hash;
1-1. 読み込んだ順に書き出したい時。
my $line;
while (<$fh>) {
$hash{$_} = [$_, ++$line];
1-2. 先に読み込んだ方を有効にしたい時。
$hash{$_} = [$_, ++$line] unless $hash{$_} ;
2-1. 読み込みが終わったら、sortしながらkeyを書き出す。
print for sort $hash{$a}->[1] <=> $hash{$b}->[1], keys %hash;
脳内妄想なので、補完よろしこ(照)
713: ◆TWARamEjuA
07/02/19 20:39:43 BE:1742382-2BP(6811)
ん、、、リファレンスにしなくても良かったか(呆)
714:709
07/02/19 20:42:52
>>710-712
ありがとうございます。ハッシュテーブルを使う方法は、
全く考えてませんでした(というか今迄使ったことが無かったので)
とりあえず、ハッシュテーブルの使い方を勉強してきます。
715:デフォルトの名無しさん
07/02/19 20:57:05
perl -ne 'print if not $seen{$_}++;'
でいいだろ。
メモリ足りないようならtie()使ってDBMファイルをワークに使えばよし。
716:デフォルトの名無しさん
07/02/19 20:58:32
Perl やっててハッシュを使ったことが無いとな
717:デフォルトの名無しさん
07/02/19 22:07:13
今までperlやってなかったんだろ
718:デフォルトの名無しさん
07/02/19 22:16:49
無名(?)のBLOCKで、
{} ←中身が空だとエラーになるんだけど、素のBLOCKは使ってもいいのか、
使えるが推奨されてないのか、perl的でないのか、どんな感じなんでしょう?
719:デフォルトの名無しさん
07/02/19 22:28:43
WindowsでNMAKEが必要なモジュールのインストールについて質問。
Windows2000では問題がなかったのに、vistaになってDBIとかがインストールに失敗する。
どうすれば回避できる?
720:デフォルトの名無しさん
07/02/19 22:41:06
>>719
そのエラーメッセージで言われてるところを直せばインストールできるんじゃないか
721:デフォルトの名無しさん
07/02/19 22:46:44
>>718
$hoge = {};
何か見えてこないかい?
それからperlrefのMaking Referencesの3番辺りに目を通すといいと良いかと。
…スクリプティング言語資料室さんの訳、そこの所間違ってるかな
> 一方、ハッシュではなくBLOCKへのリファレンスを返すのであれば、
722:718
07/02/19 23:08:43
>>721
おー、ありがとう。丁度良い書き方が見つかりました。
{}だけ書いて中身は後で書きたいときに、エラーになるのが気持ち悪かったのですが、
{;}という方法があったか!
723:デフォルトの名無しさん
07/02/20 16:33:08
最近対策済みのスパムに漏れて書き込みが散見されるので
if ($comment !~ /(\x82[\x9F-\xF2])|(\x83[\x40-\x96])/) {&er_("cannot write!","1");}
ここを変えたいと思います。
ここをひらがなの「あ」~「ん」が含まれていなければ、という意味にしたいのですが、
「あ」は 82A0
「ん」は 82F1 です。
(\x82[\x9F-\xF2])|(\x83[\x40-\x96])
これをどう治せばいいのでしょうか?
↑正規表現とマッチングを理解していないので、
これのはっきりとした意味がわかっていません。
たぶんカタカナまで含まれていると思うのですが・・。
724:デフォルトの名無しさん
07/02/20 16:51:19
>>723
sjisか。
| の左側がひらがなで、右側がカタカナでしょ。
ひらがなだけよけたいなら、
$comment !~ /\x82[\x9F-\xF1]/
でいいんじゃね?
725:723
07/02/20 17:04:41
>>724
ありがとうございます。
ひらがなのみのフィルタで無事動きました。
726:中の人
07/02/21 00:01:39
>>721
すまん確認した。
どこをどうすればこういう勘違いをするんだかわれながら不思議だ。
つーことで今週末までをめどに修正しておきます。
727:デフォルトの名無しさん
07/02/21 21:57:48
なるほどねぇ
728:688
07/02/21 22:09:52
>>690
自己解決しました。
my $CopyMemory=new Win32::API("kernel32", "RtlMoveMemory", "NPI", "V");
defined $CopyMemory or die "Cant find CopyMemory";
$CopyMemory->Call($lParam+48, $clrText, 8);
729:デフォルトの名無しさん
07/02/21 22:18:46
>>728
訂正688→686
730:デフォルトの名無しさん
07/02/21 23:31:13
>>728
substr( $lParam, 48, 8, $clrText);
を
$object->TextColor( (unpack('II',$clrText))[1] );
$object->TextBkColor( (unpack('II',$clrText))[0] );
にする方が楽だと思うけど、自己解決おめでと。
731:686
07/02/22 00:45:28
>>730
それじゃ、Selectすると全部色変わっちまうぜよ。
732:690
07/02/22 01:35:07
>>728
自己解決おめでとう。
>>689 の
substr( $lParam, 48, 8, $clrText);
の意味について考え直したのだが、以前のバージョンのActivePerl では
「裏仕様」として、「$lParam がポインタと考えられる場合は、間接指定
されたアドレスの文字列(バイト列)を操作し、そうでなければ$lParam
そのものを操作する」というのがあったのではないだろうか。
>>689 のソースを読む限り、そうとしか思えない。
ところが、この「裏仕様」は危険であるし、安全確実な間接アドレス指定方法
が手当てされたから、いつかのバージョンで廃止されたんだろうね。
733:デフォルトの名無しさん
07/02/22 16:07:47
if( $ENV{REMOTE_ADDR} eq ’’ )
ってありえるのでしょうか?
734:デフォルトの名無しさん
07/02/22 16:26:33
>>733
CGIとかで動かしてるなら鯖の仕様次第だし
普通にコマンドラインから実行すれば空になる
735:デフォルトの名無しさん
07/02/22 19:59:42
$comment に http の文字が5つ以上あるとエラーを出したいのですが、
正規表現でのチェックはどうすればいいのでしょうか?
if( $comment /~ (.*http.*http.*http,*http,*http) ) { error(); }
こんな感じでしょうか?orz
736:デフォルトの名無しさん
07/02/22 20:46:31
if ($comment =~ /(.*http){5}/s) { error(); }
737: ◆TWARamEjuA
07/02/22 21:22:57 BE:5227968-2BP(6811)
print "error" if $comment =~ /http/g > 4;
だめだった。。。
print "error" if scalar @{[$comment =~ /http/g]} > 4;
桶だった。。。
詳しい人の解説キボンヌ(照)
738:脱帽
07/02/22 21:26:24
スカラーだと真か偽しか返さないから
739:脱帽
07/02/22 21:27:58
スカラーの場合は真か偽しか返さないからじゃ
740:デフォルトの名無しさん
07/02/22 21:44:26
スカラーコンテキストでマッチした数が返ってくるのは置換の s///g の場合。
なので、もしそういう風に書きたいのなら
print "error" if $comment =~ s/http/http/g > 4;
とか書くといいかも。
741:デフォルトの名無しさん
07/02/22 22:04:23
なるほどねぇ
742:735
07/02/22 22:24:08
if($comment =~ s/http/http/g > 4){ &er_('cannot write!');}
これでいけました。
s/hogehoge/fugafuga/gの s と g の意味がわからなかったのですが、
調べて理解できました、ありがとうございます。
743:デフォルトの名無しさん
07/02/23 13:36:53
WindowsXP + ActivePerl 5.8.8 build 820 です
こちらは初めてです、29箱目ということで既出質問だったらすみません
上記環境で モジュール Encode が threads と同時に上手く働きません
perl素人の自分なりに調べた結果、Encode モジュールはスレッドセーフでは
ないのではないかと思い始めたのですが、それで間違いないでしょうか?
それとも私が何か大事なお約束や呪文を忘れているのでしょうか
また、スレッドセーフで無かった場合、各スレッド内で文字コード変換を
行いたい場合、皆さんはどのようにしているでしょうか
744:デフォルトの名無しさん
07/02/23 14:04:52
>>743
適当にぐぐったらこういうのがあった。
URLリンク(www.nntp.perl.org)
確かに試すとたまにおかしな結果になる。ちなみに手元のバージョンは
v5.8.8 built for i486-linux-gnu-thread-multiだった。
マニュアル見てもthread-safeであるとは書いてないし、原則は明記されて
なければunsafeと思えだから間違ってはいないのだろう。
で、俺はスレッドでEncode使った経験はないからなんともいえないのだが、
普通に考えたら適当なshared variableでlockかけてから使うぐらいしか
ないのではないだろうか。
745:743
07/02/23 14:22:08
>>744 返信ありがとうございます
確実に再現性のある最小コードを続いて投稿…と思ったのですが上手くいかずorz
自分の考え違いだったかもと思っていたところでした
URL 先のコードを試した結果、私の環境でもおかしな結果を不規則に起こしました
再入しないようにとりあえず自衛していく方向でいってみます
ありがとうございました
746:743
07/02/23 16:42:34
他のモジュール内でもEncode使っているのが多くありそうですね
PerlIO layer での :encoding(~) とか
HTTP::Message の decoded_content とか便利だなーとガシガシ使っていたので
どんどん泥沼のソースになっていきましたorz
747:デフォルトの名無しさん
07/02/23 16:45:17
よく使われる奴はthread safeにして欲しいね
748:デフォルトの名無しさん
07/02/23 22:14:02
小飼氏(メーリングリスト)に投げてみたらいいんじゃないかな。
つーか投げてほしい。
749:デフォルトの名無しさん
07/02/23 22:54:10
blogの感じからするとすごく暇そうなので「直せやおら」とか言うといいんじゃね?>Encode
メーリングリストはJcodeメーリングリストでok
750:デフォルトの名無しさん
07/02/24 02:14:26
あのヒゲモジャのことだからギブミーpatchでかえされるに200ペソ
751:デフォルトの名無しさん
07/02/24 11:03:22
それはひどい>ギブミーpatch
752:デフォルトの名無しさん
07/02/24 13:51:21
なんの解決にもならないw>ギブミーpatch
753:デフォルトの名無しさん
07/02/24 14:57:03
>>751-752
なにが「ひどく」て「解決にならない」なの?
ライセンスがArtisticとGNU GPLのデュアルライセンスで、
どっちもソースが公開されているものなんだから不具合あったらソースを追って自分で改変するくらい当たり前じゃん。
おまえらはフリーライダーなの?それともそれをやるだけの能力がない低脳なの?
754:デフォルトの名無しさん
07/02/24 15:28:14
これは酷い混じれ酢だ
755:デフォルトの名無しさん
07/02/24 17:43:38
少なくとも小飼氏よりは低能間違い無しです><
756:デフォルトの名無しさん
07/02/24 20:38:11
patchが作れるなら人に頼らないしメールも送らないってば。
757:デフォルトの名無しさん
07/02/24 20:55:47
「ギブミーpatch」といわれたら、「無理!」って返事すればいいだけ。
キラクニヤレヤ~♪
758:デフォルトの名無しさん
07/02/24 22:05:02
(´・ω・)
759:デフォルトの名無しさん
07/02/24 23:26:36
質問です。
浮動小数点計算をループでしていてその結果を出力したら、
あるタイミングから#INDというのが出力されました。
これは一体なんでしょうか、、、
760:デフォルトの名無しさん
07/02/24 23:35:56
不定値(正負の無限大 or NaN)
0除算してるんじゃね?
761:デフォルトの名無しさん
07/02/24 23:48:49
>>760
レスありがとうございます。
数値扱いされてないのでしょうか?
具体的なコードはこんなかんじなんですが、、
my $a = -0.1382 ** 0.000212494687632809;
my $temp = -0.1382;
my $b = $temp ** 0.000212494687632809;
これだと$aはちゃんと出力されるんですが、$bは-1.#INDと出力されます。。
762:デフォルトの名無しさん
07/02/25 00:11:04
>>759
indefinite
763:デフォルトの名無しさん
07/02/25 00:27:05
>>761
"**"は"-"より強いので
-0.1382 ** 0.000212494687632809
は
-(0.1382 ** 0.000212494687632809)に等しい。
764:デフォルトの名無しさん
07/02/25 01:53:36
>>761
Math::BigFloat
765:デフォルトの名無しさん
07/02/25 02:10:48
>>762
>>763
>>764
レスありがとうございます。明日にでも試してみたいと思います。
766:デフォルトの名無しさん
07/02/25 12:00:00
(´・ω・)12時
767:デフォルトの名無しさん
07/02/25 19:23:35
(´・ω・)時報スクリプトを作ってみました..
#!/usr/bin/perl
use WWW::Mechanize;
$mech = WWW::Mechanize->new(agent => 'Mozilla/4.0 (MSIE 6.0;)');
while(1){
my(@t) = localtime(time);
unless( $t[1] == 59 && $t[0] > 20){sleep(30);next;}
$mech->get($ARGV[0]);
$mech->field("MESSAGE" => "時報");
$mech->click();
(@t) = localtime(time);
sleep(60-$t[0]);
$mech->click();
}
768:デフォルトの名無しさん
07/02/27 20:41:51
日本語PDF作るモジュールのお薦めってありますか?
PDFJ?
769:デフォルトの名無しさん
07/02/27 22:40:04
PDFJ
770:デフォルトの名無しさん
07/02/28 00:10:35
$input=<STDIN>;
$input=~s/\n//;
print "$input";
コマンドラインから「\n\n」と入力した場合に
「\n\n」と出力されるのではなく、改行2個が出力されるようにしたいんですが
どうすればいいですか?
771:デフォルトの名無しさん
07/02/28 00:17:23
自力でs/\\n/\n/g;とするかevalするか
772:デフォルトの名無しさん
07/02/28 00:24:39
>>771
わかりました。ありがとうございます。
773:デフォルトの名無しさん
07/02/28 00:52:29
>>771,772
evalは安易に使うとコマンド実行も出来ちゃうので正規表現にしとけ。
どうしてもeval使う場合は入力チェックしないと危険よ
774:770
07/02/28 01:14:01
>>773
アドバイスありがとうございます。
自分でちょっとしたテキスト処理をやりたいだけなので大丈夫です。
\< や \/ や \. などの入力が入った場合、その都度
s/\\\</\</;
s/\\\./\./;
を書かなければいけないのでevalにします。ありがとうございました。
775:768
07/02/28 13:05:37
>769 サンクス。
自由度がありすぎて面倒な部分もあるんだけど、
やっぱPDFJでいってみます。
776:デフォルトの名無しさん
07/02/28 16:35:41
質問です 頓珍漢だった笑ってください
perlはCの #include に相当する機能はあるのでしょうか?
今、Perlで統計解析の処理をしています。解析手法ごとに異なったスクリプト
を作っています。
入出力部分が複雑なんでここの部分と全体で使える共通サブルーチンだけ切り出して
別ソースにして、実行時に組み込んで使いたいのですが、どうも旨くゆきません。
ぐぐったりしてみましたが、Use、Requireの話しか検索できません。何か単純に
Includeする方法は無いのでしょうか?
777:デフォルトの名無しさん
07/02/28 16:48:38
>>776
そう難しくないからモジュールにしてuse使うべきだな。
778:デフォルトの名無しさん
07/02/28 16:48:43
ァ ∧_∧ ァ,、
,、'` ( ´∀`) ,、'`
'` ( ⊃ ⊂) '`
779:デフォルトの名無しさん
07/02/28 16:49:14
ははは
∧_∧ もうダメ
( ´∀`) ∧_∧ モウ カンベン
. ( つ ⊂ ) ヒヒヒヒ (´∀` ,,)、 あははは シテクダサイ
.) ) ) ○ ∧_∧ , , へ,, へ⊂), ∧_∧ ○,
(__)_)⊂ ´⌒つ´∀` )つ (_(__)_丿 ⊂(´∀`⊂ ⌒ヽつ
780:デフォルトの名無しさん
07/02/28 16:52:53
requireで問題なくできそうだけど駄目なんかな
781:デフォルトの名無しさん
07/02/28 17:02:56
目線を高くしてオブジェクト指向にしたらどうだ?
782:デフォルトの名無しさん
07/02/28 17:07:13
776はrequireやuseの説明を読んでないのではないのでは?
includeとスペルが違うからって脊髄反射したのか?
そうでないのなら、ますはrequireでは駄目だった点を質問文につけないと回答者は答えようがないぞ
783:デフォルトの名無しさん
07/02/28 17:08:32
すまん
×776はrequireやuseの説明を読んでないのではないのでは?
○776はrequireやuseの説明を読んでないのでは?
784:デフォルトの名無しさん
07/02/28 17:11:40
名前空間の問題とかあるし、普通にモジュール作るのがいいと
思うけどな。よほどこったことやるんじゃなけりゃ、Exporter
使えば一発だし。
785:デフォルトの名無しさん
07/02/28 17:14:16
>>776は最後に1;を入れ忘れてると見た
786:笑われた 776
07/02/28 17:22:05
すみません確かにRequireに関して真面目に読んでいないです
Cの#includeのつもりだったので、
------------ 今まで ------------
初期の宣言など・・・
open(FP, $filename) or die($filename);
while(<FP>) {
$hash{$key} = hoge;
}
------------ 変更 ------------
初期の宣言など・・・
require 'other.pl';
&sub($filename, \%hash);
と変更しただけなんですが・・・・実行時に
787:デフォルトの名無しさん
07/02/28 17:25:10
ワッフルワッフル!!
788:デフォルトの名無しさん
07/02/28 23:16:02
単純に定数の扱いがやっかいかな。perlは。
789:デフォルトの名無しさん
07/03/01 01:53:41
use constant FOO => 'bar';
use Readonly;
Readonly my $HOGE => 'fuga';
こういうのでいいじゃん。
790:デフォルトの名無しさん
07/03/01 08:05:44
PerlでCPANによるモジュールのインストールが失敗します。
install LWP::Simple
....
BEGIN failed--compilation aborted at /System/Library/Perl/Extras/5.8.6/darwin-thread-multi-2level/HTML/TokeParser.pm line 12.
Compilation failed in require at ../blib/lib/HTML/Form.pm line 116.
html/form-param.......dubious
Test returned status 2 (wstat 512, 0x200)
DIED. FAILED tests 1-24
Failed 24/24 tests, 0.00% okay
....
どなたかお助けを。
環境:MacOS X 10.4 Tiger, perl 5.8.6