1 :
デフォルトの名無しさん :
04/10/15 23:49:24 "The duct tape of the Internet"こと、
Perlについての質問箱です
"There's more than one way to do it"ということで
Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc5.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするので
WEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
過去ログは
>>2-5 あたり
2 :
デフォルトの名無しさん :04/10/15 23:49:51
3 :
デフォルトの名無しさん :04/10/15 23:50:21
4 :
デフォルトの名無しさん :04/10/15 23:51:03
6 :
デフォルトの名無しさん :04/10/15 23:58:13
削除依頼完了
>>6 なんで次スレを立てて削除依頼だされなきゃならんのよ?
既にあるから二重スレ立ては消されて当然だろ?
Perlスレなんか消されて当然だろ?
入力した単語($tango) が含まれる行を書き出す処理するためのマッチング処理で、 if ($_ =~ /$tango/) と if ($_ =~ /.*$tango.*/) ってどっちの記述もまったく同じ効果ですか? 違いがわからないのですが…。
$1 $2 $3 の値が違う
っっぷううううううううううううううううううううううううううううう
>>11 さん
すみません。
具体的にどういうことか教えていただけませんか?
正規表現の外ではマッチの結果を次のように参照できます。 $1, $2, $3, ... ( )の部分にマッチした文字列 $+ 最後にマッチした( )部分 $& マッチした部分の文字列 $` マッチした部分から前側の文字列 $' マッチした部分から後側の文字列 たとえば、次のように使用することができます。 if ($time =~ /^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$/) { $hour = $1; $min = $2; $sec = $3; }
>>10 その記述における目的にとっての「効果」は同じ。
でも勿論、マッチした文字列の内容は大きく異なっている可能性が高い。
正規表現にgオプションを付けたりすると、途端に動作に差が出る。
ばかばっかwwwwwwwwwwwwwwwwwwwwwwwww
$tango の中身が ? とかで始まってたりすると ちょっと効果が変わるよね。
皆様、どうもありがとうございました!
必要になったときモジュールを組み込みたいと思って if ($hoge) { use MODULE } と書いてみたのですが、どうもはじめからロードされてるように動きます。 マニュアルをみたら 「 use MODULE; は BEGIN { require MODULE } と一緒 」 とあったのですが、この場合 if ($hoge) { require MODULE } と書けばよいと考えてしまってよいのですか?
yes
>>22 サンクスです。
これで良いんですね。安心しました。
Inline::Ruby
昔ソースコード中にCなどの別の言語のソースを記述できるというような 話を聞いた気がするのですがすっかり忘れてしまいました。 それ関係の情報へのリンクなり何なり教えていただけると喜びます。
28 :
デフォルトの名無しさん :04/10/16 11:00:57
逆に、C言語とかからPerlの関数を呼びたい場合は?
system() とか exec() とか
│ `'‐-.、, \ \ | ``''''ー‐-- 、,,,,,,,,,\,,、-‐''| /:`'‐:.、,i~l | | . /:::::::::::::::| |:`''ーァ- 、,,,_ │ _,、| l:::::::::::::::::| |:::::::/  ̄`゙゙゙`''''''"´ ', |:::::::::::::::::| |:::::/ l . |::::::::::::::::::| |::/ ,、-----、 ._,、rz| !::;::、;::::::::| |/ ´  ̄``'''''`'' ‐゙'"´ | ll r‐、ヽ::| |' 、ィ'f''''ァ、 { ,rt'''ァ、i l l ノ { l::| |  ̄ ̄ ', ̄ ̄ ', ヽヽ,,ヽ';| |. ', ! ヽ. | | ,.ィ .'、 ! . ヽ、,. | | ´ `' = ,.ィ / │ !.l ,、rzi=,,,=iュ、 / ,rV ','、 /∠-===`ォ V . / l l ヽ'、 ′  ̄二二´ ./゙ / l ヽ ヽ'、::::,,.. .,ハ,. ,l .,、ri゙ \\ `'ヽ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;| ', \\ 'ー:、;;;;;;;;;;;;;;;;;;;;;;;lヽ、 ', \\ `''‐:、;;;;;;;;;/ ヽ`'-、 ゙、 \\ ヽ;;/ ヽ `'‐.、
>>30 perldoc perlembed 見れ。
Perlの真髄はInlineに有り
ぺrはくそ るbyさいきょう
>>33 ありがとうございます。
でも以前にこれみたとこは、わけわかめだった…。
ある言語の中に他の別の言語を埋め込むことが流行ってるみたいですが Perlの中でCなどを書いた方が、 Cで始めからストレートに書くより速いんですかね。 Rubyの中でPerlを記述した方が普通にその言語で書くより生産的? よく分からないのですが。。。
>>37 速いってのは、実行速度が? それとも開発期間が?
>>37 それは馬鹿とハサミの関係だね。
うまく使えれば良いけどそうでなければむしろ泥沼にはまるんじゃない。
>>38 >>39 レスどうもです。
いや、実行速度でも開発期間でもどちらでもよいのですが。
たとえばCだとインラインアセンブラとかでアセンブラ埋め込めたりできますけど
「ループの中のみ」とか、コアを絞りこんで置き換えて使うような
それ相当の機能と機能と考えたほうがよいのか。
そうじゃなくて全面的に記述はCで書いて、実行系はPerlでやる、みたいな
そういう存在なのか?よく分からなかったのです。すんません。
なんというか部分最適向けなのか?全体最適向けなのか? みたいな。。という素朴な疑問です
>>37 =40=41
CにPerlを埋め込んでというのは仕事では扱ったことがないので
あくまで想像に過ぎないのだが、Perlの強力な文字列操作機能を
Cから使いたいという要望はあるかもしれない。
実際、Perlでなら普通にやるような文字列検索や書換えなどを
C/C++でやるには、そういうライブラリもたくさんあるにはあるが、
全部をC/C++で済ますより、その部分だけPerlにまかせるれば
簡単に済む場合は多そうな気がする。これは部分最適の例かも。
そして、それが開発工数の削減につながるなら、開発プロセスの
全体最適ということにこじつけれるかもしれない。
いずれにせよ、それぞれの言語の長所がうまく活かして、
短所を補えるなら組み込みの意味もでてくるのでは。
言うは易しで行なうは難しという感じだが。
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Perl
>>42 レスありがとうございます。
相互補完的に使うものなのですね。
確かにCでヌル文字を常に意識しながらの作業は煩わしいといえば
そんな気がします(慣れれば、という面もありますが)
実は職場ではCを生業にやってるんですけど、
なんだかWEBやってる連中えらく盛り上がってるし
PerlでCをとなると漏れってリストラ?なんて内心ガクガクブルブルしてたんです。。
45 :
デフォルトの名無しさん :04/10/16 18:01:05
しんと申します *dataの*がなんだか教えて下さい。 if ($ENV{'HTTP_COOKIE'}) { *data = GetCookie($ENV{'HTTP_COOKIE'}); @w = split(/\,/, $data{$cknm}); $cdata1 = @w[0]; $cdata2 = @w[1]; }
>>しん さん
型グロブってものを示す記号です。型グロブで検索するといろいろでてきます。
例えば
!/usr/bin/perl -w
use strict;
use vars qw(*var);
*var = \"abc\n";
*var = [ qq(d e f \n) ];
*var = { g => 1, h => 2, i => "\n", };
*var = sub { "j\n" };
print $var;
print @var;
print %var;
print &var;
とすると
> abc
> d e f
> g1h2i
> j
と表示されます。
>>45 の場合、とりあえず型は定めずに
*dataにGetCookieの結果を保存しておき、取り出すとき$data{$cknm}として
ハッシュの要素として取り出しています。
ちなみに my *var = 'abc' とはできないのであしからず。
perlからWindowsのダイアログ使う方法ってないですか
Win32API呼べば
お前ら自分が糞Perlerであるという自覚は持ってるの?あ? 糞虫は死ねよ。
51 :
デフォルトの名無しさん :04/10/16 20:23:37
Perl嫌いな人はお前らが思っているより大勢いるんだが(大爆笑) インターネット上で叩かれるのみならず、市販の書籍でも 「私(監修者)はPerlがダイキライなので、この章はとばして読んでください。」 なんて言われる始末ぷぷぷ。 別の本では「Perlなど触りたくもないのですが、仕方がなく」と嫌々ながらwwwwwwwwwwwwwww 「もっとも、世界中のPerlプログラムなど、どれも皆単なる偶然で動いているだけなのでしょうから、 その意味で典型的なPerlプログラムと言えますが(わらい)」とか書かれたり。 ちなみに、残念ながら捏造でも何でもないwwwwww ぷぷぷ。 ぷぷぷぷぷ。 Rubyやってて良かったよ。お前らと一緒にされるのはごめんだ。 汚らしいゴミperlerめ。プログラマ板から出ていくまでお前らを叩き続けてやるからな。 汚らしい。 糞虫。 嫌な気分になってくれれば幸いだ。俺はそれを望んでいる。 ゴキブリに感情があるのか知らんが。
52 :
デフォルトの名無しさん :04/10/16 20:24:33
ActivePerlを使用しているのですが 変数の実数を知る方法は無いでしょうか。。 ($test,$sasa) = split(/,/, $nihi); $sasaに何が格納されているか知りたいのです。 cgiの中の<html></html>にprintf "$sasa"としてみましたがエラーだらけとなってcgi自体機能しなくなりました。
なんかそうとう根にもってるんだな なんかあったのか? ルビ厨 必死さがかなり笑える。。ww
>>52 試しにコマンドラインから実行してみて
そして観察してみてください。
56 :
デフォルトの名無しさん :04/10/17 00:38:35
Perlの本を見てみたのですが その本にはメモリの確保などの記述がなかったです どのようにメモリは確保できるのでしょうか? または そのような考え方はないのでしょうか? 素人質問ですいませんがお願いします
57 :
デフォルトの名無しさん :04/10/17 00:41:14
58 :
デフォルトの名無しさん :04/10/17 00:43:16
59 :
デフォルトの名無しさん :04/10/17 00:44:20
頭のおかしいひとがいるようですね
62 :
デフォルトの名無しさん :04/10/17 00:46:46
>>56 基本的にPerlが自動で確保,拡張します
ドザじゃ分からないか。
>>57 まさか ソースを読んで関数を見つけ出せということ?
個人でそんな気力はありませんorz
>>63 ありがとうございます
ということは リーク等はPerlにバグがないかぎりありえないということでしょうか?
また 基本的にと言うことは 意図的に確保する方法もあるのでしょうか?
>>62 前から思ってたけどこれってウニコードのエスケープはデコードできないよね・・・
一度確保したものは他で使い回すために終了までシステムに返すことはないとか。 伝聞だから本当かどうかは分からないけど。
>>68 ウニコードのエスケープと URL エンコードは別物だからね。
>>67 もしmallocみたいのを期待しているんだとすれば
期待はずれかもしれないけれど
例えば、配列 @a について $#a = 1000000; とかすると
それなりのメモリはされるはずです。そんな風な確保(?)の仕方はあります。
ただ、現実問題、コード書いてて メモリ確保を意識しなくっちゃらならない場面って ほとんどありません。
73 :
デフォルトの名無しさん :04/10/17 01:25:14
そんなこと考えなくてもいいのがPerlのいいところだしね。 ラクダ本のPOSIXモジュールのmallocの欄にもC固有のものであるとしか書かれていないし。
>>69 fj の malloc/free 論争を思い浮かべてしまってイヤン。
まさかここで発動したりしないよね?
メモリ確保を考える必要があるとすれば、 馬鹿みたいにデカいファイルを開くとかぐらいか…。 そんな機会は今までになかったけど。
76 :
デフォルトの名無しさん :04/10/17 01:28:22
-DDEBUGGINGをつけてコンパイルされたPerlならどこで確保と解放を行っているか分かるね。
>>67 リークに関しては、ガベコレが参照カウント式なので
リファレンス使って環状リンク等を作ると
自分でチェインを切らない限り、リークします。
サーバ書くとか、長く動くプログラムを作るときは注意したほうがよいです。
itunohanashida
ここだけ 10年時間がずれているレス
ただし、すぐ終わる普通のプログラムの場合 これは大して気にする問題ではないです。 事実上。
あれ?弱いリファレンスって デフォルトになったんけ?
82 :
デフォルトの名無しさん :04/10/17 01:44:26
皆様ありがとうございました どう確保するかではなく 要するに 意図的に確保する必要はない なんですね どうもありがとうございました
窓でPerlを使ってるが 5.6系統だとメモリー量がんがん増えてくね。 5.8でやっと改善したって感じ。 それでも、GCも頻繁にやってくれずにかなーりたたないと動作してないなぁ。 でも、ソースの組方しだいではメモリー使用量半分ぐらい減らせたりしたな。
86 :
デフォルトの名無しさん :04/10/17 05:57:16
質問です 自分で書いたプログラムを実行したら print() on closed filehandle HTML at ./aa.pl line 14. という エラーが出ました 読んでみても意味が良く分かりません HTMLは open HTML , '>', "~/test.html"; で 開いたものです すいませんが教えてください
ファイルを開くことが出来たかどうかチェックしてないだろ。
ハァ?
レスありがとうございます
>>87 どういうことでしょうか?
まだ 始めたばかりで分かりません
ファイルはopenで開いて次にもうprint で書き始めています
チェックと言うもののやり方を教えて頂けると幸いです
>>88 ~を外してフルパスでやっても変わりはありませんでした
or die $!; とか。まともな本読んだ方がいいと思うが。
>>91 ありがとうございます
どういうことでしょうか?
そういうチェックなら知っているのですが
open HTML , '>', "~/test.html"
なので 出力用に開いているので確実に生成されるのではないのでしょうか?
すいませんが教えてください
>>92 とりあえず今のコードを可能な限り削って
エラーが再現する完全なコードを掲示してみそ。
>>93 ありがとうございます
書き直さずに 再現性を高めるために削っただけですが以下のようなものです
#!/usr/pkg/bin/perl -w
use strict;
die "Usage: $0 ImageDirectry" unless ($ARGV[0]);
my $dir=$ARGV[0];
open HTML , '>', "~/test.html";
print HTML '<html>';
close HTML;
すいませんが よろしくお願いします
上のも無駄なのが多かったですね 1番少なくすると #!/usr/pkg/bin/perl -w open HTML , '>', "~/test.html"; print HTML '<html>'; close HTML; こんな感じだと思います すいませんがよろしくお願いします
>>95 とりあえず
>>91 さんの言ってるとおり
open HTML, '>', "test.html" or die $!;
としてみることですな。
>>96 あ、まちがい。
open HTML, '>', "~/test.html" or die $!;
すいません 新規で編集し直したので抜けてましたね いれても No such file or directory at で エラーで終るだけです
色々とやってみたのですがどうしても通らないです どなたか 通るファイルのオープンを見せてくださらないでしょうか? それで通らないのなら私の環境が悪いと言うことなので すいませんがよろしくお願いします
101 :
86 :04/10/17 08:28:53
あれ?
チルダをフルパスにしたらできました
さっきはできなかったのに‥
さっきは なにか他のエラーでとまってたのかな‥
本当にすいませんでした
考えてくださった皆様ありがとうございます
>>100 ホームディレクトリにわたる 方法まで教えてくださりありがとうございます
それで行きたいと思います
私が今作ってるのはイメージビュアーなので セキュリティーとかは関係ないのでw
今回は 途中で私のミスがあり長引かせてしまってすいませんでした
ありがとうございました
102 :
86 :04/10/17 08:38:30
わかりました はじめから ファイルができない云々より /の入ったパス名のファイルを作ろうとしていたのが原因でしたorz 本当に皆様には御迷惑をお掛けしました 本当にすいませんでした
(´-`)。oO(まさか\でないとだめな環境だったんだろうか・・・)
104 :
デフォルトの名無しさん :04/10/17 15:24:39
文字列 aaa\nbbb\nccc\nddd\neee から正規表現で aaa と eee に囲まれた部分(\nbbb\nccc\nddd\n) を抜き出すことってできますか?
>>104 /sスイッチで改行も含めてマッチします。
ターゲットが$_に入っている場合は大体こんな感じ
print $1 if (/aaa(.*)eee/s);
106 :
60 :04/10/17 16:25:29
107 :
デフォルトの名無しさん :04/10/17 17:21:41
>105 ありがとうございました!
つかPerlやるんなら「プログラミングPerl」くらい買おうよ。。。
最初は「初めてのPerl」でもいい
プロセス一覧を返してくれる関数は何でしょう?
111 :
デフォルトの名無しさん :04/10/17 18:49:20
>108 やだ
112 :
デフォルトの名無しさん :04/10/17 18:51:46
/proc以下を読め
`ps`
@test = (1, 2, 3); print "@test[2]\n"; print "$test[2]\n"; 2行目と3行目の実行結果はまったく同じなのですが、 printするときは@と$、どっちを使ってもまったく同じなのでしょうか?
>>115 スライス について調べるといい。
後は $, かな
そうそうw 俺は正直なところを言えばPerlにはがんばって欲しい。やられ役がいないと寂しいしw だがPerlの糞コードや欠点を見ると笑えるし、またそれをちょっと煽り書きすると 信者が狂ったように絡んでくるそのことの方が楽しくて、このスレをチェックするようになった。
>>116 ありがとうございます。
早速調べてみます。
ruby厨とperl厨って qmail信者とpostfix信者 チョンとジャップ トンガリとスネ夫 と同じ雰囲気があるね
120 :
デフォルトの名無しさん :04/10/18 14:19:12
そうそうw 俺は正直なところを言えばPerlにはがんばって欲しい。やられ役がいないと寂しいしw だがPerlの糞コードや欠点を見ると笑えるし、またそれをちょっと煽り書きすると 信者が狂ったように絡んでくるそのことの方が楽しくて、このスレをチェックするようになった。
DBIについて質問させて下さい perl 5.8.x で扱うデータがutf-8です なにが問題かと言うと、 $dbh->quote() で戻ってくるデータが全部NULLになってしまうのです。。 my $dbh = DBI->connect($data_source, $username, $password, { RaiseError => 1 }); $dbh->do( sprintf( qq#INSERT INTO TABLE (%s) values (%s)#, join(',', @column_names), join(',', map { $dbh->quote($_) } @{$data}{@column_names}) ) ); $dbh->disconnect; これを回避する為にはどうすれば良いのでしょうか?
>>122 > @{$data}{@column_names}
これ、なんか怪しくない?
quote する以前に、そのまま出力出来てるの?
my $sth = $dbh->prepare('insert into table (?, ?, ?, ?, ?, ...) values(?, ?, ?, ?, ....)'); $sth->execute( @column_names, @{$data}{@column_names} ); こっちのほうがわかりやすくね?
> CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
> CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
> (WEBプログラミング板
http://pc5.2ch.net/php/ )
127 :
デフォルトの名無しさん :04/10/18 21:30:29
infoseekの無料HPサービスって、CGIで外部サーバに アクセスできる?
129 :
デフォルトの名無しさん :04/10/18 21:44:43
>128 つまらん奴
正露丸ドゾー つ●
131 :
デフォルトの名無しさん :04/10/18 21:45:43
>128 黙れ
132 :
デフォルトの名無しさん :04/10/18 21:52:13
>>122 $dbh->quoteがおかしいと思うならなぜそんな複雑なプログラム
で確かめようとするかな?
print $dbh->quote('あなたが渡してるつもりのもの');
だけ実行して結果みてみろよ。
133 :
デフォルトの名無しさん :04/10/18 21:58:26
>132 日本語めちゃくちゃですよ。
>>122 (1) ごくシンプルに考える限り、思うにあなたは @{$data}{@column_names}というよりも
@data{@column_names}とやりたかったのではないかと推測するが、いかがか?
(2) DBIつかってるってことと$dataという名称から想像すると
もし$dataの中身がハッシュリファレンスの配列へのリファレンス => [{a=>1, b=>2, }, {a=>9, b=>8}...]みたいの
ならば、@{@{$data}[0]}{@column_names} とする必要がある。
(3) $dataが単純なハッシュリファレンス {a=>1, b=>2...}なら確かにおかしい。
ひょっとして古いPerlから5.8にアップデートしたならばDBIのリコンパイルはちゃんとしたかい?
(4) $dataがシンボリックリファレンスならもう知らないにょ
いづれにせよ、$dataを Data::Dumper->Dumpなりして貼り付けてみそ。
失礼。(2)は @{${$data}[0]}{@column_names}だ。
>>125 可能です。LWP覚えてからWEB板で聞いてみなはれ
137 :
デフォルトの名無しさん :04/10/18 22:55:37
C言語のfflushみたいなやつはperlにはないんでしょうか?調べたけどわからない・・・ エロイ方教えてください
$| = 1 とか、よくやるけど。 $|で調べてみてにょん
139 :
デフォルトの名無しさん :04/10/18 23:05:13
open my ${138} => '>> 137'; (..たしかに => '>> はクドイな)
にょんさん亀レスですが解答ありがとうございました。助かりました。
142 :
デフォルトの名無しさん :04/10/19 09:05:38
>136 適当な回答するな。思いっきり条件付きだろうが。
143 :
デフォルトの名無しさん :04/10/19 10:07:13
print <<"END_OF_DATA"; Content-type: text/html; charset=EUC-JP <html> <body> ${body()} </body> </html> END_OF_DATA sub body { print "hello"; } のように、ヒアドキュメント内に関数を埋め込むことができる と聞いたのですが、これを実行すると、body()の実行結果が 最初に出力され、その後 Content-type 以下が出力されて しまいます。 ${body()} の位置に出力させることは可能でしょうか。
144 :
デフォルトの名無しさん :04/10/19 10:13:39
先に変数に入れるようにしたら?
>>143 文字列を埋め込むんだから、bodyは文字列を返さないとだめだろ。
printしたらその場で出力されてしまう。
あと${body()}は、${\(body())}の間違いだと思われ。
146 :
デフォルトの名無しさん :04/10/19 10:19:10
>145 ${\body()}で十分だろ
sub body { return "hello"; }
sub body{ return \"hello"; }
まず、$data は
my $cgi = new CGI;
my $data = $cgi->Vars;
です。書き忘れておりました。申し訳ないです。
そして原因もわかりました。
とあるデータの一部に \0 が含まれていた事で動作がおかしくなったようです。
\0 を取り除いてやる事で解決致しました。
# <select multiple>なんかだと\0で区切られるのを忘れてました、、
>>123 > quote する以前に、そのまま出力出来てるの?
ビンゴでした、、Data::Dumper->Dump してみたら
\0 を発見致しました。取り除いて見ると全く問題なしです。
>>124 確かにわかり易いのですが、
@column_names の値が固定ではないのと、一度だけの処理なので do を利用しております。
プレースホルダを利用した方が格段に処理が速いと言う事なら考えますが、
書き直しが面倒なので benchmark は敢えて取りません:-P
>>134 ありがとうございます。_|\○_
Data::Dumper->Dump で全てが解決致しました。
150 :
デフォルトの名無しさん :04/10/19 16:01:37
$hogeみたいなスカラー変数内の文字列に行番号を打っていくうまい方法はありますか? 調べてみたけど、ファイルから読み出して行番号を打っていく方法しか見つかりませんでした。
>>150 $hoge =~ s/^/++$i/emg;
少し凝るなら
$hoge =~ s/^/sprintf("%3d: ",++$i)/emg;
うまくいきました。 ありがとうございました。
binmodeを解除するコマンド、 つまりFHを明にテキストモード扱うようにさせるコマンド(方法)って 何かありますでしょうか? FHならopen/closeすればいいのですが、 binmode STDOUT; を途中で解除したいわけですが。
>>153 binmode STDOUT, ":raw";
ただしラクダ3版には「binmode関数は、ファイルをopenしてから、その
ファイルハンドルに対して実際のI/O操作を行うまでの間に、実行しな
ければならない」とあるのでいいのかどうかはよくわからん。手元の
perl 5.8.4ではこれでいけたけど。
5.8.4のperlfunc(1)では以下のように
In general, binmode() should be called after open() but before
any I/O is done on the filehandle. Calling binmode() will nor-
mally flush any pending buffered output data (and perhaps pend-
ing input data) on the handle.
出力データがバッファされてればフラッシュされる(=I/O操作している
のが前提と思われる)という記述があるのでどこかで変更されたのかな?
HSP 「21世紀にこんな言語はないだろう」 Perl 「Perlユーザは臭い」 Java 「Javaなんてうんこ」 C++ 「C++なぞ問題外.^^;;;」 Ruby 「Rubyこそ最高言語」 by Rubyユーザ一同
と、思ってるのは作者と一部の信者と、 2chで馬鹿みたいな書き込みしてる偽信者ぐらいだろう…
偽信者=perlerの自作自演 最低だなお前らwwwwwwwwwwwwwww
質問です。 90分毎にhtmlファイルのソースを編集するってことを したいと思っているのですが、 その場合 現時刻を計測 ↓ 90分をカウントする ↓ ファイルの読み込み ↓ ファイルの修正 の繰り返し…って具合に作成すればいいのでしょうか?
はい
161 :
デフォルトの名無しさん :04/10/19 21:21:46
Active5.8をファイルの編集作業に使用しているのですが、 ファイルのコードがshif-jisの為、うまく読み込んでくれません。 入力したファイルをutf-8に変換して編集後に再度元のコードに戻したいの ですが、どのような方法があるでしょうか?
>>161 いろいろな方法があります。
♪Active5.8とはなんぞや?
163 :
デフォルトの名無しさん :04/10/20 00:17:07
>>161 Encodeモジュールを使う
♪Active5.8とはなんぞや?
164 :
デフォルトの名無しさん :04/10/20 00:19:42
-Mencodingの方が手軽か
\ │ / / ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ─( ゚ ∀ ゚ )< くっちゃらはぴはぴ! \_/ \_________ / │ \ ∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< くっちゃらはぴはぴ! Py厨〜〜〜〜! >( ゚∀゚ )/ | / \__________ ________/ | 〈 | | / /\_」 / /\」  ̄ / /
Ruby >>>>>>>>>>>>>>>>>>>>>> Python>>>>>>>>>>>>Perl
日本語≒英語>>>>>>>>>>>Ruby
168 :
デフォルトの名無しさん :04/10/20 18:00:38
Cygwinのperlを使ってるんですが、 open HOGE1 ,">hoge.txt" print HOGE1 "hello\n"; print HOGE1 "world\n"; と書くと、hoge.txtに hello world と出力されるのはなぜでしょうか。 この場合、hoge.txt には world だけ出力されるのが正しいと思うのですが。
open HOGE1 ,">hoge.txt" print HOGE1 "hello\x0D"; print HOGE1 "world\x0D";
>>168 なんで、そう出力されるのが正しいと思うのか、興味あるな。
171 :
デフォルトの名無しさん :04/10/20 18:33:27
>>170 168です。
>と>>の違いがUNIXのものに由来していて、
">"が上書き用
">>"が追加の書き込み用
と説明されているからです。
Cygwin上のbashで
echo hello > hoge.txt
echo world >> hoge.txt
とすれば、hoge.txt の中は
hello
world
になりますが、
echo hello > hoge.txt
echo world > hoge.txt
ならば、hoge.txtの中は
world
だけになりますので、perlの場合でも同様だろうと考えたからです。
open HOGE1 ,">hoge.txt"; print HOGE1 "hello\n"; close HOGE1; open HOGE1 ,">hoge.txt"; print HOGE1 "world\n"; close HOGE1; ってやってみれ
> truncate(O_TRUNC) >> append(O_APPEND) open(2)をよく見てみれ
174 :
デフォルトの名無しさん :04/10/20 20:16:04
初心者な質問失礼致します hoge.txtに >hogehogehoge$foohogehoge と書かれているとき、$fooの値を perl側で代入して読み込む方法はないでしょうか
>>174 (´-`).。oO( 台風のせいかな? )
>>174 eval使え…と言いたい所だけど、
$fooとhogeの間に区切りが無いみたいだから
$bにhoge.txtの中身を読み込んでおいて、
$b =~ s/\$foo/$foo/g;
かな。evalもこれも自分としては気持ち悪いけど
自分ならhoge.txtの中身を
>hogehogehoge%foo%hogehoge
とかしておいて、
$b =~ s/%(.*?)%/$h{$1}/g;
と、専用の連想配列から取り出して置換するな。
(hoge.txtが汚染されていた場合やばいから)
>>176 有難うございます
$b =~ s/\$foo/$foo/g;
でやってみたいとおもいます
厨な質問で申し訳ありませんでした
Perlの最新バージョンって5.9.1?
6
ruby
6になったら、5のメンテするひとっていなくなるのか?
>>178 Perl5 限定の話だとして、
安定版 (通常はこれを):
Perl 5.8.5
ActivePerl Build 810 (5.8.4 相当)
旧系列 (旧ヴァージョン依存のスクリプトを使う場合はこれを):
Perl 5.6.2
ActivePerl Build 638 (5.6.1 相当)
Perl 5.005_04 (gcc3 へ対応 etc.)
Perl 5.005_03 (こちらでも問題無し)
開発版:
Perl 5.9.1
MacPerl やらはよく分からず。
詳細は
http://www.perl.org/ なり
http://www.activestate.com/ で。
183 :
デフォルトの名無しさん :04/10/21 16:44:59
>>182 MacPerlは5.6.2 r2 のもより。
OSXでは5.8.2のもより。
>>184 $ perl -v
This is perl, v5.8.1-RC3 built for darwin-thread-multi-2level
(with 1 registered patch, see perl -V for more detail)
だたスマソ@MacOSX 10.3.5
おっ?マカも居たのか! んじゃ、質問です。 OSの「開くダイアログ」を呼び出すモジュールと関数を教えて下さい。 MacJPerlに馴れちゃったんで、OSXになって不自由してます。 どうか、よろしくお願いします。m(_ _)m MacOSX10.3.5 / perl v5.8.1-RC3です。
>>186 そんな器用なものは入っていないかと思われ(苦笑)@だって標準のperlだし。
>>187 レスありがとう。
CAPNに出回ってないかと…。英語苦手なものでスミマセン。
いまは、AppleScriptを呼び出したり、逆にAppleScriptの
ドロップレットから、perlを呼んだりして、一応出来るんで
すが、なんか不毛な気がするので。
>>189 踏む踏む、なぁるほど。。
漏れの場合、うに機と同じ感覚でterminalで動かしていたりするからあんまり苦になっていなかったりします(w
♪試しにperl -MCPAN -e shellしてみたらなんだかいろんなもの拾い始めた鬱@Securty up-dateしたら消し飛ぶ悪寒(泪)
・・・
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY が取ってこれないみたい(滂沱)@ブラウザだと、ささっと取ってきやがる(怒)
>>190 漏れも perl -MCPAN -e shell は、やったんです。
んがっ!けたたましくインストしたけど、正直ワケワカメorz。
darwin::MacOSX::File::Catalog.pm
が、臭いんだけど…。
MacJPerlでラクしすぎたせいで基本すら解ってない事に
気づきました。Mac用のモジュールって、MacPerl用だったり
しません?上のはdaewinってなってるから平気かと思ったん
ですけど。てか、勉強し直すか、Classic上でMacJPerl使います。
ごめんなさいでした。ショボーン━━(´・ω・`)━━
その「@」の使い方はどこの文化だ?
デカルチャー
>>191 Mac::AppleEvents を入れてみたけれど、変なダイアログとか、喋ったりとかしたのでおそらく使えるかと思います(w@make test
使い方とかはマニュアル嫁ってことで。
ところで search.cpan.org は、もう寝たみたいですなぁ(哀)
>>192 俺様文化です(w
ActivePerl 5.8.xでのsystem()関数の挙動について質問。この関
数にリストで渡したときの挙動がNT系と9x系とで異なるのは仕様な
のでしょうか。たとえば「My Documents」の場所を示すスクリプト
use Win32::OLE;
my $wsh = Win32::OLE -> new('Wscript.Shell');
my $mydoc = $wsh -> SpecialFolders('MyDocuments');
system ("echo",$mydoc);
(例のため無理矢理echoを使っていますが)をNT系のOSで実行
させた場合には要不要に応じて二重引用符がつきます。
D:\home
"C:\Documents and Settings\USER NAME\My Documents"
ところがこれをWindows 98/Meで実行すると
C:\My Documents
となり、二重引用符でくくられません。
http://aspn.activestate.com/ASPN/Mail/Message/933468 以下のスレッドではbuild 630から二重引用符は不要になったとの
ことですが、話題がNT系だけで9x系の話がありません。
196 :
デフォルトの名無しさん :04/10/22 14:38:34
実行したユーザ毎に ~/.hogeを作りたいのですが ユーザはどのように特定したらいいのでしょうか?
>>195 (´-`).。oO( cmd.exe と command.com の違いじゃないの…?)
>>196 (´-`).。oO( $< $> $( $) %ENV 辺りを眺めてみたら…?)
198 :
デフォルトの名無しさん :04/10/22 17:42:26
perlで文字列の中から漢字を置換する方法を教えてください。例えば、 $value = "表示します。"; があった場合、 $value = "表\示します。"; に置換したいです。 $value =~ s/表/表\\/g; ってやってみたらうまく動作しませんでした。 よろしくお願いします。
200 :
デフォルトの名無しさん :04/10/22 23:42:57
すみません質問です。 Net::POP3を使ってメールを受信するプログラムをダウンロードして使用しているのですが、 メールの内容が文字化けしてしまいます。 どなたかアドバイスをいただけないでしょうか? プロンプトからtelnetで手打ちでPOP3のコマンドで取得するときは、 set codeset JIS Kanji をしているので文字化けしません。 【ダウンロードしたプログラムの一部】 connect処理 login処理 $ref_mailsize = $pop->list(); foreach ( sort {$a<=>$b} keys %{$ref_mailsize} ){ print "Mail NO.$_ $$ref_mailsize{$_}bytes\n"; } *mailindex = $ref_mailsize; foreach ( sort {$a<=>$b } keys %mailindex ){ print "\nMail No.$_ $mailindex{$_}bytes\n"; $ref_lines = $pop->get($_); $line = 1; foreach ( @$ref_lines ){ s/^\.\././; print "$line: $_"; $line++; } }
perl6って今どうなってるのですか? リリース遅すぎると思うんですが
rubyから必死にパクってます。
203 :
デフォルトの名無しさん :04/10/23 02:18:35
例えば "掲示板" という文字、UTF-8でエンコードすると "E6%8E%B2%E7%A4%BA%E6%9D%BF" となると思います。 そして本来UTF-8のコードである "E6%8E%B2%E7%A4%BA%E6%9D%BF" を誤って $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/ge; でデコードすると "牙ず? " となってしまいます。 この "牙ず? " を元のUTF-8のコード "E6%8E%B2%E7%A4%BA%E6%9D%BF" に戻すには どのように処理したらいいのでしょうか? Jcode.pmを使用せずに元に戻す方法を知りたいのですがどなたか教えて下さい。
perl5.8移行で use encoding "utf8";
>203 "牙ず?" になっちゃった事は、どうやって確認した? UTF-8 文字列を無理やり EUC-JP と見なして表示させると、そう見えるね。 でも中身は 0xE6 0x8E 0xB2 0xE7 0xA4 0xBA 0xE6 0x9D 0xBF のまま 破壊されていないはず・・だから $str =~ /\W/'%'. unpack('H2',$1)/eg; で良くね? もしかしたら、破壊しちゃった?なら無理だけど。
207 :
デフォルトの名無しさん :04/10/23 08:38:57
>>203 誤ってデコードしなけりゃいいだけだと思うのだが、それは
別の香具師で手がだせないという問題?
208 :
デフォルトの名無しさん :04/10/23 09:44:13
>>205-207 皆さんありがとうございます。
Jcode.pmを使ってエンコードすると"掲示板"に戻せるように変換されるので
壊れてはいないと思います。
$str =~ s/\W/'%'. unpack('H2',$1)/eg;
でやると"牙ず?"をeucでエンコードしたことになってしまうみたいで
"牙ず?"にしか戻らなくなってしまいます。
Perlの勉強をPerlについて書かれているWebページを見ながら1週間くらい前から始めました。 基本的な文法を覚え、参考にしているWebページにあるサンプルコード程度のレベルなら 何も見ずに書けるようになりました。 しかし、普段このスレで出る質問はまだまだ自分には難しく感じます。 中には理解できるものもありますが、見ただけでは全然わからないソースもあります。 参考書・参考ページのサンプルコードを真似してる超初心者のレベルを脱出し、 実用的なコードを作れる入り口のレベルに達してさらに上達していくためには どのような勉強方法がいいのでしょうか? 本屋でPerlに関する参考書を見たのですが、どれもWebページで代用できるようなものばかりです。 このスレで質問に答えて下さるようなプロの皆様は参考書を見たりするような 基本的な勉強方法を終えた後にどのように今のようになりましたか? よろしければお聞かせください。
>>209 CPANにおいてあるモジュールのソースをperlインタープリターになったつもりで読みまくる。
>>209 他人の書いたコードを読むのがいいのでは?
>>210 これは...ちょっときついです。
まだまだ修行が足りないようです...。
>>211 周りにPerlを使って何かを作っている人がいないのです。
Webを検索すればたくさん出てくるでしょうか?
『これが俺の作ったソースだ! 見てくれ!』って感じで公開しているところは多いのでしょうか?
>>212 酷いコードが多いからCGI関係はやめておいた方がいい
とりあえずuse strictしてあるコードを探して読みまくるべし
>>209 他人のコードを読みまくると「どうしてこういう設計になってるんだ」という疑問が湧いてくる。
湧いてこないうちは読込みが足りない。湧いてきたらデザパタ勉強汁。
>158 です。 プログラムは作成したのですが… ---------------------------------------------------------- #ファイルをオープンする。 open(file, "hogehoge.htm")|| die "hogehoge.htm をオープンできません:$!\n"; #文字列置換 print file "<br>\n"; $sec = $ARGV[0]; print "$ARGV[0] 秒タイマー\n"; until ($sec == 0) { print $sec--, "\n"; sleep(1); } print "\a"; print "$ARGV[0] 秒経ちました。\n"; close(file); ------------------------------------------------------ 実行させると、タイマーが作動するだけで、htm自体は何にも編集されていません。 どなたかご教授を
馬鹿か。入門書でも読んでろ
CPANってセクハラっぽいね
>>215 とりあえず、openで>か、>>が要るんじゃないか?
ま、このままじゃ、<br>しか、書き込まんが。
>>213 >>214 ありがとうございます。
use strict、って確か文法を厳しくチェックしますよ、って言う宣言ですよね。
早速探して読みまくってみようと思います。
>>221 なんかむちゃくちゃですねスマソ
ちゃんと書き直します。。。
まぁ普通はcron使うんじゃないかなーとか Winならタスクスケジューラーもあるしなー Macは・・・Macも最近はBSDか
Perlでオブジェクト指向の手法を理解でき、使うことができるって言うのはどのくらいすごいのですか? できる人とできない人をドラゴンボールの世界に例えて、戦闘力で教えてください。
226 :
デフォルトの名無しさん :04/10/24 02:25:26
perlのシンボルテーブルの管理を行っているのはソースの どの辺りでしょうか? もう半日くらいperlのソース追っかけてるけど見つからない
>>225 操気弾(エネルギー弾の遠隔コントロール)が使えるかどうか。
使えるけど使わない人も多い
ヤムチャは雑魚だけど、普通の地球人としては異常なレベルの強さ
>>227 Perlでオブジェクト指向プログラミングができないと『会社で使えねぇヤツ』って事にはならないんですか?
他の言語(Java等) でも同じことが言えるのでしょうか?
>228 Perl で OOP しない人→とにかく食べられればいい人 Perl で OO なモジュールを使う人→食べ方にも気を遣う人 Perl で OO なモジュールを書く人→厨房のごたごたまで覗く人 そもそも Perl の OOP は後付で個人的には変態的だと思う。 Java だと OOP は使って当たり前ではないかと。
try-catchはいつ実装されますか
C:\Documents and Settings\mypc\デスクトップ\KAJIKoreRC>perl kore.pl Can't locate Win32/API.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib . ) at kore.pl line 13. となってしまいます。とりあえず()内が見つからないというのは理解できましたが、ではココからどうすれば良いのか皆目見当がつきません。 スレ違いというかそれ以前の問題だとは思いますが、どうかお教えくださいお願いします。
>>231 その程度も自力解決できないようじゃそのうち罠botに
やられるのがオチなのでやめとけ(w
>>230 perldoc.jpのError.pmを参照
>>231 > ()内が見つからないというのは理解できましたが
いや、()内でWin32/API.pmが見つからない
>>231 「Documents and Settings」というフォルダに半角スペースがあるのわかる?
( ゚д゚)? 罠bot (つд⊂)ゴシゴシ (;゚д゚) 罠bot (つд⊂)ゴシゴシ _, ._ (;゚ Д゚)! kore.pl
>235 分かります、ということはDocuments and Settings となっているところを 半角を削ればいいのでしょうか? >236 罠かな…
Perlのバージョン5.8.0と5.8.4はあるのですが 5.8.2等他のバージョンは現在入手可能でしょうか? activestateのHPでは5.8.4しかDLできないようなのですが…;;
Perlマニアですか?
バージョン5.8.0と5.8.4ではどうも不具合が出るので 他のバージョンで試した方が良いとアドバイスをもらったもので…。
>>230 use Error; セヨ。
もうとっくにある。
>>209 即効性もなく、ひどく遠巻きな方法だけれど
sh, grep, sed, awk と進んで C のK&R本を読み、
オライリーの本を「初めての..」「ラクダ本」「クックブック」と進めていくと
文化的な背景も含めて理解しやすいような気がするよ。
少なくとも俺はそうだった。まぁ時代的に進めると単純にそうなるのだが...
>>231 Win32::APIをuseしてる割には
Win32::APIがインストールされてない
(少なくとも C:/Perl/lib C:/Perl/site/lib . で見つからない)
ってことです。これってWin版にはバンドルされてるんだっけ?
>>226 PL_defstash PL_curstash あたりじゃないかなぁ? (in perl.c or gv.c)
Grepしてみてちょ。間違ってたらスマソ。→ see perlguts。
ttp://gisle.aas.no/perl/illguts/ が詳しい。
なお、HV* gv_stashpv(const char* name, I32 create)
を使うと Returns a pointer to the stash for a specified package するとのこと。
つーか皆さんError.pmって使ってます? 俺はバリバリ使ってますけど。
247 :
デフォルトの名無しさん :04/10/24 20:49:12
バリバリ使ってますけど・・・
248 :
デフォルトの名無しさん :04/10/24 20:50:01
バリバリ使ってますよ。
>>244 どうもありがとうございます。
あとでDLしてみますね。
250 :
デフォルトの名無しさん :04/10/24 21:02:34
>>246-248 便乗質問!!
use Error すると record という関数がインポートされますが
これってどう使うのでしょうか?
マニュアルにはさらっと、シンタックスシュガーと書かれてるだけでよくわからんです。
知ってる方教えてくだされ。
>244さん ありがとうございます。Win32-API-0.41落としたのはよいのですが インストはCのperlにおいてみたんですがだめでした。 どなたかごしどうおねがいできませんか?
>>251 UNIX系だとその後
perl Makefile.PL; make && make install
ですぐ事は済むのだがね。。。
Winのひとおしえてあげてください。コンパイラ必要なのかな?
>>251 Win32::APIはCのコンパイラがいるみたい。コンパイラを持ってるなら
perl Makefile.PL
nmake
nmake test
nmake install
ってやればいいんだけど、持ってないなら、ActivePerlを使ってればppmからインストールできる。
253さん ActivePerlを使ってppmからインストールしようとしましたが ppm> install-API.pm Unknown command 'install-API.pm'; type 'help' for a list of commands. となってしまいます。 ココからどうすればよいのでしょうか? どうか御教授お願いできませんでしょうか?
>>254 今インストールしようとしているモジュールはWin32::APIでしょ。
だから
ppm> install-API.pm
じゃ意味が通じない。
ppm> install Win32-API
でやってみ?
255さん ありがとうございます Win32-API無事にインストできました。perlなんか楽しいかもしれないです(単純だ) こんどは Can't locate HTTP/Lite.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib . ) at kore.pl line 14. BEGIN failed--compilation aborted at kore.pl line 14. となってしまいました。 もうどうしたらいいのか分かりません。もしよろしければ手を貸していただけないでしょうか?
おめーうぜーよ ちょっとは自分で考えろよ、ぼけ
MFCのソースからすべてのクラス名を標準出力に 昇順にかつユニークに出力するプログラムを作成せよ。 但し、perlソースは5行以内かつ実行時間3000ms以下
宿題はスレ違い
オタの聖地、ROのBOTを動かしたい でもプログラムのプ( ´,_ゝ`)の字もしらないこの俺 調べるのもまんどくせ2chへ質問しちゃえ 調べる気もない、教えてもらっても理解しようとする意志がない、Perlをやる気もはなっから無い これじゃ嫌われるわな
perl -e 'print &{&{sub{(my $v=1,sub{$v},$v=2)[1]}}},$v' これの出力がなぜか"22"になります。これはどうしてでしょうか? perl -e 'print &{&{sub{my $v($v=1,sub{$v},$v=2)[1]}}},$v' これならちゃんと"2"になるんですが。分かる人いますか?
すまそ。3行目はこれが正しいです。 perl -e 'print &{&{sub{my $v;($v=1,sub{$v},$v=2)[1]}}},$v'
あ、my変数のスコープはリストないの一要素に限定ということか。そかそか。 (my $v=1,sub{$v},$v=2)の二番目三番目の$vはグローバルスコープの変数だったのね。失礼。
>>266 試してみたら次の文にならないとスコープは有効にならないということ
のようですな。勉強になった。
while (((my $x = <>) == 1) || ($x == 2)) {
print "x=$x\n";
}
なんてやっても1しか受け付けないってことで、知らないとうっかり書いて
しまいそうだなぁ。use strictすれば怒られるからわかるけどね。
>>267 ちょっと違ってたみたいです。。。
perl -e 'use strict;{(my $v=3,print "$main::v\n");print"$v\n"}print"$main::v\n"'
リストを作成するカッコにはスコープを限定する機能はないってことなのかな?
関数以外でスコープを限定するには{}(ブランケットっていうんだっけ 汗)
しかないのかな?
つまり
while(my($k,$v)=each %Hash){...}
というのは
my($k,$v);
while(($k,$v)=each %Hash){...}
と同じということなのかも。
ただし、
>>264 の例からも分かるようにリストの要素内ではスコープを確保される。
'use strict;(my $v=3,print $v,...
とは書けないんですよね。
{ my($k,$v); while(($k,$v)=each %Hash){...} } こうか。 あーなんかよくわかんなくなってきた。 ラクダ本読んで出直してきます。
>>259 perl -e "while(<*.cpp>){open(IN,$_);while(<IN>){@a=/C[A-Z][A-Za-z]+/g;map{$h{$_}=1} @a;}close(IN);}END{foreach(sort keys %h){print qq<$_\n>;}}"
じゃだめ?
>>269 ラクダ本読んでもスコープまわりの説明はいまいちハッキリしない
んだよな。perlsub(1)の「Private Variables via my()」という
見出しの中の以下の記述がオススメ。
The declared variable is not introduced (is not visible) until after
the current statement. Thus,
my $x = $x;
can be used to initialize a new $x with the value of the old $x, and
the expression
my $x = 123 and $x == 123
is false unless the old $x happened to have the value 123.
>>271 あ、なるほど。セミコロンで区切られる式の評価順序の問題だったのですね。
リストと無名関数を使ってちょっと変わった構造のプログラムでも書いてみようかと
思ったのですが、myの評価順序はかなり制約になりそうですね。
s/式/式内/
ここはミスコピー用紙の裏?
276 :
デフォルトの名無しさん :04/10/26 01:30:04
RH9 と perl 5.8.5 で use encoding と ithread を同時に使うと segmentation fault になっちゃうよ どういうこと〜?
Linuxはクソってこと
278 :
デフォルトの名無しさん :04/10/26 13:05:38
すんません厨です。 ディレクトリ内の全てのファイルを置換したいのですが、 @a = <*.html> ; foreach $i (@a){ open(YOMU,"$i") or die $!; open(KAKU,"> $i") or die $!; while ($a = <YOMU>) { $a =~ s/<p>/<P>/g; print(KAKU "$a"); } close(KAKU); close(YOMU); } 上手くいかない。
>>278 読み込み用と書き込み用に同一のファイルを同時に開くな。
tmpファイルを使うか、配列かなんかに突っ込んどけ
>>278 -iオプションという手もあるな。大きなプログラムの一部にするには
ちょっと面倒だが。(Perlクックブックに例がある)
281 :
デフォルトの名無しさん :04/10/26 13:35:06
282 :
NIDA :04/10/26 15:52:01
こんにちは、NIDA といいます。 // FC2 と Perl v5.8.3 です。 ちょっと質問なんですが、下のようなものを Perl で書く場合 どのようになるのでしょうか。 # =================================================== int main(int argc, char* argv[]){ int i; char str[ 32 ]="A"; for(i=0; i<26; i++){ printf("%s", str); str[ 1 ]++; } return 0; } // 出力結果 : "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # ===================================================
&perl; sub main::perl{ $str= 'A'; for($i=0; $i<26; $i++){ printf("%s", $str); substr($str, 1, 1)= chr(ord(substr($str, 1, 1))+1); } return 0; }
>>282 $str = "A";
for($i=0;$i<26;$i++){
@tmp = unpack("CC",$str);
print pack("CC",$tmp[0],$tmp[1]+$i);
}
285 :
278 :04/10/26 17:17:48
出来た。お礼まで。
286 :
デフォルトの名無しさん :04/10/26 17:57:02
perl でアクセスできるデータベースを 作ろうと思うのですが、データ形式がテキスト形式でperlと相性のいい DBを教えてください
DBI:CSV
289 :
NIDA :04/10/26 22:38:31
>>283 , 284
chr, ord, pack, unpack なんて関数があるんですね。
ありがとうございました。 m(_ _)m
Aがアラジンチャンスと思ってしまう、漏れは逝ってよしでつか?
>>282 マジカルインクリメント
my $char = 'A';
foreach (1 .. 26) {
print $char++;
}
#結果 : ABCDEFGHIJKLMNOPQRSTUVWXYZ
292 :
デフォルトの名無しさん :04/10/26 22:48:49
>>291 それじゃ半角じゃない。
str[ 1 ]++;とやっているから全角でやりたいのは確かだ。
>>291 my $char = 'A';で半角になっているのに、
#結果 : ABC...と全角になっているのは何故ですか?
print for ('A'..'Z'); ではだめ?(w
295 :
デフォルトの名無しさん :04/10/27 01:04:40
↑ カコイイ
296 :
デフォルトの名無しさん :04/10/27 03:30:09
今ActivePerlとApache入れて試した。 cgiファイルで #!/usr/local/perl print "<html>\n"; print "<body>\n"; print "<h1>hoge</h1>\n"; print "</body>\n"; print "</html>\n"; って書いて動かしたら ブラウザに書いたのが全部出た。hogeだけ表示させたかったんだがorz タグとかprintとか表示されちゃったよ。何故?仕様?
スレ違いだけど、 print "Content-type: text/htnl\n\n"; を書かなきゃ表示されんぜ。
htnl→htmlだた
ここもおかしくないか? #!/usr/local/perl
perl -e'use encoding "euc-jp";print "A".."Z"' こういうのやってみたいんですが、できますか?
できない。 e'use ほげなオプションありまへん。
標準入力を標準出力したプログラムを作ったんだけど、 perl script.pl < file の場合はうまくいくけど、 script.pl < file はうまくいきません。 なぜなんでしょうか? (リダイレクトせず単体では動作します。) (ActivePerl/WinXP)
308 :
デフォルトの名無しさん :04/10/27 13:29:49
age忘れ
( ゚Д゚)ポカーン
type file | script.pl
#!f:/free/perl/bin/perl #僕の環境です print $_ while(<>);
script.pl file ○ script.pl < file × script.pl ○ type file | script.pl × --*1 error message perl script.pl file ○ perl script.pl file ○ perl script.pl ○ type file | perl script.pl ○ *1 プロセスが存在しないパイプに書き込もうとしました。
>>313 AcrivePerlの問題だと思うんだけど,なぜcmd.exeの使い方が原因だと思うのか教えてほしいです
それが分からなければ向こうにも質問できない
ActivePerlの仕様でした。
>>313 レス自体はありがたいが質問の答えやその問題点が分かってない
ならレスは不要。逆に混乱や迷惑になるのでやめてください
逆切れスマソ
仕様ってどんな仕様だよ そこまで書いてりゃ逆切れもスルーできるんだがなぁw
ワラタ、問題点が分かってないのはおまえだっつーの(w
>>315 逆切れするのは勝手だけど、話を振っといて、
自己解決したらハイサヨナラってのはどうかと思うぞ。
どういう仕様が原因でそうなったかとか解決方法とかを
書いて情報共有してもバチは当たらないと思うがどうよ。
すみませんが、どなたか「if(-x _)」という条件文の「-x _」の部分の意味を教えて貰えないでしょうか?
直前に-X(ファイルテスト演算子)またはstat/lstatで調べたファイルが現在の 実行UID/GIDで実行可能なパーミッションのとき真、それ以外は偽。 くわしくはラクダ本の「ファイルテスト演算子」について書いてあるところ またはperlfunc(1)を参照せよ。
321 :
デフォルトの名無しさん :04/10/27 18:04:22
html画面を出力する際に、 1:DBの更新を行う。(insert,update) 2:DB更新完了後、その旨をhtml画面で表示する というものを作ったのですが、1のDB更新件数が膨大になるとi更新処理に時間が掛かりすぎnternal server errorで落ちてしまいます。 なにか対策方法はあるのでしょうか?
なるほど。perlfunc(1)でググってみたところ解かったような気がします。 ありがとうございました。
ググる? # perldoc -f -X がいいんだけど。
ところでこの「-x」は環境(OS?)に依存して挙動が変わりますね。 Linux環境では単に実行権限があるかどうかを調べてるようなのですが、 Windowsだとexeファイル以外は偽を返すようです。 あるいはWindowsではexeファイル以外は実行権限を持たないように管理されてるのかもしれませんが・・・
しかしperlやってるやつってバカが多いなww 英文ドキュメントすら読めない>307 知ったかレスで逆切れされてる>313 カスばっか(ププ
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Perl
>>323 情けないことにLinux環境とかのドキュメント読むのに慣れてないもので、
そういう便利な機能があることに気がつけなかったです;
ググったところ、最初にperldocの日本語訳されたものが出てきたので助かりましたが。
P e r l ス レ は レ ベ ル 低 ぅ ( 失 笑 )
右翼の俺としてはひまわり最強!!!!!
かわいそうに、rubyが伸びなくて、八つ当たりしてる奴(w ruby基地、また、帰ってきたか(プッ
C++&boost::regex >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Perl
>>331 に続く
>>>>>>>>>>>>>>>>>>>ruby
煽りは放っておいて淡々マッタリと進行するのが大人の態度
反論しようにも無理だしなwwwwww
その程度もようやらんのか。アホすぎ
>>335 Ruby 厨ウゼーとか言われそうであれなんだけど、 Ruby だとこんなのができるよ。
% ruby -ropen-uri -e "print open('
http://2ch.net/ ').read"
Perl でもできるとかなり嬉しい悪寒。
webprogはゴミ溜め。 perlはそのまんまゴミ。 Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Perl
> が足らなさすぎ もうちょっとRuby勉強しろ、ぼけ
python! python! (AAr
>>341 いや、短く書くコンテストをしたいわけじゃなくて、多態で幸せになれるという話なのですが・・・
初心者です。perlのTkで円を作るプログラムを作りたいのですが。 キャンバスを一回クリックし、そこを中心としてマウスを動かしして二回目のクリックの とこまでを半径とする真円を作りたいのですがうまくいきません。楕円はできるのですが。 教えていただければ幸いです。
>>343 それはPerl/Tk関係ないな、算数を思い出せ。
クリックされた2点間の距離を計算して半径にしろ
>>344 はい、ないですが、それがどうしたのでしょうか?
348 :
デフォルトの名無しさん :04/10/28 22:10:49
GD はいらんな
https?://で始まるスキームだけをoverrideして欲しいモナー
それはオーバーライドや多態じゃなくて単にopen関数の仕様だろ。
351 :
デフォルトの名無しさん :04/10/29 00:10:27
>>125 >>136 >>142 この142さんの「思いっきり条件付きだろうが。」とは
どういった状況を指しているんでしょうか?
自分ではOSかfairewallで内側からのportの使用を制限している時ぐらい
しか思い浮かびません。
サーバーをまたいで動作するプログラムの動作条件がどのくらい厳しい物になるのか
知りたいためご教授下さい。
352 :
デフォルトの名無しさん :04/10/29 06:52:29
クロスサイトスクリプティング でぐぐれ
ユーザIDとパスワードで認証を行うcgiを作成したのですが フォームからのパスワードが変数にうまく入っていないようでして ユーザファイルのパスワードとフォームに入れたパスワードの評価式がうまくいきません。 ユーザファイルのIDとIDフォームのIDの評価はうまくいってます。 原因わかりますでしょうか。 if ($in{'wrt'} ne on) { print "<br><br><br><form action=\"$script\" method=\"POST\">\n"; print "<input type=hidden name=wrt value=\"on\">\n"; print "<tr><td align=center><b>ID</b></td><td> <input class=text type=text size=12 name=id></td></tr>\n"; print "<tr><td align=center><b>パスワード</b></td><td><input type=password size=12 maxlength=8 name=pwd></td></tr></table>\n"; print "<br><br><input type=submit value=\" 認証 \"></form>\n"; print "</center></body>\n"; } else { $flag = 0; open(IN, "$userfile");#パスワードファイルを開く while ($data=<IN>) { ($id,$pwd) = split(/,/, $data);#カンマでIDとパスワードを分割 if ($id eq $in{'id'}) {$flag = 1; last; } } close(IN); #パスワードチェック処理 ##############################ここが正しく評価されません if($pwd ne $in{'pwd'}) { &error("パスワードが違います"); }
>>353 $idをキーとするハッシュに汁。
そのままやるんなら、idとpassが1行に1個しかかけないね。
$data=<IN>が糞。
>>フォームからのパスワードが変数にうまく入っていないようでして 「ようでして」じゃなくてちゃんと調べろよ。入力パラメタの値を そのまま表示するぐらい簡単だろ? それにフォームからのパスワードが変数に入ってないといいながら 肝心の変数にいれるとこを出さないでいれちまった後の処理を 貼ってもしょうがない。
356 :
デフォルトの名無しさん :04/10/29 14:47:19
perlのsystem関数でCのモジュールを呼んでいるのですが その戻り値として、Cのバッファ(char *)(100文字)を返しているのですが うまく格納できません。 Cソース抜粋 char *test_buff; test_buff = malloc(100); return test_buff; perlソース抜粋 $buff = system("test.exe");
そらそうよ
358 :
デフォルトの名無しさん :04/10/29 15:04:22
>>356 Cの方で文字列を標準出力に書き出して、Perlの方からはパイプを使って読め。
359 :
デフォルトの名無しさん :04/10/29 15:10:02
361 :
348 :04/10/29 20:42:17
なーんでGDだけはいらんのだろ?
363 :
348 :04/10/29 20:47:55
>>362 うん。でも心の何処かで助けを求めてる自分が居るような気がする。
364 :
デフォルトの名無しさん :04/10/29 20:58:35
誰か教えてください。 while( $hogehoge =~/正規表現/gm) { $get = $&; } と言う風に、マッチングした複数行にわたる文字列を取得して いますが、$hogehogeが巨大なテキストファイル(だいたい500k以上) になるとループが動きません。この方法ではダメだとか、 ほかにいい方法があればご伝授ください。
>>363 んなこと言わずにもっと具体的に問題点を書きなよ。
366 :
348 :04/10/29 22:21:38
>>364 ?
マッチすると無限ループするのか
斬新だなぁ
>>364 正規表現の内容によってはバックトラックがはげしく行われる等の
理由で無限ではないがものすごく時間かかることはあり得るな。
正規表現を具体的にさらせばなにか答えてくれる人がいるかも?
369 :
364 :04/10/30 00:07:34
>>367 >>368 同じファイルで、マッチングしない部分を切り取って、
ファイルサイズを小さくした場合、正常にループが動き、
マッチングも思い通り行きますので、無限ループに陥っているわけではないみたいです。
デバッグでも確認しましたが、ループそのものが吹っ飛んでプログラム
自体が強制終了しているようです。ファイルサイズもそんなに大きくないので、
訳が分かりません。ただ、モジュール(*.pm)のサブルーチンに、$dataのような
形で渡しているのが気にはなるのですが、配列にして参照渡ししても事態は
変わりません。
強制終了となるとメモリ不足とかそっちの関係かもしれないな。 あるいはcpu時間の制限されてるとか...
改行が入ってるとか
自動的にデータを収集するプログラムを作りたいと思います。 たとえば、yahoo-movieの興業成績ランキングにリンクされている映画の 題名、出演者などを自動収集したりしたいのですが、Perlでできるのでしょうか? また、Perlでするのは正しいのでしょうか?また、簡単にできるのでしょうか? ご教授お願いします。
問1. 出来る 問2. まぁ正しい 問3. 人による、ある程度Perlが使える人間にとっては簡単
374 :
デフォルトの名無しさん :04/10/30 03:05:21
Rubyこそ最適解
>>366 虫の居所の悪いときなら「チラシの裏に・・・」って言うんだけどね。
>>364 while ($hogehoge =~ /(正規表現)/gm) {
$get = $1;
}
としてみてはいかが?
>>364 $hogehogeに含まれるマッチする最後の文字列が欲しいんだよね?
/(regex).*?(?!regex)/gm
なんてどうだろ
んで$get = $1
あとregexに関わる特殊変数は使わない方がパフォーマンスはよいです
378 :
364 :04/10/30 12:55:07
皆様いろいろありがとうございました。 いろいろやってみましたら、正規表現の記述に問題があり、 動作が不安定になるようです。具体的には、複数行にわたって start とendではさんでいる間の(.*|\n)+が問題だったようです。 繰り返し数はほとんど無限と思っていましたが、調べてみたら 32766あたりが最大のようです。
>>378 正直、どんなデータに何をしたいのかとか実際に実装してみたパターンを
晒してもらわないと想像でしか言えないんだけど、
m オプションを付けてるんだから (.*|\n)+ みたいなパターンは要らない気がする。
/(start\n(?:.+?)end\n)/gm
とかでええのでは?
あと、
>>377 の指摘の通り、 $& みたいなのは使っちゃダメだ。
/([^\n]*\n[^\n]*\n)/gm みたいなのででかいテキストのマッチを試してみたけど、
$1 なら一瞬で終わるのが $& を使うと激遅になる。
しかも、コード中の別の箇所で一度でも $& を使うと同様に激遅になる。
$`, $&, $' は死んでも使っちゃダメだ。いや、使ったら死ぬ。
>>378 なんかregexec.cをみるとREG_INFTYという定数があって、32767っぽいですな。
んで、+,*はそれぞれ{1,REG_INFTY},{0,REG_INFTY}と同じになっているようです。
無限じゃないのか〜。
>>378 ひょっとしてこれが出たのかな?
Complex regular subexpression recursion limit (%d) exceeded
(W regexp) The regular expression engine uses recursion in complex
situations where backtracking is required. Recursion depth is
limited to 32,766, or perhaps less in architectures where the
stack cannot grow arbitrarily. ("Simple" and "medium" situations
are handled without recursion and are not subject to a limit.)
Try shortening the string under examination; looping in Perl code
(e.g., with while) rather than in the regular expression engine;
or rewriting the regular expression so that it is simpler or
backtracks less.
おしえてくんでスマヌ。studyって、どんなとき有効?
383 :
364 :04/10/30 15:01:35
いろいろお世話になっています。いろいろ試してみましたが、 どうしてもうまく行きません。具体的にデータをだしてみますので ご教授いただければ助かります。 対象文字列は、 $data = " >comment1\nhogehoge\n・・・多数行\nhogehoge\n >comment2\nhogehoge\n・・・多数行\nhogehoge\n >comment3\nhogehoge\n・・・多数行\nhogehoge\n >・・・繰り返し " の形をしています。ここで、>comment を含む(またいで複数取得する場合あり) 多数のhogehoge\nを取得するために、 while ($data =~ /(^>comment_start((?!>comment_end).*|\n)+)>comment_end/gm ){ $get = $1; } と言うようにとっています(377さん,379さんの指摘どおり$1にしました)。 comment_startとcomment_end間が短い場合 (おそらく32776行以下)は、この方法でいきますがそれ以上の場合は ループが吹っ飛んでいます。ご指摘のとおり、+などが無限ではないためだと 思います。今までは、多数行にわたる場合\nで切った各行を処理して その結果をつないだりしていたのですが、勉強のために正規表現を使った 方法に切り替えて苦労しています。考え方としては、comment間にある hogehogeのブロックを1つとして表現できれば良いのかと思っていますが、 そのような正規表現は可能でしょうか。
>>383 まだよくわかんないけど、その $data を取るならこうかなあ。
/(^>comment\d*\n[\s\S]*?)(?=>comment\d*\n|\z)/gm
for (/start(.*?)end/gs){ 処理; }
>>383 32,776については量指定子を大きくしただけでも弾かれてきますね。
$ perl -e '/.{100000}/'
/.{100000}/: Quantifier in {,} bigger than 32766
たぶん、これの絡みで、$hogehogeが13,792行より大きいと
(正規表現は383さんとはちがうんですが)
while ($hogehoge =~ /((?:.*\n)*)/gm) {
my $get = $1;
....
}
で、うちのマシンではSegfaultします。(v5.6.0 built for i386-linux)
行が少なければOKです。
/mオプションでループさせるよりも、/sでいったん欲しい部分を切り出してからの
処理の方がいいかもよ。ちょっとダサイかもしれないけど。
for (split />comment/, $data) push @result, $& unless s/正規表現//gs; } よくわかっていません、、、
>>387 やるなら
if ($hogehoge =~ m/>comment1\n(.*)>comment2/s) {
my @result = split "\n", $1;
....
}
forなら
my @result;
@result = split "\n", $1 for ($hogehoge =~ m/>comment1\n(.*)>comment2/s);
ついでにいうと、間にはさまれるかもしれない >comment* を 取りさった状態で取得したいなら @result と split の間に grepを挟む。 ifの場合でもforの場合でも同じ。 @result = grep { !m/^>comment/ } split("\n", $1 ....
>>389 隠しファイル以外をゲットしたいときも似たようなことやるよね。
@files = grep !/^\./, readdir DIR;
>>390 漏れはやらないなあ。
my @files = <*>;
392 :
364 :04/10/30 18:09:58
>comment_startで切って、>comment_endで切って、>で切って つなげ直すしかないのかなあ。 $cs=">comment_start"; $ce=">comment_end"; 1行で直接的に書くとこんな風 $get=$cs.(split(/$ce/,(split(/$cs/,$data))[1]))[0].$ce.(split(/>/,(split(/$ce/,(split(/$cs/,$data))[1]))[1]))[0]; 一応まともに動くけど、誰かもっと分かりやすいコードに直せませんでしょうか。
>>393 シェル使う?これだとシェルを起動しちゃうんだっけ?
>>392 いまいちデータの構造がどうなっててどうしたいのか伝わらんのだが
...
>comment_start
>comment1
foo
bar
baz
>comment2
hoge
huga
hage
>comment_end
...
てな構造で $get には >commen_start の次の行から >comment_end の直前行まで欲しいってこと?
でかいファイルをまとめて読んであれするよりは もともと行になってんだから行単位に処理した方が 楽かもな。
>>392 同じ動作であれば下ので充分いけますよ。
print $1 if ($data =~ m/(>comment_begin.*>comment_end[^>]*)>/s);
399 :
364 :04/10/30 18:38:08
>>395 わかりにくくて、すみません。
>comment_start
foo
bar
baz
>comment2
hoge
huga
hage
>comment_end
hoge
nuke
kuke
と言う風に、>comment +データ領域 単位で取得したいのですが。。
全データが大きいので、正規表現の* とか+が動かない場合があって
苦労しています。
>>394 手元のラクダ本(2nd edition)には
“グロブを行うときにはサブシェルが起動される。だから、自分でreaddir関数を呼び出して得られたファイル名に対しgrepをする方が速いことが多い。”
と書いてある
まぁ“現在の実装では”と後付けされてはいるが
$get = $1 if ($data =~ m/(>comment_begin.*>comment_end[^>]*)>/s); か。
>>399 ますますワカラン・・・w
>comment_start
foo ← >comment1は無いの?
bar
baz
>comment2
hoge
huga
hage
>comment_end
hoge ← >comment_start は無いの?
nuke
kuke
何にせよこれがファイルに書いてるデータならwhileで回してフラグ使ってチマチマやるのが正解だと思う
使ってるシェルやプラットフォームに応じて グロビング表現を対応させるために、 Larryはシェルを呼ぶようにしたんだと思う。多分。 シェル依存にしないでPerlで実装させる手もあったんだろうけどね。
>>364 要は取り出したい部分が comment_start と comment_end に囲まれている
「というだけではなくて」comment_end の後に 1セクションぶら下がってる
って、ことに四苦八苦していると理解していいのか?
406 :
364 :04/10/30 18:58:32
>397 $cb=">comment_begin"; $ce=">comment_end"; $get = $1 if($data =~ m/($cb.*$ce[^>]*)>/s); でうまくいきました。皆様大変ありがとうございました。 while loopを使って内部処理も同時にしようと思ったのが、つまづきの 始まりでした。得られた結果を順番に処理していくことにします。
なんでそんなに正規表現にこだわるの?
なんかもうデータ構造見直せとしか言えん・・・
>>408 マークアップ言語風に start〜end タグで囲まれてるデータじゃなくて
たぶん辞書風に title->content(s) と列挙されているデータなんだよ。
で、contents部分のフィールド数が可変だから行方向にならべるしかない、みたいな。
伝票とか、ヘッダとアイテムで構成される一般的なデータ構造もこの構造とるよ。
まあ、ファイル格納というよりはDB向きという気もするけどね。
410 :
364 :04/10/30 19:17:37
>>407 正規表現を使って複数行の取得をして、それができたら
グループ分けで値を取得して、同時に処理も可能だと
楽だなと思った次第です。ごく簡単な正規表現しかしらないので、
今までは、行ごとに区切って、つなげてとやっていたのですが、
今回いろいろ教わりましたので、少しperlのスキルが上達した
感じです。ただ、巨大なファイルでなければ動いていたのですが、
こんなところに落とし穴があったとはという驚きもあります。
>>409 メールのmbox形式が、このケースの場合近いんじゃないかな?
日付やタイトルで範囲指定して中身を取り出す操作に近い気がする
>>406 >>410 まあ結局、">comment_begin"〜">comment_end"の組が32767以上あったら破綻する訳だ。
巨大もなにも、何かのログファイルだったりすると当たり前に越えるだろうから、
whileとフラグでチマチマやる方が正解。
>>412 m//mでやる場合はそうだけどm//sの場合のマッチは1回だけだから
32767の制限にはひっかからないし
>>406 のやり方で
ぜんぜんOK何じゃないの?
cgi-bin.plのダウンロード先、教えてちょんまげ
そんなの知らんちょんまげ。CPANで検索するよろし。
日々CSV形式でログが蓄積されるシステムがあったとして、 何らかの検索条件を指定して(例えば●●フィールドの 値が××のレコード)を検索するようなことをやりたいんだけど、 どうやったら速いかな。 ちなみにCSVファイルは1日1ファイル、1ファイル数万行、 1レコード15カラムくらい。
daemon書いて常駐させてメモリに全部持つ
>417 無理じゃね? 1レコード15カラムでざっくり200バイトとして、 1ファイル2万行。ってことは4MB。 日々蓄積ってのが期間がわからんけど、1年としたら 1GB余裕で超えるべ。
たった1GBだろ。 そのへんの検索エンジンが何TBメモリ積んでると思ってるんだ
書いてませんでしたが、ログの蓄積期間は1年です。 あと動作させるのは普通のPC(Windows2000)で メモリはよくて256MB、おそらく128MBです。
>419 いや、書いてないから分からない。
128MBか、少ないな。
sql で use dbi
遅そう
そもそも速度が重要ならperlとかcsvなんて使うなよ
>423 レコード数どのくらいいけるの?
>>425 いやー、多分君は聞かれてないと思うぞ。
>>426 儂が扱ったのはMysqlで3万件ぐらいだけど、知ってる人のは100万件超えてる。
儂 ←これなんて読むの?
オゥレ
>429 のう
>>416 速さを求めるならRDBMSに突っ込んだほうが良いかと思われるけど。
お手軽にやるならDBI+DBD::CSVかなぁ。
わし 0 【▽私/▼儂】 (代) 〔「わたし」の転〕一人称。男性が、目下の者に対して尊大な感じを伴って用いる語。おれ。 「―も年をとった」 〔近世では、主として女性が用いた。 「薄雲はしほと涙ぐみ、―はかやうに落ぶれて路頭にさ迷ひありく事/浄瑠璃・当麻中将姫」〕
ore
>435 2000万件くらいから3000件ぐらい選択するのに どのくらいかかるかな。
437 :
デフォルトの名無しさん :04/10/31 14:10:53
perlでファイルを100コ作る方法を教えてください。
>>437 100回ファイルを作る動作をすればいいだけじゃないか
>>416 オラクルで2000万件超の業務データ扱ってるけど
インデックス張っておけば単純な検索なら一瞬だよ。
(まあ、索引付けた列のカーディナリにもよるけどね)
CSVをDBMSに転送して、そっちで検索かけたほうが賢いんじゃない?
まあ、検索アプリにするのなら データをDBに落としてI/FをDBIあたりで出力をWEBに出すというのがラクです。 ただDB用にメモリ128MBしか充てられないとすれば 追加で何かちょっとしようとしたら途端に辛くなるかもね。
442 :
デフォルトの名無しさん :04/10/31 16:51:44
漢ならヒタスラGrep汁! 安上がり汁!!
ソケットのコネクションを毎回保ったままにするプログラムを作成したのですが どのような方法があるでしょうか? セッションやPersistentを使っても接続は毎回切れてしまいますし mod_perlで試してみたのですがプロセスがMaxSpareServers分起動され 必ず前回のコネクションが保ったままのプロセスにアクセスされるとは 限らないため期待する動作になりません。 プログラムAとBを作り、Aは常駐してbindしコネクションを保ったままにし BからAにセッション情報を渡して前回のコネクションを保持するという 方法が一番現実的なのかな
>>443 そのプログラムAをApacheのモジュールとしてええのでは?
コネクションに番号付けて管理しておき、セッション番号と照らし合わせて
渡してあげる。みたいな。
>440 サンクス >441 サンクス >442 ノーサンクス
perlのコードから設計書ってつくれないですか?(javadocみたいな) とにかく設計書のページ数をかせぎたい・・・。
perldoc
>>449 ありがとう。・゚・(ノ∀`)・゚・。
さっそくググってみます。
あらかじめpod埋め込んでないとどうにもならんような。 pod埋め込んでいてperldoc知らないとも思えないし...
うめこんでないやorz
cgiページからpostでまた別のcgiを呼んでいるのですが 前のcgiで使用したスカラ変数の中身を 呼び出し先でも使いたいのですが方法はありますでしょうか。
postで送る。
いろいろありそうだな。
変数の中身を Storable でシリアライズしたのを form のパラメータとして (ry
syslogで、現在時刻から五分前までのデータを出力しようとしてます。 perlで普通に先頭行から読んでいるのですが、最終行から逆に読んだり出来ますか?
tail の結果を読め。
A B C 0 D E F 9 ....(略) G H I 2 # 区切り A B C 3 D E F 4 ...(略) G H I 7 perlで上のようなフォーマットのテキストファイルを開いて(区切りの上と下の文字列で共通の物は同じ物を表し、数字は例) 先頭の文字列が同じ物について引き算を行い(例えばA B Cなら0-3、D E Fなら9-4、G H Iなら2-7)A B Cについてから順に出力したいのですが、 何かいい方法はありませんか?
>>457 言葉のそのままの意味で逆に読むことはできない。
ファイルが余り大きくないなら全部配列に読み込んで、時刻をみながらpopしていくのが楽。
458氏のようにtailの結果をリバースしてくのもいいかも。
あるいはopenしたあと、seekでラストまで飛んで適当なオフセットで戻ってくとか。
そんなかんじかな。
cpanを検索してどうも無さそうなんだが、C/C++のヘッダファイルをparseするモジュールって 既存の物があるかな?
463 :
デフォルトの名無しさん :04/11/02 05:54:37
cpp
>ヘッダファイルをparseする どういう意味?/^#include.+?\.h>/でいいじゃん。
>>460 my %group;
open TXT, 'text.txt' or die $!;
while(<TXT>){
chomp;
my($str, $num) = /([\sA-Z]+)(\d+)/;
push @{$group{$str}}, $num;
}
close TXT;
foreach(sort keys %group){
print "$_ = ", $group{$_}->[0] - $group{$_}->[1], "\n";
}
>>467 参考になりました。ありがとうございます。
ある実行体が不定期に吐き出す文字列を Perl/Tkでリアルタイムに表示させたいと思っています。 Labelウィジェットの-textvariableを利用すればよいかと思って 以下のコードを書いてみましたが、入力した文字列は窓には表示されませんでした。 use Tk; $result_message = ""; $top = MainWindow->new(); $top->Button( -text => 'start', -command => \&input )->pack(); $top->Label ( -textvariable => \$result_message )->pack(); MainLoop(); sub input { while (1){ $result_message = <>; # print $result_message; } } 任意の標準入力をbind出来ないかとも思いましたが 僕には見つけられませんでした。 何か良い解決法はないでしょうか?
>>463 >>465-466 サンクス。「parseする」とだけでは曖昧だった。
やりたかったことは、h2xsのようにマクロと関数宣言が大量にずらずら並んだ
ヘッダファイルをスキャンし、別言語から利用するためのスケルトンを一括作成したかったのだ。
466のC::Includeで簡単にできそうなので助かった。
cgi実行後、表示されるinput textのフォームにあらかじめ値を代入することは可能でしょうか?
>>469 Tk::fileevent or Tk::IO
>>471 とりあえず引用符の扱いに気を付けてくれ
475 :
初心者 :04/11/03 02:12:27
データのを整えたい 私はperlを学んでいる途中です。 練習で以下の作業をしようとして、できなくて困っています。 perlで[1]を[2]のようにデータを整える作業をしたいと考えています。 「全角同士で挟まれたスペースの削除(例)中 央→中央」と「全角数字と並んでいる ところに,(カンマ)を挿入する(例) 篠崎11→篠崎,11」の2点の作業をしたいです。 何方か、アドバイスを下さいお願いします。 [1] 中 央1丁目591 281 310 218 2丁目602 315 287 227 2丁目522 256 266 179 大字南篠崎1130 559 571 352 本 町831 396 435 301 花 崎1丁目1459 749 710 604 [2] 中央1丁目,591,281,310,218,2丁目,602,315,287,227 2丁目,522,256,266,179,大字南篠崎,1130,559,571,352 本町,831,396,435,301,花崎1丁目,1459,749,710,604
477 :
初心者 :04/11/03 02:39:38
すいません…知らなくて。 以後、気をつけます。
下のようになる希ガス 中央,1丁目,591,281,310,218,2丁目,602,315,287,227 ,2丁目,522,256,266,179,大字南篠崎,1130,559,571,352 本町,831,396,435,301,花崎,1丁目,1459,749,710,604
あー、改行はそのまんまかぁ。 「\s」 → 「\ 」で。
481 :
初心者 :04/11/03 04:25:03
>>479 ありがとうございました。
おかげで助かりました。
ほー、正規表現って面白そうだなぁ
Perlはハッカーに向いた言語だ。 こんなところにハッカーはいない。
>>483 正しい意味でのハッカーか、それとも誤用が広まって
正しい意味になりつつあるハッカー(≒クラッカー)か。
大の大人は華麗にスルー
>>461 ありがとう。
popは使わなかったけど、配列をreserveで裏返した後、foreachに入れて、適当なところで、lastで抜けた。
処理時間が、五分の一になった。ありがとう。
if(!$in{'bakadesu'}) ↑は if($in{'bakadesu'} ne "") と同じ意味なのでしょうか?
微妙に違う 値が 0 も偽 perlでは有名な話
>>487 $in{'bakadesu'} eq ""
$in{'bakadesu'} == 0
not defined $in{'bakadesu'}
not exists $in{'bakadesu'}
は全て偽
>>489 が真となる場合に$in{'bakadesu'}は偽
みんな良く見ろ。!$in{'bakadesu'}と$in{'bakadesu'} ne ''だぞ。 微妙どころかほとんど反対じゃないかと(笑)
>>487 unless($in{'bakadesu'})なら等価
>>491 ? ne だから、逆ではないんでね?
!''は真 '' ne ''は偽 !'hoge'は偽 'hoge' ne ''は真 !'0'は真 '0' ne ''は真
おもろいな、もまえら(・∀・)ニヤニヤ
質問者より回答者の方がレベルが低いスレはここでつか?
496 :
デフォルトの名無しさん :04/11/04 12:16:21
csvファイルを読みこんで配列へ格納するときに、 1個ずつダブルコーテーションで囲んでやりたいのですが、 方法はありますか? 例えば、 csv → 001,002,003 だった場合 @aaa = ("001","002","003") という配列にしたいのです。 @w_aaaを読み込んだcsvとしたとき foreach $tmp(@w_aaa){ @aaa = split(/,/,$tmp); } とやると (1,2,3) という配列になってしまって困ってるのです。
>>496 ん?ちゃんと @aaa = ("001","002","003") になると思うが?
そのあとの @aaa の内容を処理する箇所のやりかたがまずいのでは?
>>497 実際にファイルから読ませたら大丈夫でした。すみません。
ありがとうございました。
質問です。下記のように外部パッケージ内変数を使用する場合はどうすればい いのでしょうか? myを省けば動きそうですが、strict付けたままだと怒られるし…。 main.pl |use strict; |use mylib; |print $mylib::foo.'\n"; mylib.pm |package mylib; |use strict; |my $foo="bar"; |1;
>>499 パッケージグローバルはmyじゃ無くてourじゃ無かったか?
直接いじらせないで取得関数を作るのが正解な気もするが・・・
502 :
すみません :04/11/04 18:09:09
質問です。 文字データの中に半角文字が含まれていたらエラーを 返したいのですが、半角文字を検出するにはどのような方法が あるのでしょうか? ちなみに、ActivePerl 5.8.4.810を使ってます。
503 :
デフォルトの名無しさん :04/11/04 18:25:57
>>502 情報が足り無すぎる。
エンコードは?Shift_JISかEUC-JPか、はたまたUTF-8か、
メール関係ならISO-2022-JP(JIS)もよく使われる。
半角文字とはASCIIコードにあるアルファベットや数字記号のことなのか?
半角カタカナの事なのか?いや、両方か。
話はこれらの情報がそろってからだ。
504 :
すみません :04/11/04 19:03:12
>>503 情報が少なくてすみません。
エンコードはShift_JISです。
半角文字とはアルファベットも数字記号も
半角カタカナもあらゆる半角全てです。
目的としては『全角文字以外』のものが含まれていたら
エラーとしたいのです。
505 :
デフォルトの名無しさん :04/11/04 20:14:35
>>505 ありがとうございます!解決しました!
感謝です!!!
$n = 3 ; # 繰り返す回数 $pat = 'ab' ; # 繰り返すパターン から、'ababab' を得るスマートな方法はどんなものでしょうか。
$pat x $n;
あー、x演算子なんてのがあったのかあ。 見たことあるはずだけど記憶になかった。 ありがとう。
510 :
デフォルトの名無しさん :04/11/05 20:12:09
localtimeの動作がおかしいのです。 1099202399を与えると、2004/10/31 01:59:59を返してくれるのですが、 1加えた1099202400を与えると、2004/10/31 01:00:00と、1時間戻ってしまうのです。 これって何がおかしいんでしょう? 何か有名なバグでしょうか? ちなみに、レンタルサーバーに入っているperlを使っています。 This is perl, v5.8.3 built for i386-freebsd --- ●テスト用のスクリプト #!/usr/local/bin/perl ($s,$m,$h,$dd,$mm,$yyyy) = (localtime($ARGV[0])); $yyyy+=1900; $mm++; printf( "%s -> %04d/%02d/%02d %02d:%02d:%02d\n", $ARGV[0] , $yyyy , $mm , $dd , $h , $m, $s ); --- ●テスト結果 % ./test.pl 1099202399 1099202399 -> 2004/10/31 01:59:59 % ./test.pl 1099202400 1099202400 -> 2004/10/31 01:00:00 ---
>>510 うちでは戻らないけど 10/31 14:59:59 と 15:00:00 になる。タイムゾーン?夏時間?
>>511 1時間差ってあたりが夏時間ぽいので、localtimeの戻り値の
$isdstをまず確認するのがいいんじゃないかと。
# 0 1 2 3 4 5 6 7 8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time);
真なら夏時間になってます。
文字列"_a\n__b\n__b\n___c\n__b\n_a"を "(a,(b,b,(c),b),a)"のように置換する関数fooを作りたいのですが、正規表現でつまづきました。 どうやったらいいですか? sub foo{ my $a = shift; $a =~ s{ ここの正規表現がわからない! }{ my $b = $&; $b=~s/^_//g; "(". foo($b) .")"; }gmex; #ここのオプションも自信ない }
514 :
510 :04/11/05 21:31:25
>>511 ,512
ありがとうございました。
$isdatをみてみたところ、ご推察のとおり1で夏時間になっていました。
localtimeを使わないで、gmtimeを使うことにします。
>>513 その形のプログラムでは正規表現をどういじっても","が出てこないと思うのだが(笑)
とりあえず","がないのと改行が残るのに目をつぶれば、
(?:_\w+(?:\n|$))+
でいけると思われ。
>515 thx! 何とかなりそうです。ありがとうございました。
>>496 で"は付けなくていいの?(w
@aaa = map qq|"$_"|, @aaa;
>>510-512 このやりとりで初めて「夏時間」の
具体的な部分を理解した漏れは重度のアレだ。
localtimeを使いたいところがgmtimeで済むようなレンタルサーバってなんだろう? 糞サーバー? スーパー1シャーシ+井桁よりもスーパーTZシャーシを使う方向で。
>>518 気にすんな。漏れ (
>>511 ) も当てずっぽうだった(恥)
>>519 >>510 のサーバは海外のか海外に設置してるサーバじゃないのかな?
環境変数 TZ をセットし直せば localtime もうまくいきそうな気もする。
>>517 あ、すみません、(001,002,003)といった配列になってくれればいいんですよ。
(1,2,3)となってしまうのが問題だったわけで。
でも、そうやってダブルコーテを付けることもできるのですね!
今後使えそうなテクです!ありがとうございます!
>>521 んぢゃ、強引にこうしておく(w
@aaa = map sprintf(qq|"%03d"|,$_), @aaa;
523 :
デフォルトの名無しさん :04/11/07 00:51:47
リストの例えば3番目の要素を取り出すのに ('A', 'B', 'C', 'D')[2] # 'C'を返す という簡単な記法がありますが、ハッシュみたいなリストで Key3を取り出す下のような簡単な書き方はないのでしょうか? ('Key1', 1, 'Key2', 2, 'Key3', 3, 'Key4', 4){Key3} # 3を返す ちゃんとハッシュに入れてからじゃないと駄目なんですか?
{key1 => 1, key2 => 2, key3 => 3}->{key3}
>>524 そか、リファレンスにすればよいのですね!
即レスサンクス!!
526 :
デフォルトの名無しさん :04/11/07 08:54:15
Net::FTP で、proxy(squid)の通し方ご存じの方、教えて頂けませんか?
当然マニュアルは隅から隅まで全部読んだんだよな?
>>521 "001"とせず、001とすると8進数の01として扱われるので注意。
質問です。 ppmを起動して、install *****(パッケージ名) と打っても改行されるだけでインストールしてくれないのですが。 どなたか解決策を教えてください。
エラーメッセージを読んで、それを元に質問し直すなり googleで検索にかけるなりしたらどうですか。
エラーメッセージも何も出ないんです。 googleで検索してみてもこの症状についての説明を見つけられず・・・・。 探し方が甘いでしょうか?
ppmはちゃんと起動できてるの? ppm> というプロンプトが出てる? ppm> install *** で何も言わずにppm>とプロンプトに帰ってくるのか、それとも帰ってこないのか? 帰ってこないのなら単に時間がかかっているか、それともリポジトリに接続できていないか。 プロキシの設定などを調べる。 のか か かかかか か ぁぁぁぁかかかかか か かかかかか
ppm>というプロンプトに帰ってきません。 20分ほど放置してみましたが何も起こらなかったので、 プロキシの設定などをやり直してみます。
ファイアウォールの中なのでFTPがpassiveモードじゃないとだめ、とか そういうのではないのでしょうか?ちがってたらごめんね。
535 :
526 :04/11/07 16:49:51
ftp_proxyの通し方ならマニュアルにあるのですが、2回 login をする方法は、suqidには使えないみたいなのです。
じゃあPerl入れなおしだね
tie でハッシュに関連付けた DB_File のデータを untie せずにハッシュの内容をデータファイルに反映させる方法はありましょうか?
$x->sync()
539 :
デフォルトの名無しさん :04/11/08 01:30:28
$aと$bのどちらの方が大きいかそれとも等しいかprint()するサブルーチンを書け if ($a < $b) { print "\$a < \$b\n"; } elsif ($a > $b) { print "\$a > \$b\n"; } else { print "\$a = \$b\n"; } これでいいですか
良くないと思う理由を書け
539ではないけど、perl 的にもっと楽に書ける方法あります? ということが聞きたいのではないかと思ってみる。
539のままでいいでひょ。 print "\$a ", ('=', '>', '<')[$a <=> $b], " \$b\n"; とか書くことも出来るけど、あまりやらない方が良いだろうね。
>>539 print "\$a ",('<','=','>')[($a<=>$b)+1]," \$b\n";
かぶったorz しかも-1の処理がスマート。(|||_|||)ガビーン
windowsXPでActivePerl5.8.4をいれて perl/Tkでwindowを出してみたんですがfontをsystemにしても 日本語が化けてしまいます何故でしょう?(Shift Jisで保存してます)
546 :
デフォルトの名無しさん :04/11/08 04:47:42
過去ログを読む暇がないので似た質問があったら本当にごめんなさい。 例えば 客1 口座番号 住所 電話 客2 口座番号 住所 電話 客3 口座番号 住所 電話 ・ ・ というような内容のファイルがあったとして、 それをリストのように読み込みたいのですが、 arrayを使った場合、それぞれの客の住所や電話番号 はどうやって保存すればいいのでしょうか? 学校の課題なのですが、perlは数時間しか授業でしてない のに、わからないことだらけで困ってます。ファイルを 読むなんてこの課題の中で一番最初のところなのにそこで つまずくなんてほんともう泣きそうです。 すみません。
>どうやって保存すれば 保存ってなんだ?
549 :
デフォルトの名無しさん :04/11/08 04:56:30
レスありがとうございます。 保存っていうのは言葉が間違ってたらすみません。 variableの中に入れるというのでしょうか? クラスには残念ながら連絡をとれる友達はいません。
550 :
デフォルトの名無しさん :04/11/08 04:57:17
あ、549は546です。IDでないのですね。すみません。
一人で泣いてろ
読み込んでからどうするのかは知らんけど。 #!/usr/bin/env perl my @customers = (); open F, "test.dat" or die $!; while (<F>) { chomp; my %profile = (); @profile{ qw[name id address phone] } = split / /; push(@customers, \%profile); } close F; #なんやかや foreach my $p (@customers) { print "$_\t= $p->{$_}\n" for keys %$p; print "-" x 20, "\n"; }
gunzipさん、ありがとうございます。 さっそく試してみます。とてもうれしいです!! とりあえず明日になったら教授に話をしにいきます。 ご迷惑をおかけしました。
>>539 print grep{ eval } ('$a < $b', '$a == $b', '$a > $b');
これで充分。
$str = 'white cat' ; $str =~ s/black (dog)|white (cat)|pink (pig)/$1$2$3/ ; これ、 -w 付けて実行するとマッチしなかったところが、初期化されてない値だゴルァ、と言われますが、 言われない書き方はありますか。 e で一つずつ判定、と言うのはできるだけ無しの方向で。
my $str = 'white cat';
>>555 実際初期化されてないんだからどうにもならんと思うが。
no warnings使うか、$1$2$3使わないように書き直すか、と
いったあたりだろう。
後者の例は、
$str =~ s/black (?=dog)|white (?=cat)|pink (?=pig)//;
とか。
>>557 やっぱそうか……
実用上は問題ないようだけど、たまに潔癖症になるのでテッテ的に warning つぶしに躍起になるのです。
Oct 19 10:13:55 server1 httpd: INTUNIV:ByDate:Start:0.83674100 1098148435:32618 Oct 19 10:13:55 server1 httpd: INTUNIV:ByDate:End :0.95674400 1098148435:32618 Oct 19 10:37:53 server1 httpd: INTUNIV:ByDate:Start:0.35116700 1098149873:32618 Oct 19 10:38:47 server1 httpd: INTUNIV:ByDate:End :0.45024600 1098149927:32618 ・ ・ ・ という書式で書かれているログファイルを、文字列マッチングを利用して 10/19 10:13:55 S:0.83674100 1098148435:32618 10/19 10:13:55 E:0.95674400 1098148435:32618 という表示形式にするにはどのように書けばいいでしょうか? ものすごい汚い書き方ですが、 if ($line =~ /^([A-z]*)\s([0-9]*)\s([0-9]*:[0-9]*:[0-9]*)\s.*(0\.[0-9]+)\s([0-9:]+)$/ ) { print WRITE "$mon{$1}/$2 $3 $4 $5 $6\n"; という書き方をしたのですが、Start・End の表記がうまくできません。 どなたかご教授お願いいたします。
>>559 StartとEndのところを(Start|End)で拾って、月と同様に
ハッシュ用意してひけばいいんじゃねーの?
(Start|End)で拾ったらsubstrで1文字目を切り出す方が楽そうね
Start/End以外はないことが保証されていて、例えばStopみたいのを間違って 引っ掛ける心配がないのであれば、(S|E)で拾って他のとこ捨てればそのまま 使えますな。
>>559 $line =~ /^(\w+) (\d+) (\d+:\d+:\d+).+?(S(?:tart:)|E(?:nd:))([\d\.]+) (\d+:\d+)$/
>>563 (S(?:tart:)|E(?:nd:))とやっても(?:...)の部分が消えるわけではないので、
$4はStartかEndになっちゃうから、(Start:|End:)とやるのとかわらない。
(?=...)のzero-width positive lookーaheadのつもりだったのかな?
これのときはさらにその後にtart:やend:を食うパターンを別途用意
しないとマッチしないよ。
Etart とか Snd がありえなさそうなら ([SE])(?:tart|nd\s*): とか
SEXに見える。
なるべく記述をサボるなら print "$mon{$1}/$2$3$4\n" if ($line =~ /^(.+?) (.+ )s.+(S|E).+?(:.+)/); 危険だけど。
>>555-558 この仕様 (warning 出る) ってどうなんだろ?
選択の中でグループ化を使う (そして $1, $2, ... で参照する) のは推奨できない、
っていうこと?
そりゃ使いづらくね?
皆さんのアドバイスを参考にして作った結果、 $mon{'Jan'} = '01' ; ・ ・ $mon{'Dec'} = '12' ; $se{'Start'} = 'S'; $se{'End'} = 'E'; if ($line =~ /^(\w+) (\d+) (\d+:\d+:\d+) (server1 httpd: INTUNIV:ByDate:)(Start|End):(\d+\.\d+) (\d+:\d+)$/ ) { print WRITE "$mon{$1}/$2 $3 $se{$5} $6 $7\n"; のようにしたらとりあえず目的の形式でできるようになりました。 しかし、 (server1 httpd: INTUNIV:ByDate:) の部分が自分的にスマートじゃないなぁと思いつつも、正規表現で何とかならないと思って 試行錯誤したりしたのですが、結局こんな形になってしまいました。 ログは3種類あって、server1 httpd: INTUNIV: までの部分はどのログも一緒なのですが、 ByDate の部分はログの種類によって変わるのです。 現在のままだとログの種類ごとにスクリプトを書き換えなくちゃいけませんよね…。 ともあれ、皆さんのアドバイスには感謝しております。 ありがとうございました。
外部コマンドの結果を待たずに実行する簡単な方法はありますか? 以前system関数で system("cat /etc/passwd"); # waitする system "cat /etc/passwd"; # waitしない というような記事を見たことがあるんですが(実際、上は2つともwaitしました) forkを使えばモウマンタイなんですけど(system関数もしてますし) 1行で簡単に出来るような他の方法がありましたらご教授ください。
さっきのを改良して、 $mon{'Jan'} = '01' ; ・ ・ $mon{'Dec'} = '12' ; $se{'Start'} = 'S'; $se{'End'} = 'E'; if ($line =~ /^(\w+) (\d+) (\d+:\d+:\d+) (server1 httpd: INTUNIV:)(\w+) (Start|End) (\d+\.\d+) (\d+:\d+)$/ ) { print WRITE "$mon{$1}/$2 $3 $se{$6} $7 $8\n"; とりあえずこれで落ち着きました。
>>571 system("hoge &"); じゃダメだっけ?
>>573 様
出来ました(/∇\*)
その発想が出てこなかったのがクヤシイ
ありがとうございました。
575 :
デフォルトの名無しさん :04/11/10 19:55:06
テキストベースのデータを1万レコード 持って、プログラムを組んだのですが、テキストなので キーサーチができず、CPUの使用率が50%ほどになってしまいます。 1万レコードぐらいのデータはやはり、DBでもつべきでしょうか?
>>575 Windows は知らないけど、 UNIX なら Berkeley DB (DB_File) あたりがお手軽かな。
>>568 そのサイト見ながらやったんだけど化けたんだ
漏れだけなのかな
>>568 ,578
をお!出来ました!
スミマセン読んでませんでした、感謝!
580 :
デフォルトの名無しさん :04/11/11 00:07:16
どなたか教えて下さい。 1 1 1 23 2 32 2 35 2 67 3 4 5 7 5 10 という、下に行くほど左の数字が大きくなるファイルがあるのですが、これを、 1 2 2 3 3 1 4 0 5 2 のような感じで、左の数字が1のものの行数は2行、2のものは3行、3のものは1行と いうように数えるにはどうしたらよいのでしょうか? (右の数字は関係ないです。)
581 :
デフォルトの名無しさん :04/11/11 00:07:59
どなたか教えて下さい。 1 1 1 23 2 32 2 35 2 67 3 4 5 7 5 10 という、下に行くほど左の数字が大きくなるファイルがあるのですが、これを、 1 2 2 3 3 1 4 0 5 2 のような感じで、左の数字が1のものの行数は2行、2のものは3行、3のものは1行と いうように数えるにはどうしたらよいのでしょうか? (右の数字は関係ないです。)
while (<>) { m/^(\d+)/; $cnt{$1}++; } foreach (sort keys %cnt) { print $_.' '.$cnt{$_}."\n"; } 0件が表示されない?知らん(・_・)
ハッシュのハッシュをオブジェクトにするためのコンストラクタの書き方がわかりません。 %hash=( '001' => { 'name' => 'John', 'age' => '20'}, '002' => { 'name' => 'Jane', 'age' => '20'}, ); このデータから、001という番号を指定して名前や年齢を持つオブジェクトを作りたく、 my $usr=User->new($hash{'001'}); package User; sub new{ my($hash)=@_; my $self=$hash; bless $self; return($self); } とやってみたところ、オブジェクトはできたのですが、元のデータが $hash{'001'} = bless( { (略) } , 'User' ); と書き換わってしまい、困っています。 どなたか妙案をお貸しください。
0件だしたければ、数えるところはそのままで 表示するところを use List::Util; foreach (1..max(keys %cnt)) { print $_.' '.$cnt{$_}+0."\n"; } あたりでいいんでね?
>>583 元のデータをblessしたくなければコピーするしかないと
思われ。
my $self = {%$hash};
sub new{ my($hash)=@_; my $self=$hash; bless $self; return($self); } そもそも、これおかしくね?
第一引数にはパッケージ名が入らないか? これだとリファレンスじゃないものはbessできんと怒られるんだが
>>585 うまくいきました。デリファレンスしたものがそのまま無名ハッシュに入るんですね。
ありがとうございました。
>>586 直接書いてたら間違えてました。。。
手元のを見たら、
my($class,$hash)=@_;
となってました。
590 :
デフォルトの名無しさん :04/11/11 11:59:40
>>584 ありがとうございます。
でもこれですと、Undefined subroutine &main::max called at blastcount.pl line 14, <> line 32000.
とエラーが出ました。どうすればよいのでしょうか。
エラーメッセージの意味が分からないの?
592 :
デフォルトの名無しさん :04/11/11 13:10:34
>>591 すみません。わかりません。どう変えたらいいのでしょうか?
>>590 use List::Util qw(max);
594 :
デフォルトの名無しさん :04/11/11 13:30:52
596 :
デフォルトの名無しさん :04/11/11 23:09:12
よくコードで、 $A=pop @array; $B=pop @array; $C=pop @array; みたいな処理をやってたりしますが、これを一文でやる方法はありますか? ($A,$B,$C)= ... みたいな形で。
($a, $b, $c) = splice @array, 0, 3;
ごめん。よく読んでなかった。 ($a, $b, $c) = reverse splice @array, -3, 3; かな。
($a, $b, $c) = map { pop @array } 1..3; とか。 連投して済まない。
可読性を考えるとpopが2〜3個ならむしろ小細工しない方がいい気がするが。
あえてするなら
>>599 かな。
Perler死ね
糞言語消えろ
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Perl
Rubyは最高の言語
はいはい( ´,_ゝ`)プッ
Larryはもう過去の人。
長い文字列の途中から=~のマッチング開始させるのってどうすればいいですか
@INCのパスにJcode.pmがインストールされていない状態でプログラム(/home/hoge/test.pl)直下のabcディレクトリに Jcode.pmを置きます。 -test.plの内容- @INC = ('./abc'); use Jcode; print "$_\n" foreach @INC; print -e "./abc/Jcode.pm" ? "OK\n" : "NG\n"; print "CURDIR = " . `pwd`; ------------- この状態でコンソールから実行するとエラーが発生します。エラー内容は Can't locate Jcode.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1 ....(略) といった具合です。 use Jcode;をコメントアウトした結果は ./abc OK /home/hoge です。 @INCを./abcと再定義しているのもかかわらずエラーログでは./abcを読もうとせず 標準のパスを読み込んでる事からして@INCの内容が無視されているっぽいのですが コンソールからの起動でちゃんと@INCの内容を見てくれるようにするにはどうすればいいでしょうか。 http経由からだとちゃんと@INCのパスを検索してくれます。
>>608 substr($s, どっか) =~ /ほげほげ/
すいません自己解決しました。 #!/usr/bin/perl use Jcode; BEGIN{ unshift(@INC, './abc'); } だと駄目で #!/usr/bin/perl BEGIN{ unshift(@INC, './abc'); } use Jcode; だとOKでした。 BEGINはBEGINの方に書くのですね
612 :
デフォルトの名無しさん :04/11/12 09:07:19
>>597-600 ありがとうございます。自分としてはスライスを使って上手くこの辺を
操作する方法がないかなと探してしたのですが、どうも上手くいきません。
@A=(0,1,2);
($a,$b,$c) = ($m=$#A-2, @A[($#A..$m)], $#A-=$m)[1];
すいません分りました。 範囲演算子は左の値が大きくないとダメみたいですねえ。 なんでこんな言語仕様なのかは不明です。
s/左/右/
612のコードの間違いがもう一つありました。 ($m=$#A-2, @A[($#A..$m)], $#A-=$m)[1]; これでは、カッコ内の各式が返す値をまったいらのリストに並べてしまうので、 [1]では、@Aのスライスだけを取得することはできません。 @A=(0,1,2); (($a,$b,$c)=reverse(@A[($#A-2)..$#A]), $#A-=2); これが一番現実的だろうと思います。
>>611 BEGINを先に書かないと間に合わないのは、useは
BEGIN { require Module; import Module LIST; }
と等価なので、BEGIN同士なら先に書いたほうが先に
実行されるからだな。
でもいまどきは@INC直接いじらないでuse lib使うんじゃ
ないかと。やってることはほとんど同じだけど(とマニュアル
にも書いてある)こっちの方が見やすいし。
a = 2830.53 b = 9823.32 a = 5584.66 b = 8595.54 a = 8568.63 b = 9879.92 a = 4543.45 b = 5258.26 という、aとbの数字がひたすら書かれたファイルを読み込んで、 aの値とその1行下のbの値の差を書き込んでいくにはどんな記述をすればいいでしょう? 上の値をプログラムに通した場合、実行結果を 6992.79 (2830.53 - 9823.32) 3010.88 (8595.54 - 5584.66) 1311.29 (9879.92 - 8568.63) 714.81 (5258.26 - 4543.45) という感じに出したいのですが・・。
618 :
デフォルトの名無しさん :04/11/12 16:41:09
>>617 use IO::File;
my $fh = new IO::File "data.txt";
my %h;
while(<$fh>) {
my ($k, $v) = split /\s*=\s*/;
$h{$k} = $v;
printf("%f |%f - %f|\n", abs($h{'a'}-$h{'b'}), $h{'a'}, $h{'b'})
if $k eq 'b';
}
undef $fh;
予想外のフォーマットはまったく考えてません。
while($dataA = <$fh>){ $dataB = <$fh>; } でいいんじゃねーの
620 :
デフォルトの名無しさん :04/11/12 21:20:09
package check; sub check_integer($$){ ... } とやって、 別なとこで、check::check_integer( ); とやったとき、プロトタイプは有効にならないですか? やってみたらならなかったので、途方にくれています。
あー、わかったー。 require じゃなくて use 使ってインポートしないと、 プロトタイプ有効になんないのね。 できたできた。
>>617 多少メモリはつかうが、
undef $/;
open FH, 'data.txt';
$_ = <FH>;
close FH;
print abs($1 - $2) . " ($1 - $2)\n" while (m|a \= (\d+.\d+)\nb \= (\d+.\d+)|sg);
3行バージョン。 use File::Slurp; $_ = read_file('data.txt'); print abs($1-$2) . " ($1 - $2)\n" while (/a = (.+?)\nb = (.+?)\n/sg);
>>616 さん
>BEGIN { require Module; import Module LIST; }
これ見て全て納得しました。
use はBEGINと同じようにコンパイル時に処理されるとは認識していたのですが
BEGINが一番優先度が高いと勝手に思い込んでいました。
私みたいなおっちょこちょいさんが多いからuse libが作られたのかな。
BEGINNERはBEGINをBEGINの方へ書くのではなくuse lib使えってことですね。
すいません、Perl56.dllが見つかりません。 とエラーがでます。みてみたらPerl58.dllはありましたが56はなかったです。 どなたかPerl56.dllいただけませんか。 よろしくお願いします。
もしくはダウンロードできるとこはありませんでしょうか。
それってバージョンアップに失敗したわけじゃないの? 5.8がいいならクリーンインスコしてみそ
すまねっす! ファイル名.htmもしくは.htmlの拡張子部分を消そうとして $path =~ s/(\.htm|\.html)//; とやらかしたんですがl(小文字のL)が残ってしまうです。 左側にマッチした時点で置換してしまってるだけだというのは分かるんだけど、 「じゃ、どうするべ」 という方針が立たない、、 とりあえず二行に分けて済ませたんですが、 エライ人はこれ、どうやってますか? つうかスレ違い?正規表現スレは難しすぎて、、、。
わー!分かったんでいいです。 順序変えればいいだけなのね。 スレ違いスマソ。
$path=~s/(\.html?)//;
オブジェクトのリストを保持するオブジェクトを作ろうとしています リストに新しい要素を加える関数として sub add{ my $I = shift(@_); my $add = 1; foreach my $item ( @{($I->{"list"}} ){ if( $item eq $_[0] ){ $add = 0; } } if($add){ @{($I->{"list"}} = (@{($I->{"list"}},$_[0]); } return $this; } の様な物を作りたいのですが、リファレンスの比較はeqと==のどちらですべきなのでしょうか? それともリファレンス用の比較関数がありますか? 併せて、もっとエレガントな記述方法があれば教えてくださいお願いしますm(__)m 追記 my $x = hoge->new(); $x->add(hoge->new()); みたいな使い方をしたいです
633 :
デフォルトの名無しさん :04/11/13 19:21:56
>>617 while(<>){
if(m/^a\s*=\s*(\S+)/){
$a = $1;
} elsif
(m/^b\s*=\s*(\S+)/){
$b = $1;
print $b - $a,"($b - $a)\n";
} else {
die
}
}
>>632 コレクションクラスが欲しいってことなのかな?
同じオブジェクトの重複を許すのなら普通に配列にpushすればいいと思う。
重複を許さないなら、そのオブジェクトのアドレスをキーにしてハッシュに入れる。
CPANにも似たようなものはある(Set::Bagとか)。
http://search.cpan.org/modlist/Data_and_Data_Types/Set 同一のオブジェクトかどうかの判定はアドレス同士を文字列として比較 eq。(数値比較 == でもいけるらしい)
比較用のメソッド持ってもいいし、演算子オーバロードするのもよし。
同じクラスのオブジェクトかどうかの判定には ref という関数を使う。
オブジェクトを new する時に、内部的にシリアルナンバー振っておいて それを比較してもよい。これだとついでにオブジェクトの生成順もわかる。 あとはハッシュなり配列をblessして コレクションクラスをつくるだけ(作らなくても良い)。
>>632 ごく簡単に書けばこんなかんじ。
package Bag; # 重複OK
sub new { bless [] => shift }
sub add
{
my ($self, $obj) = @_;
push @{$self}, $obj;
}
package Set; # 重複NG
sub new { bless {} => shift }
sub add
{
my ($self, $obj) = @_;
$self->{$obj} = $obj unless (exists $self->{$obj});
}
>>634-636 丁寧な有難うございますm(__)m
そういえばハッシュのキーって勝手に重複判定してくれてますね、目から鱗でした。
取り敢えずSetクラスのオブジェクトをメンバ変数に持つ奴を使います。
perlの本スレってここでよいの?
>>637 あとで気付いたけど、どうせ$objは参照渡しになるから
unless exists〜のチェックも実質いらないかもね。
ともあれハッシュは便利だよ。
あー、ハッシュのキーとしてリファレンスは使えないようです リファレンスを文字列にキャストした値が使われる模様で my %xx = (); $x=1; $y=2; print ref \$x, "\n"; print ref \$y, "\n"; $xx{\$x}=$x; $xx{\$y}=$y; foreach my $key (keys %xx){ print $key,"\n"; print ref $key, "\n"; # print $$key , "\n"; } のコメントアウトをはずすとなんか怒られます 最近のperlにはスカラー/配列/ハッシュ以外にも型の概念があるのですね 明示的にリファレンスを文字列にキャストするにはどうしたら良いんでしょう (refではアドレスの情報が落ちます)
>>640 分かっているとは思うけど、リファレンスのアドレスを「文字列」にしたものをキーとして使います。
つまり Hoge=HASH(0x80f6520)とかという「文字列」をキーとしてつかうわけで
それをデリファレンス(=元のオブジェクトに戻そうとする)しようしても無意味です。
そう言うわけで640のコメントを外すとPerlは怒るのです。
$x = {}; の場合、自動的に $xx{$x}とすれば $xx{"HASH(0x80f6460)"} と等価に(怒られずに)なります。
$x = Hoge->new のようなオブジェクトの場合は $xx{"Hoge=HASH(0x80f6460)"} と等価です。
明示的にキャスト(?)したければ $xx{"$x"} とダブルクォートすれば気分的にはいいかもね。
なお、refは上記の Hoge=..のHogeを返すだけなので、「それは同じクラスのインスタンスか?」
みたいな同族判定に使います。指定したクラスのインスタンスしかこのコレクションにはいれない、
というような処理にも使えます。
>>640 $xx{\$x}=$x;
$xx{\$y}=$y;
は、エラーも警告も出ずに動くでしょ?
package hoo; #use overload # "+" => \&add; sub new{ my $class = shift(@_); my $this = {}; foreach my $element (@_){ $this->{$element} = $element; } bless $this, $class; return $this; } sub add{ my $this = shift(@_); if( ref $_[0] eq ref $this ){ foreach my $element ($_[0]->getlist){ $this->{$element} = $element; } } return $this; } package main; my $z = hoo->new("a","b"); print "$z"; のコメント外すと物凄い勢いで怒られます
use overload "+" => \&add, "\"\"" => \&string; sub string{ my $this = shift(@_); return "$this"; } とかすると再起呼び出しを始める模様です くそー、ワケワカンナイぜー
あぁ、確かに。ごめん。 sub string { my $this = shift; return overload::StrVal($this); } でどうでしょうか?
ををを!、感謝です!!!
いえいえ。 関係ないけど、$this->{$element} = $element; の部分は、その使い方であれば $this->{$element}++ とでもしておくと、出現回数も数えられて 更にPerl的でプラスアルファです(?)。
648 :
デフォルトの名無しさん :04/11/14 18:26:17
ちょっと長くなるかもしれませんがお願いします。 今、 a, b, c a, c, d a, e, f b, a, a b, c, d b, d, e c, a, b c, b, d ... こういう3つの文字が並んだデータがありまして、 それぞれ a = b + c, a = c + d .... といった関係が成り立っています。 このとき、aを入力し、b, dと入力すると、 a = b + c b = a + a c = b + d a = c + d c = b + d という出力が得られる、という感じにしたいのです。 要は、求める文字を、用意できる文字から、ツリー状に探していきたいということです。 分かりやすく言うと、ドラクエモンスターズの配合を検索する感じです。 いまはローカルで実行して試しているんですが、中々うまくいきません。よろしくお願いします
>>648 すいません、スレを間違えた感じがします
650 :
デフォルトの名無しさん :04/11/14 18:27:41
しぱーん厨襲来の予感
化学式の合成のツールかなんか作るのかな?
ドラクエモンスターズの配合を検索する感じのツールを作るんじゃないの?
>>651 インテリ風に言うとそういう感じです。すいません本当はCGIの方に書こうと思ったんですが・・・
どちらにしてもうっとおしそうなので絶縁中の先輩に聞く事にします。
でももし、ミラクルなやり方があったらぜひ教えてください。
>>652 端的に言うとそういうことなんですが、いわばこういったゲームを発端としてでも
実りのある発見が出来たらなと、いうわけなんです。化学にも応用できます。
つーか、問題定義はこれで十分なのか?
>>648 b = a + a が結果として出てくるあたり、
いまいち結合法則というか、ルールがよくわからんのだが…
>>656 同感。
a = b + c
b = a + a
a = b + c
…で無限再帰検索ループに陥る悪寒
つーか一段階しか辿らないんだろ。 配合ゲームっぽい事書いてるんだからそれくらい分かれよ。
知るか
一段階かどうかは知らないが、 同じ結果の配合が何度も出てきても仕方ないから、 検出して止めるんじゃないだろうか?
こんな感じで突っ込んでって使うだけじゃないの? $ev{b}{c} = 'a'; $ev{c}{d} = 'a';
b = a + a は思いっきり間違いでした。 a = c + d c = b + d だけでしたね。 ルールは 「a〜zのアルファベットがあって、それぞれがa〜zのうち2つの要素から成り立っている また、その2つの要素の組み合わせは一つではない。2つの要素が同じ場合もある。 その全組み合わせのリストがあらかじめ用意されている。 今、n個の異なるアルファベットがあり、このn個を用いて、ある一つのアルファベットを作りたい。 用意されたn個のアルファベットで構成可能な組み合わせを全て求める。 また、要素を組み合わせる回数は任意だが、多すぎると辛いので10回程度までにする。」 こういう感じだと思います。 用意できるモンスターN種類(N個のアルファベット)から、何回か配合を繰り返して 目標とするモンスターX を作るツリーを作る、という感じです。 @result = (1, a, c, d, 2, c, b, d) という平たい配列に入れようとしたんですが、どんどん検索を進めていくと、 (1, a, c, d, 2, c, b, d, 3, b, j, k, 3, d, l, m, 2, d, a, f, 3, a, c, d, 3, f, k, j ) などと、何がなんやらわからなくなってしまうのです。 ツリーの深さとしては、5階層くらいまでとめておこうかと思います。 途中、利用可能なデータが表れた場合は、そこは葉になるので、そこまで膨大には ならない予定です。
このとき、aを入力し、b, dと入力すると、 a = b + c b = a + a c = b + d a = c + d c = b + d という出力が得られる、という感じにしたいのです。 ----------------------------------------- ↑そもそもこれが意味フメー、入力が2回に分かれてるから a = b + d を探したいのかと予想しつつ(さすがにんな単純な話じゃあないと思うが 出力を見たらどうやら違うみたいだし、マジワカンネ
sendmail.cf のルールに良く似てる
む、遅れた
なんかどうでもよさげ。
prologでも使えば?
prolog重い
>>668 上の用途程度ならいまどきのCPUで実行すれば気にならない速度だと思われ
package Node; sub new($) { my $pkg = shift; bless { l => undef, r => undef, }, $pkg; } 1; $a = new Node(); $a->{l} = …
sub getLeaves($) { $self = shift; my @ret; $isleaf = 1; if(defined($self->{l}) { push(@ret, $self->{l}->getLeaves()); $isleaf = 0; } if(defined($self->{r}) { push(@ret, $self->{r}->getLeaves()); $isleaf = 0; } if($isleaf) { push(@ret, $self); } return @ret; }
それと今回のケースだとNodeにNameがあった方がいいな。
二分木のデータ構造が知りたかっただけの話なのか?
そういうのが欲しいならcpanにもっと賢いのが落ちてるんじゃないのか?
レス有難うございます。頭がこんがらがってきました。 ゆっくり読ませていただきます。
*パターンのフォーマット [ [アルファベット,要素,要素]...] # パターンのハッシュ化 my %pattern = (); for(@pattern) { push(@{$pattern{$_->[0]}}, $_->[1], $_->[2]); } # ツリー作成 my $root = makeTree('a', 10); # a についての深さ10のツリーを生成 sub makeTree { my ($alpha, $depth) = @_; my $node = new Node($alpha); for(@{$pattern{$alpha}}) { $node->{_left} = makeTree($_->[0], $depth - 1); $node->{_right} = makeTree($_->[1], $depth - 1); } return $node; } package Node; # 簡単に作れると思うので、割合します こんか感じでしょうか?試してないので分からないですが。。。 実装するなら、検索にハッシュは使わないほうがいいですね
あ、上のコード、$depth をチェックするの忘れてました 注意して下さい
680 :
デフォルトの名無しさん :04/11/14 21:50:37
さらしあげ
sub makeTree { my ($alpha, $depth) = @_; my $node = new Node($alpha); if(0 < $depth) { for(@{$pattern{$alpha}}) { push(@{$node->{left}, makeTree($_->[0], $depth - 1)); push(@{$node->{right}, makeTree($_->[1], $depth - 1)); } } return $node; } 早くお風呂入りたかったのでちゃんと考えないで投稿してました、すみません
すいません、まだ出来ていないのですが、今実際のデータでツリーの数がどのくらいか 計算してみた所、4階層目ですでに1000を超えるような状況になってしまい、 1つの検索を終える為には数百万行ほど、組み合わせリストと照らしあわさなければ ならないようです。これでは実用が難しそうなので、ちょっと考えてみます。 あとお腹が痛いのでそろそろ寝ます。教えてくださった方、本当に有難うございます。
683 :
デフォルトの名無しさん :04/11/15 12:39:31
二つのファイルを扱うときの質問です。 A B C D E F G と一つ目のファイルがあって、 A B D E ともう一つのファイルがあったときに、 上のファイルの文字の中で、下のファイルにも 存在するものを出力する。 (この場合は) A B D E のように出力できるようにするにはどんなプログラムを書けばいいのでしょうか?
684 :
683 :04/11/15 12:45:01
すみません。質問が変でした。さっきの質問の訂正です。 二つのファイルを扱うときの質問です。 A 1 B 3 C 1 D 3 E 4 F 6 G 1 と一つ目のファイルがあって、 A B D E ともう一つのファイルがあったときに、 上のファイルのアルファベットの中で、下のファイルにも同じアルファベ ットが存在するものの行の内容をすべて出力する。 (この場合は) A 1 B 3 D 3 E 4 のように出力できるようにするにはどんなプログラムを書けばいいのでしょうか?
685 :
683 :04/11/15 12:55:09
また、毎回わからなくて困ることがあるので、これも教えていただ けるとうれしいです。 さっきの(699)は言ってみれば二つ目のファイルを参照して、一つ目のファイル にもあるものを出力するものですが、 もう一つ聞きたいのが、二つのファイルに共通のものを出力するというものです。 例えば一つ目のファイルが 1 2 4 で、二つ目のファイルが、 2 3 6 4 だったら 2 4 と出力できるようなプログラムはどうやって書いたらよいのでしょうか。
686 :
デフォルトの名無しさん :04/11/15 13:20:13
open(FILE, "$baka.txt") or die "$!\n";
@baka=<FILE>;
close FILE;
while(<>){
if (grep(/^$_ /, @baka) { #
>>684 # if (grep(/^$_$/, @baka) { #
>>685 print $_;
}
}
もう、この手の宿題には答えるのやめようぜ
systemでcomm呼ぶのが楽そうだと思った
689 :
683 :04/11/15 21:01:54
>686 ありがとうございました。でも、これですと、 if (grep(/^$_ /, @baka)){ のところのif文が働いてくれず、 A 1 B 3 C 1 D 3 E 4 F 6 G 1 と出力されます。どうしたらよいのでしょうか?
じゃ、それに応じて正規表現変えたらーぁ。 /^$_/
691 :
683 :04/11/15 21:17:54
if(grep(/^$_ /, @baka)) というのは、 A 1 B 3 C 1 D 3 E 4 F 6 G 1 の先頭が、@bakaの中身と同じだったらということですよね。このままで いい気がするのですが、どう変えたらよろしいのでしょうか。
692 :
683 :04/11/15 21:59:21
たびたびすみません。 プログラムの意味を間違えて理解していました。 if(grep(/^$_ /, @baka)) というのは、 A 1 B 3 C 1 D 3 E 4 F 6 G 1 という配列@bakaに対して、$_の先頭と同じだったらということですよね。 こう考えて実行しても、まだ、 A B D E と出力されてしまい、数字がでません。どこを直したらいいのでしょうか?
>>692 $ptn =join(/\n/,<>);# 対象英字のファイルを入力
while ( <> ){ # 数字付きのデータを入力
print if( /^[$ptn]/ );
}
>>693 さんのでいいと思いますが、
>>686 のが
>>692 のようになってしまうわけは、
grep EXPR, LIST
として実行した場合、grep は LIST の値を一つづつ $_ に代入して
EXPR を評価しているからのようです。したがって、変数に代入して
からやればいいわけです。
open(FILE, "$baka.txt") or die "$!\n";
@baka=<FILE>;
close FILE;
while(<>){
$exp = $_;
if (@match = grep(/^$exp /, @baka) { #
>>684 # if (@match = grep(/^$exp$/, @baka) { #
>>685 print $match;
}
}
申し訳ない。やってみたら、タイプミスが2つありますた。
open(FILE, "baka.txt") or die "$!\n";
@baka=<FILE>;
close FILE;
while(<>){
($exp = $_) =~ s/\r?\n//; # それとこれも必要。windowsの場合。
if (@match = grep(/^$exp /, @baka)) { #
>>684 # if (@match = grep(/^$exp$/, @baka)) { #
>>685 print @match;
}
}
696 :
683 :04/11/15 23:05:23
>>693 ありがとうございました!
しかもとても簡潔でわかりやすいプログラムで感動しました!
697 :
683 :04/11/15 23:17:22
>>695 わざわざ詳しく調べていただいてすみませんでした。
ありがとうございます。
私もgrepについて調べて、自分なりに直してみたのですが、
($exp = $_) =~ s/\r?\n//;の部分が足りなかったみたいです。
これはchompとはちがうのでしょうか?
また、\r?はどういう意味ですか?
調べたら、\rはリターンで、?は前にある文字の0,1回の表現とでてきたのですが...
windows(MS-DOS)の改行は、\r\nでしょ。 unixは、\n、Macは\r。だから、winodwsとunixのに対応してるわけ。 chompは、windowsの場合はだめなんすね。2個文字があるから。
>>698 ただし、テキストモードで開いてる時点で
文字コードの違いは吸収されているわけだから、
\r?は保険同様ですな・・・時々改行コードの変換に失敗したのか
\r\r\nになってるやつがあるから反対はしないけど。
この場合 s/[\r\n]//g; のほうがいいんじゃないかとも思う。
>>698 えーっと、ファイルからの入力ならテキストモードで読めば
勝手に\nになってるよ。
>>698 ,
>>699 環境にもよるじゃない。漏れは、
cygwin+perl, v5.8.5 built for cygwin-thread-multi-64int
だけん、shift-jisのファイル読み込むと、s/\r\n//;しないと
うまくいかんです。
>>701 そういう特殊な環境を基準に初心者に話を進めるのは如何なものかと子一時間(ry
ちなみにクロスプラットフォームで開発することが多い自分はbinmodeしておいて、
s/\r+\n/\n/g; s/\r/\n/g;やs/[\r\n]+$//;にするのが基本になってる。
中途半端に処理するよりはこういう風にやったほうがいいのでは?
Perl6ってもう出ました?
まずググることくらいおぼえろや.ちなみに出てねえよ.
ある処理の反応が悪いので、forkして処理させたところ、 perl in free(): warning: modified (chunk-) pointer というメッセージが出るようになりました。 これはプログラムがヒープを破壊した、という意味なんでしょうか?
5.2 5.3 6.2 10.4 0.2 5.6 というデータが書かれたファイルを読み込んで、偶数行の数値とその上の行(奇数行)の数値の 差を求める処理はどうすればいいでしょうか? [実行結果] 0.1 4.2 5.4 という出力を得たいのです。
>>708 の続き
print "読み込むファイル名を入力してください\n";
chomp (my $file_read = <STDIN>);
open READ, "<$file_read" or die $!;
print "\n書き込み先のファイルを指定してください\n";
chomp (my $file_write = <STDIN>);
open WRITE, ">>$file_write";
while($line = <READ>)
{
???? (ここで処理を行いたいのです)
}
過去ログ見たところ、
>>617 の質問と似てますね…。
abs($line - <DATA>)
<READ>か
仕事でPerlを使うことになったんだが、Perlっていまだに日本語まともに使えないのね。 Unixで動くんだが、デフォルトのコードセットがSJISで、改行コードがLF。しかもスクリプトは SJISで書けだと。
>>712 お前さんは、perlで日本語もまともに使えないのか?
SJISで書けつーのがようわからんが。
そんな厨には、jperlかperl5.8をお勧めする。 perl5.8は、Encode.pm組み込めば、jperl相当のことができる。
>>706 それも怪しいなあ、どの道中間コードにするときに展開されるから速さも変らんぞ
>>714 「まともに」は語弊があったかな。SJISだと「機」とか「表」の問題ね。
これがいやでRubyに逃避してたんだが、いちいちEUCに変換するのめんどいのよ。
イヤ、別に普通に使えるけど?>「機」とか「表」
>>718 できね。
use encoding "shift-jis";
while(<DATA>) {
print if /機/;
print if /表/;
}
_END_
機会
表現
まあSJISで書けと限定されるような仕事は辞退するべきだろうな
ゴメソ。
>>719 はでけた。__END__だた。
ただ、別ファイルから読み込むとだめなんですが、どうしたらよいでつか?
>>721 use encoding 'shift-jis'だけだと、プログラム自体と
STDIN/STDOUTはshift-jisになるが、自分で開いたファイル
まで自動的にshift-jisだと思ってくれるわけではない。
明示的にopenするときに指定してやるか、use openで
デフォルトを変えておけばok。
>>722 ありがとん。
use encoding "shiftjis";
use open ':encoding(shift-jis)';
で行けますた。shiftjisでもshift-jisでもいいんですねぇ。
""でも''でもいい。イイー
shiftjisでもshift-jisでもいいが、習慣としてはshift_jisにしとけ。 他の方法・他の言語を使うときにはまらないようにな。
725 :
デフォルトの名無しさん :04/11/16 14:44:31
つい数ヶ月前からperlを学んでいる初心者です。 先ほど、perlベースのプログラムを実行したところエラーが表示されたので 関連した項目を検索していたら下記の文献を見つけたのですが、環境変数の 設定とかを理解できていないので動かない状態です。マイコンピュータ→プロパティ→詳細→環境変数→××のユーザ環境変数→ TMP(編集)。。このあたりをいじればと思っているのですが。。 どなたか教えて頂ければ幸いです。因みにOSはWin2000です。 dfa.pl 内部で起動している dfa が テンポラリフォルダへアクセスできないようです。 環境変数 TMP で適当な書き込み可能なディレクトリを指定してください。
726 :
デフォルトの名無しさん :04/11/16 15:29:54
ActivePerl 5.8 と Windows で Perl 環境を作っています。 SSL 接続に対応したいので検索したところ、Net::SSLeay という モジュールを入れればよいとのことだったのですが、ActivePerl 5.8 は 非対応でした。 そこで、Crypt::SSLeay というのがあることを知り、ソースからビルドを 試みたのですが、うまくいきません。 .ppm パッケージからもインストールできるようですが、ネット接続の 関係上、ローカルにバイナリのパッケージ一式があり、そこから ネット接続ナシでインストールできるのがベストです。 何かご存知の方、いらっしゃいませんでしょうか。
>>725 TMP="c:\TMP" # 空いてる既にあるディレクトリ
>>726 perllibに置くだけでいいんちゃう。
>>726 > ActivePerl 5.8 と Windows で Perl 環境を作っています。
> SSL 接続に対応したいので検索したところ、Net::SSLeay という
> モジュールを入れればよいとのことだったのですが、ActivePerl 5.8 は
> 非対応でした。
> そこで、Crypt::SSLeay というのがあることを知り、ソースからビルドを
> 試みたのですが、うまくいきません。
そいつは残念だったね、おれはうまくいったよ。
> .ppm パッケージからもインストールできるようですが、ネット接続の
> 関係上、ローカルにバイナリのパッケージ一式があり、そこから
> ネット接続ナシでインストールできるのがベストです。
> 何かご存知の方、いらっしゃいませんでしょうか。
ppm パッケージからもインストールできるようですが
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
そこまで分かってるなら、そこからパッケージを盗って来ればいいじゃん。
自分のとこでネットに関係なく閉じたいなら、てめぇのとこでコンパイルするこった
10回や100回失敗したくらいで見ず知らずの他人様に泣きつくなってこった
>>729 コメントする相手を間違えてるんじゃないの?
Perl 5.8.4でSJISにない文字(ハートマークとか)を名前に含むファイルを 開くにはどうしたらいいのでしょうか? ${^WIDE_SYSTEM_CALLS}は廃止されてしまったようです。
732 :
726 :04/11/16 17:39:49
733 :
デフォルトの名無しさん :04/11/16 20:32:49
アクロバットなコードを書いて! ただ奇抜なだけのもいいけど、これは凄いと唸らせるようなものも歓迎!
Perl はつまらん
735 :
デフォルトの名無しさん :04/11/16 22:47:21
>>726 別途OpenSSLとかが必要になるはずですけど
そっちのほうはOKなのでしょうか?
ファイル処理で、ファイルハンドルから読み込んだ行数を表す変数で『$.』がありますよね。 これを利用してファイルの〜行目の数値から〜行目の数値を足す、というようなことはできますか? 例えば、 4 5 91 84 というファイルに対して、2行目の数値(5)と4行目の数値(84)を足したい、と思ったとき、 あくまでも例えとしての表記で、 $a は $.=2の行の数値; $b は $.=4の行の数値; $answer = $a + $b; というようなニュアンスのことをしたいのですが。
>>707 >perl in free(): warning: modified (chunk-) pointer
"in free(): warning: modified (chunk-) pointer" でググると分かると思うけど
rubyやらphythonやらdhcpやらbindやらcvs他他でもでるメッセージのようなので
glibcかなんかのバグじゃないのかな? あるいはメモリがイカレてるとか。
739 :
デフォルトの名無しさん :04/11/17 01:07:55
モジュールが使いこなせたらと思っているのですが、 どのモジュールがどんな使い方ができるのか、を全体的に知る方法はないでしょうか。 何かをするときにわざわざ調べるんじゃなくて、知っておきたいのですが。
>>737 ・予めすべての行のデータを格納しておく
・予めすべての行のファイルポインタを格納しておく
・特定行の数値を取り出すサブルーチンを書く
どれでもいいよ
743 :
デフォルトの名無しさん :04/11/17 01:23:23
日本語がいいんですがどこかありませんか。
>>737 おれ初心者だけどこんなんダメかな?
#! /usr/bin/perl -w
use strict;
my ($aa, $bb, $sum);
while(<>){
if($. == 2){
$aa = $_;
}
if($. == 4){
$bb = $_;
}
}
$sum = $aa + $bb;
print "$sum\n";
746 :
デフォルトの名無しさん :04/11/17 02:14:36
だれか助けて〜orz 沢山あるJPGデータをWebで一気に表示するというスクリプトをDLしてきたのだけど 表示されないの〜っ .plをダブルクリックするとHTMLファイルが作成されて、同デレクトリ内のを表示する、はず HTMLができるとこまではいけてます。 人さまからコピッてきたスクリプトをここでさらしてよいものかわかんない
>>741 ありがとうございます。
@の用に配列に全行の数値を入れて配列番号を指定することで実現できました。
>>745 そんなやり方もあるんですね。
そちらでもやってみようと思います。
ありがとうございます。
>>746 晒せないならここに来た意味が無いと思うが?
というか、自分で(作る|改造する)ので無ければ、
スレ違いどころか板違いな気もするが
>>746 Webで表示なら板違い。
WebProg板へ
解決しました! コピッた時に欠行してただけみたいですorz webで表示する部分ではなくて、数あるjegファイルを表示するのに 「デレクトリからリストを抜き出す」(かかれてた#)の指示が違ってるのかなと 思ったですよ おじゃましました
Expect.pmについての質問はここでしていいですか?
>>751 とりあえず、ここに質問書け。
誘導は、それからだ。
あ、じゃあちょっと待ってください! いま急いで仕上げますんで! やった!
#!/usr/bin/perl use Expect; @host = ("www.mona.com", "www.giko.com"); $user = "onigiri"; $pass = "neko"; $mail = "2ch\@test.com"; for (@host) { chomp; $host = $_; $exp = new Expect; $exp->spawn("ssh $user\@$host\n"); $exp->expect(300, [qr/\(yes\/no\)/ => sub { $self= shift; $self->send("yes\n"); exp_continue }], [qr/password:/i => sub { $self = shift; $self->send("$pass\n"); exp_continue }], '$' );
<続き> #メール送信 $exp->send("mail $mail\n"); $exp->expect(1, [ qr/subject:/i => sub { $self = shift; $self->send("test\n$host\n.\n"); exp_continue; } ], [ qr// => sub { $self = shift; $self->send("$host\n.\n"); exp_continue; } ], [ qr/cc:/i => sub { $self = shift; $self->send("\n"); exp_continue; } ], '$ ' ); #ここまで $exp->send("exit\n"); $exp->expect(300,'$'); }
一投稿では投稿しきれないので二つに分けました。 複数のマシンにSSHでログインし、メールを送信するスクリプトです。 以上のようなスクリプトだとメールを送信してくれるのは最初のwww.mona.comだけで、 しかも画面上は、一つめのサーバでメールを送信してexitせず、留まってしまってしまっているようです。 「メール送信」から「ここまで」を削ると両方のサーバにログインしてくれるのですが・・・ 何が悪いのでしょう。
multipart/form-dataなデータをファイルの部分とそうで無い部分を 分けて処理したいのですがいい方法は無いでしょうか? &file_igai_encode(\%form); exit if $frm{flag}; while (read STDIN, $buffer, 4096) {*ファイル処理} みたいにフォームの要素の値によってファイル処理を行うか否かをしたいと思っております。 STDINをseek出来れば解決なのですがそれは出来ないようです。 ですのでSTDINをreadlineで「filename="」が出現するまで回して出現したら それまで読み込んだデータから判別し、OKだったらファイル処理を行う というようなコードを作ったのですが、例えばSTDINにflagというレコードより 前に「filename="」が出現してしまったらどうしようって事に気づいてしまいました。 何度も検証した結果、STDINに入る順序は一定であるがnameのアルファベット、 サイズ順でもないし法則性が見出せませんでした。 そこで大変不躾な質問だとは存じておりますが ・multipart/form-dataのレコード順序の法則性 (ブラウザ依存っぽい?) ・こういった処理のベターな方法 の二点をご教授頂ければ焼き肉食べに行きます。
ふと頭を冷やしてみると <form action="hoge.cgi?flag=1" method="POST" enctype="multipart/form-data"> というように$ENV{QUERY_STRING}を使うとか$ENV{PATH_INFO}を使うという手もありますね。
と思ったけどflagの値が固定かjavascript使わないと意味無いやorz
ものすごく読む気がしない。
>>757 なんかわからんけど、CGIモジュール使って
あとはオマカセでいいんでねーの? 勉強か
宿題でどうしても自分でスクラッチから書く
のが条件ならしょうがないが。
>>754 >$exp->spawn("ssh $user\@$host\n");
expect使ったことないからわかんないけど
同じ$expで複数回spawnしても、そのインスタンスを何かの変数で受けとかないと
最後にspawnしたコマンドへのメッセージ送信になるんじゃないの?
$exp[n] = new Expect; を接続の数だけやった方がいいんじゃないかな。効率悪いのかもしれんが。
間違ってたらスマン。
なんか new Expect は $obj->spawn(...)と同じ意味らしいね。 だから接続を保存するのは spawnした時点でいいかも。
>>762 >>763 ありがとうございます!
えーっと?
ということは、new Expectは最初に$exp = new Expecとして一回だけ宣言するだけでよく、
あとは$exp[n] = spawn(...)を必要な数だけ作っておいて
それを後で個別に$exp[n]->expect(...)以下の文だけをつなげていくということですか?
今はちょっと試すことが出来ないので、とりあえず確認だけ。
>>756 mona.com, giko.com, test.com の管理者にはひとこと入れたんだろうな?
# 予約ドメインの example.com, example.co.jp, example.jp, ... を使えと何度(ry
>757 $ENV{'CONTENT_TYPE'}
multipart/form-data なんて思いっきりアプロダじゃん テキトーに拾ってきて読んでみれば
一度全部STDINを読み込んでから処理すればいいのですがメモリの消費を抑えたいのです。 また、ストリームなのでseekで移動は出来ません。 非filename属性のデータは$FORM{***}につっこみfilename属性のデータは取りあえずどこかのディレクトリ に書き込んでおくという方法もありますが非filename属性のデータ部分で書き込むファイルのディレクトリ を判断&setuidするプログラムなのでファイル作成時には既にsetuidされている状態が望ましいのです。 後でchownすればいいのですが処理的に気持ち悪いしスマートな方法は無いかなと思いまして。 該当しそうなテキトーなスクリプトを参考に見てみた感じでは imgboard.cgi→STDIN全部取得型 CGI.pm→テンポラリディレクトリに書き込み のような感じで自分の求めている処理ではありませんでした。 処理的に困難であるかとは思ったのですがこの広い世の中誰か実現している人もいるかなと思って投稿した次第です。
>>768 そういうストリーミングファイル受信に対応しているPerl製CGIを読んだことがあったな・・・
ウェブ管理ツールか何かだった気がするけど・・・
ちょっとハードディスクの中引っ掻き回してくる
>>768 テンポラリに置いといてあとでchown/chmod/renameで別に
構わんと思うのだが、何が気持ち悪いのだろうか。その
感覚を何とかした方が、無駄な努力をしなくて済みそうな
気がする(笑)
>>764 >それを後で個別に$exp[n]->expect(...)以下の文だけをつなげていくということですか?
たぶん。試してないけど。。
同一のexpectする内容を何回も書くの嫌だったら、書く場所一つにして同じリファレンス渡してもいいし。
両サイトの反応比較して動作を変えたいとかだと、一工夫必要かもしれないけれどね。
あと$expと@exp(= $exp[n])は違う変数としてレスに書いたから注意してください。
>>768 MIME::* 系のモジュールをuseするんじゃだめなのかなぁ? (MIME::Decodeとか)
少なくともMultiPartには対応しているよ。なんかよくわからないけどね。
>>751 =
>>753 =
>>754 =
>>755 =
>>756 です。
帰宅して早速スクリプトを作ってみました。
結論からいうとうまくいきませんでした。
今まで教えて貰ったことをスクリプトにすると下のようになると思うのですが・・・。
このスクリプトでもやはり二つめのサーバには行かず
>>754-
>>755 に投稿したものと同様、一つめのサーバでメールを出してそこで
止まってしまい、「メール送信」から「ここまで」を切り取ると、二つめのサーバ
までログインしてくれて、正常に終了してくれます。
実は$exp=Expectの直下の8行目のfor文で、教えられたことを忠実に処理させようと、
++$iで加算したものを$exp[$i]->spawn(...)としようとすると、
can't call method "spawn" on undefined value...というようなエラー文が
出て終了してしまうので、
苦肉の策として上のようなスクリプトにしました。
何か良い手だてはありませんでしょうか?
#!/usr/bin/perl use Expect; @host = ("www.example.com", "www.example.co.jp"); $user = "mona"; $pass = "giko"; $mail = "test\@example.ne.jp"; $exp = Expect; for (@host) { push (@exp, $exp->spawn("ssh $user\@$_\n")); } for (@exp) { $_->expect(300, [qr/\(yes\/no\)/ => sub { $self= shift; $self->send("yes\n"); exp_continue }], [qr/password:/i => sub { $self = shift; $self->send("$pass\n"); exp_continue }], '$'); ######メール送信###### $_->send("mail $mail\n"); $_->expect(300, [ qr/subject:/i => sub { $self = shift; $self->send("TEST\ntest\n.\n"); exp_continue; } ], [ qr// => sub { $self = shift; $self->send("test\n.\n"); exp_continue; } ], [ qr/cc:/i => sub { $self = shift; $self->send("\n"); exp_continue; } ], '$ '); ######ここまで###### $_->send("exit\n"); $_->expect(300,'$'); $_->close(); }
Ruby以外の言語は糞
779 :
デフォルトの名無しさん :04/11/18 14:40:17
質問です。 $C/($A+$B)*1000 という計算式の文字列があるとして、これを実際に 計算させて値を得るにはどうしたらいいでしょか? 関数などがあるのでしょうか? それとも自力で作るしかないですか?
eval
>780 ありがとうございます。できました。
>>769 もし見つかりましたら是非名前だけでもお教え下さいませ
>>770 確かにそうなんです。時々、どうせ使わないレシートをその場で捨てられない自分が嫌になります。
ですがファイルの作成を一時でも別のユーザーに作成してchown、renameでは
unixの各種制約を目的のユーザーに課すことが出来ないんですよね。例えばquotaとか。
>>772 今回はMIME系では解決出来なさそうです。情報ありがとうございます。
代替手段もいっぱいあるしおしっこをすると何故ブルブル震えるんだろう程度の
探求心からの質問でしたので今回はタンスの引き出しにしまっておくことにします。ありがとうございました。
>>738 サンクス。色々やってたらOS毎落ちたりするようなので、
メモリかもしれない。
>>784 誠にサンクス!!
日曜にでも試してみます
質問いいですか。 Linux man pagesの英語版日本語版のファイルがあって、 groff方式だから行頭に.SHとなっているのが見出しなので、 NAME ... 名前 ... SYNOPSIS ... 書式 ... みたいなかんじで原文、日本語訳交互に表示させるスクリプトを でっちあげていたんですが、はまってしまいました。もう朝だし、、、。 よかったらダメなところを指摘してください。
#!/usr/bin/perl $count = 0; $flag = 0; $jflag = 0; open(IN,"jman2/acct.2") ||die; @jline = <IN>; close(IN); open(IN,"man2/acct.2") ||die; while($line = <IN>) { if(($line =~ /^\.SH/) && ($flag == 0)) {$flag = 1;} elsif(($line =~ /^\.SH/) && ($flag == 1)) {Jline();} if($flag == 1) {print $line;} } close(IN); exit(0); sub Jline { for(;;) { if(($jline[$count] =~ /^\.SH/) && ($jflag == 0)) {$jflag = 1;} elsif(($jline[$count] =~ /^\.SH/) && ($jflag == 1)) {last;} if($jflag == 1) {print $jline[$count];} $count++; } }
超初心者な質問です。 telnetモジュールを使用して、リモートコンピュータに接続してから、 ・screen起動 ・外部プログラム起動 ・CTRL-A d で[detached] という操作をperlで実行したいのです。 色々サイトを回って調べて、telnet接続まではできたのですが、 上記手順の「CTRL-A d で[detached]」で行き詰っております。 CTRL-Aという操作をperlのtelnetモジュールで行うには、 どういう記述をすればよいのでしょうか? (将来的に、CGIとしてWeb公開したいので板違いかもしれません。)
板違いだったようです。。 申し訳ありませんでした。
このたび初めてperlを使うのですが、コマンドプロンプトを起動し、ppmと打つと C:\Documents and Settings\自分の名前>ppm Fatal error: couldn't find or create config file targets.cfg: Cannot chdir back to C:/Documents and Settings/自分の名前: No such file or directory at C:/Perl/lib/ FindBin.pm line 182 BEGIN failed--compilation aborted at C:/Perl/lib/FindBin.pm line 188. Compilation failed in require at C:/Perl/site/lib/PPM/Config.pm line 444. BEGIN failed--compilation aborted at C:/Perl/site/lib/PPM/UI.pm line 1049. Compilation failed in require at C:\Perl\bin\ppm3-bin line 16. このような文章がでてきてしまい、インストールすることができませんでした。自分がインストールしようとしているのは install time-hires install io-zlib install win32-api install http-lite install getopt-long なのですが・・・ 自分なりにサイトを見てまわりましたが、確信にたどり着けず困り果てています。 どなたかご教授をお願いします。 PCの環境 OS: Windows XP Home Edition Perl: Active Perl 5.8.3.809
>>790 「自分の名前」が「加能圭介」だったりして(w
名前が曾我十郎だったりして(w
793 :
デフォルトの名無しさん :04/11/19 11:33:45
XMLモジュールをCPANでインストールしようとしたのですが、 最後に Failed Test Status Wstat Total Fail Failed List of Failed -------------------------------------------------------------------------------- t/01basic.t 2 512 2 2 100.00% 1-2 t/02load_xml.t 2 512 1 1 100.00% 1 t/03simple_compare.t 2 512 2 2 100.00% 1-2 t/04namespaces.t 2 512 4 4 100.00% 1-4 t/05simple_handler.t 2 512 1 1 100.00% 1 t/06pass_to_handler.t 2 512 1 1 100.00% 1 t/07pitest.t 2 512 3 3 100.00% 1-3 Failed 7/7 test scripts, 0.00% okay. 14/14 subtests failed, 0.00% okay. make: *** [test_dynamic] エラー 2 /usr/bin/make test -- NOT OK Running make install make test had returned bad status, won't install without force と出てエラーが出てしまいます。 XML::XPathを使いたいのですが、どうしたらよいのかさっぱりです。 アドバイスをお願いします。 OS:Vine 2.6-rc4 Perl: Version 5.6.1 よろしくです。
>>790 ユーザアカウントに自分の漢字名を使ってその中に、次の漢字の内の一つが入ってるんじゃないの?
―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭xx
そうだったら、ユーザアカウントに漢字名を使うの止めれ。骸骨人の作った他のソフトのインストールも
時も困ることになるぞ。
796 :
デフォルトの名無しさん :04/11/19 17:13:10
質問します ファイル操作を行う、バッチシェルを作ろうとおもうのですが、いまさらシェルを勉強するのもあれなんで、 perlでもバッチ処理はできるのでしょうか?
797 :
デフォルトの名無しさん :04/11/19 17:36:32
すみません、質問です。 日本語(EUC)の絡んだ文字列の完全一致の比較(eq)でWindowsとLinuxで結果 が異なって困っています。 Windowsの方だとちゃんと判定してくれるのですが、Linuxでは合っていても NGとしか返してこないんです。 確認すべきこと、解決策はありますか? ちなみにそれぞれの環境は ・WindowsXP ActivePerl5.8.4 ・Linux(Redhat9) ActivePerl5.8.0 です。 比較させようとしている文字列はそれぞれ異なる変数A,Bで、 A、Bともにファイルからオープンして配列に格納された要素です。 それぞれchompした後、比較してもLinuxでは無理でした。 Linuxマシンへの転送もテキストモードで送ってます。 (一応、全ての組み合わせ※で試しました) ※アスキー、バイナリ、EUC、JIS、無変換
Linuxのほうで双方の文字列をバイナリダンプしてみれ
>>791 >>792 >>795 ユーザー名変更したら解決しました。有り難う御座いました。
ユーザー名には某PCメーカーの『ソ』が含まれておりました……。
>>799 専有マシンならdisk直下においといたほうがいい。
またいつか、似たような問題でトラブるよ。
>>800 ハァ?問題の本質が分かってないんじゃない?
>>801 あんたもそのうちトラブるかもね(w
ばかげた「解決法」をweb上でわんさか見かけるんでレスしたまでのこと。
MSから入った初心者はたいがいひっかかる。
>>796 それが分からない君は、シェルを今からでも勉強した方がいいと思うぞ
804 :
デフォルトの名無しさん :04/11/19 19:53:26
>>803 どうも、シェルは現役時代数百本作ったことがあります。。
でも、今はすっかり忘れてしまって。。むしろperlの方ができるかな
>>802 何をノタマッテいるんだか?
単純に漢字の第2バイトの問題だろ。20年以上前からMSが放置してる問題だよ。
s/シェル/シェルスクリプト/g 当然できます。
>>793 $LANG=C cpan
とかしてみたら?
makeのエラーが日本語で出てるのがあやしい気がする。
>>794 1)の方法はPerl 5.8が入っているマシンで試しましたが同じ結果でした。
2)はサーバーのPerlを変える事になるので、他のスクリプトで予期せぬエラーが
出るかもしれないので躊躇っています。
自作のコードばかりなので修正が必要なときは全部自前なのがつらいです。(´∀`;)
アドバイスありがとうございました。
>>808 試してみます。
アドバイスをありがとうございました。
810 :
でこりん :04/11/19 21:53:58
だれか教えていただけないでしょうか? 2進数のバイナリを10進数にしたいのですが $recode = unpack("C*",$bin) ←これの"C*"とか”N*”ってどうゆう意味 なんですか?
perldoc -f pack
スマートな方法あったら教えてください 変数がオブジェクトか否かを調べたいのですがref($var)の結果がHASHでもARRAYでもSCALARでもREFでもGLOBでもないということから判断する以外に方法はありますか?
>>812 Scalar::Util(5.8より標準)のblessedが正にその用途。
ない・インストールできない場合はこれで
sub UNIVERSAL::__object_class__{ ref($_[0]) }
sub blessed{
local($@);
length(ref($_[0])) ? eval{ $_[0]->__object_class__ } : undef;
}
>>775 遅レス。Expect調べてみたところ
$_->expect(300,
[ qr/subject:/i => sub{...} ],
[ qr// => sub {...} ],
...
この手の書き方は、[]の中のパターンを順番にマッチさせていく、という制御というよりは、
パターンにマッチする文字列がどこかで発生したらsub{}を実行するというような、
イベントハンドラ的な書き方みたいだよ。
それから qr//で多分スクリプトがストールしているような気がするのだが、いかがか?
>>816 ありがとうございます。
読みました。読みましたよ!
>>816 さんが仰ってるのはメールを送信する部分ですよね。
それではメールの本文の、何も目印がないものにはどのようにマッチさせればよいのでしょう?
[sample@localhost sample] $ mail test@localhost
Cc: sample@localhost
とした後の本文の何も書いていない部分にマッチさせるのです。
qr/^/とすればよいのかな?
この部分に限らず、全体的な構成を見直すべく、-iオプションを付けてみたり
色々な方法を試しています。
遅レスでも構いません。何かご助言頂けるなら喜んで受けます!
間違えました [sample@localhost sample] $ mail test@localhost Subject: test mail でした。
820 :
797 :04/11/20 14:27:40
797です
>>798 回答ありがとうございます。
しかし、Perlでバイナリダンプの仕方がわかりませんでした。
調べたところ、CSVファイルから読み込んでカンマでsplitして配列と
してその要素の比較を行ったのですが、chompをしても行末の改行が
うまく削除されず(?)、一致しないようでした。
事象は以下のとおりです。
あるファイルaaa.csv(中身は"A,A"で改行あり)とし、
openしてカンマでsplitし、配列@aaaに格納したとします。
すると$aaa[0]=A、$aaa[1]=A となりますよね。
で、lengthをとってみると、$aaa[0]は1で、$aaa[1]は3なんです。
Windows環境で実行するとaaa[1]は2なんですが。
Linuxで$aaa[1]をchompしても、lengthは2となります。
さらに、$aaa[1]をchopすると、ようやくlengthは1となり、
条件式($aaa[0] eq $aaa[1])にもマッチしてくれます。
ちなみにaaa[1]を最初にchopするとlengthは2となり、次にchompをしても
lengthは2のままでした。
aaa[1]には改行のほかにもなにか文字が含まれているということなのでしょうか?
こういう事象ってLinuxでは正常ですか?
つまり、Windowsから転送されてきたファイルの改行を削除するにはchopしてchompする
必要があるのか?ということです。
ちなみにファイルはFFFTPでアスキー・EUCで転送したものです。
長い上に文章力がなく申し訳ないのですが、誰か答えていただけますでしょうか。
>>821 ありがとうございます。
勉強してきます。
>>821 早速解決しました。ほんとにありがとうございます。
824 :
デフォルトの名無しさん :04/11/20 16:50:24
perlでもバッチ処理はできるのでしょうか?
825 :
でこりん :04/11/20 17:18:35
827 :
デフォルトの名無しさん :04/11/20 22:05:57
828 :
デフォルトの名無しさん :04/11/20 22:13:08
Perl>>>>>>>>>>>>Java
.pl>>>>>>>>>>>>>>.bat
Perl>>>>>>>>>>>>>>>>>英語
ドイツ語, フランス語
Perlのようなもの
のようなもの
>>754 会社でデスマ中で返事遅れました。すんまへん。
今までの流れを愚直に書けばこんなかんじになります。
空行待ちは "\n"はOKみたい。
#!/path/to/perl
use Expect;
use strict;
use warnings;
my @hosts = qw(example.com example.jp);
my $user = 'osushi';
my $pass = 'naisho';
my $mail = '
[email protected] ';
my @exp;
for (my $i = 0; $i <= $#hosts; $i++) {
$exp[$i] = Expect->spawn("telnet $hosts[$i]");
}
for (my $i = 0; $i <= $#hosts; $i++) {
$exp[$i]->expect(10, -re, qr/login:/i) ;$exp[$i]->send("$user\n");
$exp[$i]->expect(10, -re, qr/password:/i) ;$exp[$i]->send("$pass\n");
$exp[$i]->expect(10, '$') ;$exp[$i]->send("mail $mail\n");
$exp[$i]->expect(10, -re, qr/subject:/i) ;$exp[$i]->send("TEST\n");
$exp[$i]->expect(10, "\n") ;$exp[$i]->send("test mail from $hosts[$i]\n");
$exp[$i]->expect(10, "\n") ;$exp[$i]->send(".\n");
$exp[$i]->expect(10, -re, qr/Cc:/i) ;$exp[$i]->send("\n");
$exp[$i]->expect(10, '$') ;$exp[$i]->send("exit\n");
$exp[$i]->close();
}
別に同時ログインする必要はないので コマンド部を分離して整理すると下の感じ。 my @sequences = ( { expect => qr/login:/i , send => "$user\n" }, { expect => qr/password:/i, send => "$pass\n" }, { expect => qr/\$/ , send => "mail $mail\n"}, { expect => qr/subject:/i , send => "TEST\n" }, { expect => qr/\n/ , send => "test\n" }, { expect => qr/\n/ , send => ".\n" }, { expect => qr/Cc:/i , send => "\n" }, { expect => qr/\$/ , send => "exit\n" }, ); for my $host (@hosts) { my $exp = Expect->spawn("telnet $host"); $exp->expect($timeout, [ $_->{expect}, sub{shift->send($_->{send})} ]) for (@sequences); $exp->close(); }
ありゃ、空白詰められちまった。 それからtelnetじゃなくてssshだったっけ? まぁ一緒だよね。
perlはパッチを作った人の言語です
expectスレでやれよ
あるんだ!すげー (...化石ぢゃん)
843 :
デフォルトの名無しさん :04/11/21 04:58:29
4しかない・・・
844 :
デフォルトの名無しさん :04/11/22 10:08:12
ヒアドキュメント中でリストの区切りを変えようとして @{[$" = qq{\n} and '']} のように書いているのですが、 「このクソ虫め。条件分の中で “=” だと? “==” だろ? 田舎へ帰ってママのおっぱいでも吸ってろ」 と警告を受けるのですが、他によい書き方はありますか? と聞こうとしたところでもう一度考えて @{[($" = qq{\n}) x 0]} で警告を受けなくなった。俺はクソ虫からちょっとましなクソ虫に成長した。 と日記に書いておこう。
ソートについて質問させて下さい。 abcdef の場合は sort @array 123456 の場合は sort { $a <=> $b } @array と理解しているのですが、 no1 no1_1 no1_1_1 no1_1_2 no1_1_10 no1_2 no1_10 no2 no3 no10 ↑のソートが上手く出来ません.. 上記のように並べるソートはどのようにすれば良いのでしょうか。
先頭の文字列が同一だと仮定して。 最初の数字(a)を、取り出す。 もし次にアンダーラインがあれば、’.'ピリオドに変換して(b)とする。 その後に続く数字を(c)を取り出す。 さらに、アンダーラインがあれば、それをスキップして数字を取出して (c)に連結する。 (a)+(b)+(c) "1.123"の様なフォーマットに変換すれば良いんじゃないか? それを、連想配列なり何なりしてソート。 具体的なコードは、自分で考えてくれ。
>>846 どう並べたいのかによる。単純には sort {$a cmp $b}@array
>>847 それだと、
no1_11_1 と no1_1_11 の区別がつかない。
>>846 こんな感じかな?
@array = map $_->[0],
sort {
for (my($n,$cmp)=1;; ++$n) {
$#$a<$n || $#$b<$n and return $#$a<=>$#$b;
$cmp = $a->[$n]<=>$b->[$n] and return $cmp;
}
} map [$_, /(\d+)/g], @array;
>>846 こんな感じじゃない?
printf "no%*vd ", '_', $_ for sort map{ s/no/v/; s/_/./g; eval } @array;
(この場合、v-stringを使うとラク)
v-stringとかシラネー
不恰好だけど俺もでけた
と思ったら
>>850 とあんま変わらんのか('A`)
@a = qw/no1 no2_2 no1_22 no2 no1_1 no1_2_4/;
@s = map{ $_->[0] }
sort{
for(1 .. (@{$a} > @{$b} ? $#{$a} : $#{$b}) ){ my $s = $a->[$_] <=> $b->[$_]; $s == 0 ? next : last}
$s }
map{ [$_, /(\d+)/g] } @a;
print qq/@a\n@s/;
なんか暗号にしか見えんなw
あとsortって地のブロックで値を返すかreturnしなきゃダメなんだね、勉強になった
どこが?ちゃんと動きましたが・・・
う、載せるときにテキトーにmyしちゃいました ゴメンチャイ sortブロックの初めにmyですね
>>857 { v1.2.3 => 4 } みたいな書き方がNGになっただけじゃないの? なんなら
print 'no', (join '_', unpack 'U*', $_), ' '
for sort map{ s/no//; pack 'U*', split '_' } @array;
でもよし。packすれば無理にシュワルツする必要なし。短いし。
Emacs で読める info 形式の manual の最新版はどこから取れますか?
私のハードディスクから取れます
print "読み込むファイル名を入力してください ( By****3.txt )\n"; print "ファイル名 = "; chomp (my $file_read = <STDIN>); -f $file_read or die "\nそんなファイルないです\n\n"; open READ, "<$file_read" or die $!; # 書き込みを行うファイルについての操作 print "\n書き込み先のファイルを指定してください ( By****4.txt )\n"; print "(ファイルがない場合は新たに作成されます)\n"; print "ファイル名 = "; chomp (my $file_write = <STDIN>); # 書き込み先ファイルを追加書き込み型で開く open WRITE, ">>$file_write"; while (my $line = <READ>) { print "$line\n"; #配列の中身確認用print $value[$value_count] = $line; $value_count++; }
という
>>862 のソースで、あるファイルを読み込んで、各行を配列の各要素に代入して別ファイルに書き込む、
という作業をしたいのですが、読み込んだ後に各行の行頭に半角スペースが入ってしまいます。
読み込むファイルが
100
200
300
という内容の場合、確認用printで確かめたところ、出力ファイルの内容が
_100
_200
_300
となってしまいます。
(『_』は半角スペースだと思ってください)
なぜでしょうか?
という
>>862 のソースで、あるファイルを読み込んで、各行を配列の各要素に代入して別ファイルに書き込む、
という作業をしたいのですが、読み込んだ後に各行の行頭に半角スペースが入ってしまいます。
読み込むファイルが
100
200
300
という内容の場合、確認用printで確かめたところ、出力ファイルの内容が
_100
_200
_300
となってしまいます。
(『_』は半角スペースだと思ってください)
なぜでしょうか?
二重書き込みすみません…
>>864 どっかで
print WRITE "@value";
とかやってんだろ。
>>866 回答ありがとうございます。
while (my $line = <READ>)
{
print "$line\n"; #配列の中身確認用print
$value[$value_count] = $line;
$value_count++;
}
のすぐ下に確認用として、
print "@value\n";
という行がありました。
この行を削除したら意図した通りに動くようになりました。
配列変数をprint(もしくはファイルへprint) すると
なぜこのような現象が起きるのでしょうか…?
emacs lisp の cond みたいなのって perl では何になりますか?
if
elsifの羅列
nslookupのlsコマンドでDNSに登録されたホスト一覧を取る場合って、 open(IN, '| nslookup > out.txt'); print IN "ls ドメイン名"; close(IN); のようにして、一旦out.txtに結果を吐き出す方法しか 思いつきませんでした。 Perlの変数にlsコマンドの実行結果を直接格納する方法ってあるのでしょうか?
``
皆様、ありがとうございます。 と言うか、全く理解出来てないので、 皆様のコードを参考にして出直して参ります..orz
>>872 同じプログラムに対して入力も出力もしたいとなると
IPC::Open2。
出力をとりこんでいろいろ加工するんならはじめから
Net::DNSを使ったほうがいいかも。
>>834-
>>835 返事が遅れました・・・ごめんなさい!
>>754 です。
投稿して頂いたスクリプトを元に改造を施し
満足のいくものを仕上げることができましたよ。
メールの本文入力域を/\n/にマッチさせるためか、
>>834 さんのスクリプトだ
とメールを送信し終わってプロンプトに戻ってもしばらくはメールの本文を書
いて、「Not such command」などと怒られてしまうので、そこのところを改良
しました。
でも全体としてみるとかなり参考になりました。
ありがとうございます!
以下にできあがったものを載せておきます。
その他にもアドバイスをくださった方々、ありがとうございました!
#!/usr/bin/perl -w
use Expect;
@host = ("www.sample.com", "www.sample.jp");
$user = "mona";
$pass = "giko";
$mail = "
[email protected] ";
for (my $i = "0"; $i <= $#host; $i++) {
$exp[$i] = Expect->spawn("ssh -l $user $host[$i]\n");
}
for ($i = "0"; $i <= $#host; $i++) {
$exp[$i]->expect(300,
[ qr/\(yes\/no\)/ => sub { my $self = shift; $self->send("yes\n"); exp_continue; }],
[ qr/password:/i => sub { my $self = shift; $self->send("$pass\n"); exp_continue; }],
'$'
);
$exp[$i]->send("mail $mail\n");
$exp[$i]->expect(50,
[ qr/subject:/i, sub { my $self = shift; $self->send("TEST\n"); exp_continue; }],
"\n"
);
$exp[$i]->send("$host[$i]\n.\n");
$exp[$i]->expect(50,
[ qr/cc:/i, sub { my $self = shift; $self->send("\n"); exp_continue; }],
'$'
);
$exp[$i]->send("exit\n");
$exp[$i]->close();
}
878 :
デフォルトの名無しさん :04/11/25 10:16:17
画像ファイルのヘッダを除去するにはどうすればいいですか?
879 :
デフォルトの名無しさん :04/11/25 10:32:09
すみません、ヘッダというのは、content-type以外の余分な情報の部分です
>>876 >しばらくはメールの本文を書いて
? うちの機械ではちゃんと動いたんだがね。
たぶんどっかの expectのなかに []を複数書いちゃって
複数文字列待ち状態になってたんじゃないのかな?
881 :
デフォルトの名無しさん :04/11/25 11:44:55
デジカメの画像が000.jpg 001.jpg ... とあって、サムネイルがそれに対応して s-000.jpg s-001.jpg ... というようにあるので、それの一覧ページを作ろうと スクリプトを書いたのですが、数字が3桁で扱われません。 for ($i = 000; $i < 256; $i++){ print qq|<a href="$i.jpg"><img src="s-$i.jpg" width="120" height="90" alt="$i.jpg" /></a>|; }
882 :
878 :04/11/25 11:53:47
sprintfでぐぐるといいかも
できました! 878さんありがとうございました!
>>875 やっぱそうなるんですね。
Net::DNSは知らなかったので、ちょっと調べてみます。
ありがとうです。
886 :
デフォルトの名無しさん :04/11/25 23:02:15
perlにて system"/bin/rm -rf $BackupDIR/*" みたいな感じでコマンドを実行しているのですが、 標準出力にでるメッセージをプログラムで受け取るにはどうしたらいいのでしょうか? ``でやった方がよい?
889 :
デフォルトの名無しさん :04/11/26 09:00:19
文字化けを起こす文字(表や能)を正規表現を使って表\や能\に置換しようとしているのですが上手くいきません。 $str = "表示するべさ"; $str =~ s/\Q表示\E/表\\示/; これだと上手く動作するようですが、置換対象が"表示"に限られるので、表→表\にしようとして $str =~ s/\Q表\E/表\\/; だとエラーになってしまいます。 なんとかなりませんでしょうか? ちなみにSJISじゃないと駄目だという状況なのでEUCはNGです。
\x92\x5C
891 :
BlackLightOfStar ◆ifsBJ/KedU :04/11/26 11:28:07
質問です。 〜を任意の文字列(但し、abc,def,ghi,jklというパターンは含まないとし、0文字でもいい。) として、 abc〜def〜ghi〜def〜ghi〜jkl とパターンマッチするかどうかを調べるにはどうすればいいのでしょう?
天気がいいのでちょっとドラクエ買ってきます
>>891 my $d = '〜';
my @s = qw(abc def ghi jkl);
my $s = 'abc〜def〜ghi〜def〜ghi〜jkl';
$d =~ /\Q$_\E/ && die "\$d includes '$_'.\n" for @s;
my $p = '(?:' . join('|', map quotemeta, @s) . ')';
print $s =~ /^$p(?:\Q$d\E$p)*\z/ ? '' : 'un', "match.\n";
895 :
BlackLightOfStar ◆ifsBJ/KedU :04/11/26 13:10:23
Re:>894 どうもありがとうございました。これで出来そうです。
UTF-8で文字が途切れているか判定するにはどうすればいいんでしょうか。
897 :
BlackLightOfStar ◆ifsBJ/KedU :04/11/26 15:40:57
Re:>896 文字が途切れているとは何?perlには文字コードを出力する関数があるからそれでなんとかなる?
さっきまで質問していた人なんかには聞いていませんよ・・・
899 :
BlackLightOfStar ◆ifsBJ/KedU :04/11/26 15:43:42
抜粋: 次の例を実行すると [ABC] [65 66 67] [ABC] と表示されます。 $xx = "ABC"; # 文字列としての代入 @yy = unpack("C*", $xx); # 数値の配列に変換 $zz = pack("C*", @yy); # 数値の配列を文字列に変換 print "[$xx] [@yy] [$zz]\n";
900 :
デフォルトの名無しさん :04/11/26 15:43:43
配列の構造体について質問させてください。
いくつでも追加可能な構造体配列が作りたいと思い、
http://www2s.biglobe.ne.jp/~arkadia/cgi/perl_tips.htm を参考にして、最初、繰り返し push( @$DataArray, \%Data1 ) を使うソースを書いてずっと悩んでいたのですが、
これは配列の要素が、すべて同じリファレンスで構成されているためだと(自分では)納得して、
自分なりにソースを作ってみました。
my (%Data, %Data1, @DataArray, @Name);
%Data0 = ("Name" => "", "Address" => ""); # 構造体定義
@Name = ("Taro", "Hanako", "Ichiro"); # 要素数は可変
foreach (@Name){
%Data = %Data0; # 初期化
$Data{"Name"} = $_;
push( @$DataArray, %Data);
}
配列に入れた(つもりの)ハッシュのリファレンスを使って、
$DataArray->[0]{"Name"} のように使いたいのですが、これも自分の知識では無理でした。
もうどうやればいいのか分かりません。
追加可能な構造体配列を作る方法をどうか教えてください。
901 :
BlackLightOfStar ◆ifsBJ/KedU :04/11/26 15:44:04
Re:>898 お前に何が分かるというのか?
なんで人をお前呼ばわりするんですか?
>>900 追加可能な構造体配列というのはなくて、構造体っぽく使うことにした
ハッシュリファレンスを格納する配列(perlの配列ははなから追加可能
なのでことさら追加可能という必要はない)があればいいわけだが、
注意しなくてはいけないのは、ハッシュリファレンスが指すハッシュは
毎回別のものにしなくてはいけないということだ。そのプログラムでは
ループの外で定義された%Dataが毎回使われるので、全部同じ実体に
なってしまう。あとtypoだと思うが、push( @$DataArray, %Data);
はpush( @$DataArray, \%Data);ね。
ということで、%Dataをforeachのループ内で新しく作ればOK.
foreach (@Name){
my %Data = %Data0; # 初期化
$Data{"Name"} = $_;
push( @$DataArray, \%Data);
}
それから、最初の行のmy宣言は中身とほとんどあってないのでちゃんと
直すように。use strictの使用を勧める。
904 :
デフォルトの名無しさん :04/11/26 16:09:09
chaoticのことをchaosicと書いていた奴か。
906 :
BlackLightOfStar ◆ifsBJ/KedU :04/11/26 16:32:52
Re:>902,904 逆ギレすんな。
無礼な人ですね。
>>903 すげーー。 ありがとうございます!!
言われてみれば、そういう使い方ができますね。
ループ内でハッシュを新しく宣言しなおす、という方法はまったく思いつかなかったです。
これならその都度、リファレンスも別のものに変わると言うわけですね。
push( @$DataArray, %Data); はタイプミスじゃなく、敢えてそうしました。
自分のソースでは、\%Data のリファレンスが変わっていないので、\%Data を push しても、
同じリファレンスを渡すだけだと考えまして、ハッシュの中身を配列に全部移した後で
配列の途中(それぞれのハッシュの先頭)へのリファレンスを $DataArray->[n] で
拾おうと思ったんです(無理でしたけど)。
宣言部は、コピペするときになるべくソースを短くしようと思って、use strict とっぱらったんですが、
その過程でミスしてしまったようです。
短くするなら
>>905 氏くらい短くしろ!と言われそうですが・・・力不足ですみません。
>>905 ありがとうございます。
デリファレンスをいきなり使うパターンですか。
完全に自分の想像外なソースでしたが、サイトを見たり、ソースをいじったりしてだいたい仕組みが掴めました。
シンプルかつ実に面白いソースですね。
909 :
BlackLightOfStar ◆ifsBJ/KedU :04/11/26 17:00:03
Re:>907 逆ギレすんな。
他のスレでやってください。場違いでしょう。
911 :
デフォルトの名無しさん :04/11/26 17:10:23
>>893 読んで見ました。
$str =~ s/\Q表\\E/表\\\/;
に変更してみたらエラーは出なくても結果は変わらず状態です。
何か解釈がおかしいのでしょうか?
>>890 $str =~ s/\x5C/\\x5C\\x5C/;
ということでしょうか?
こちらも変化無し状態です。
よろしくおねがいします。
文字化けだって? 文字コードがシフトJISと分かっててなぜ文字化けするかね
913 :
デフォルトの名無しさん :04/11/26 17:38:38
>>896 perldoc EncodeのHandling Malformed Data
バカking、わざわざ数学板から出張して荒らしてるんじゃねぇよ。 よく書き込んでいる >お前に何が分かるというのか? ってのがあるが、お前の事なんか理解できるか、ボケ。 周りに理解してもらう前に自分が周りを理解しろ。
「Re:」の使い方を一目見ただけで こいつの精神の閉塞ぶりがよくわかる
>>911 $str = "表示"; とした時点で、$strの中身は
95 5C 8E A6 ではなく、95 8E A6 となっている。
「表」ではなくなってしまっているのだから、
「表」だけでどうにかしようってのはムリな話。
$str = '表示'; とするか、
$str = "表\示"; とするか、
use encoding "sjis"; をすべき。
918 :
BlackLightOfStar ◆ifsBJ/KedU :04/11/26 22:29:10
Re:>912 perlではバックスペースでのエスケープを優先するからだろう。こういう場合はシングルクオーテーションが有効だったかな?
いちいちageんなふぉ
>>918 独り言ならチラシの裏でやってください。
「Re:」をレスアンカーの前に置く神経は理解できない、というより歪んでいる。 ・電子メールの「Re: 」はコロンの直後に空白がくる4バイト。 ・この「Re」は略語ではなく、「〜に関する」という意味の前置詞。 ここまでは些末なことだし、知らない人も多いだろう。 ・誰もが知っているとおり、「Re: 」はサブジェクトに添えるものである。 人名に添えるものではない。 この狂人がメールを使ったことがないとは考えられないから、 「Re:」の由来がメールとは無関係ということはないはず。
922 :
デフォルトの名無しさん :04/11/27 00:02:25
CPANは、一般的には(perl使いの間では)、なんと発音されてますか?
しーぱん
924 :
デフォルトの名無しさん :04/11/27 00:03:40
しーぽん
926 :
デフォルトの名無しさん :04/11/27 00:05:29
>1 >1 <<1 1>> Re:>1 どれもきもいなぁ。
すれ違い
スィ〜ぱん
スィ〜ぴゃぬ
くぱん
ぬるぽ
ガッ!
あんぱん食いて
___ / \ __________ / ∧ ∧ \ / | ・ ・ | < 漏れを喰うの? | )●( | \__________ \ ー ノ \____/
スレ埋めるにはまだ早いだろ…。
936 :
デフォルトの名無しさん :04/11/27 11:16:13
シェルである重い処理をすると2時間 CPU使用率20% それをperlで作ってバッチ処理をすると 30分 CPU使用率 95% これって、シェルより早いけどなんでなんでしょうか?
>>936 処理内容に依存するでしょ。
シェルから実際に起動するコマンドが重ければ重いだろうし、
シェルから大量にコマンド起動してたらその起動の処理自体が重い
(Solaris なんかだと fork(2) が重いので特にネックになりそう) だろうし。
938 :
936 :04/11/27 12:16:05
>>937 vmstat でブロックI/Oを見てるけどシェルの場合はたいして
I/Oがでていないのに、CPUが使われていないようにみえる・・
CPU使用率が低いのにELAPSが長いということは、ファイルI/Oが多いはずなのに・・
CPUのディスパッチの優先順位がシェルの場合低い気がする・・
ひとりごとは他所でおねがいします。
>>938 だから一体なにが知りたいのかね?
それに既にそれは Perl の話ではなかろう?
速度が必要ならシェルスクリプトは使うな、 これでいいでしょ。いまはCとシェルしかない時代じゃないんだし。
942 :
デフォルトの名無しさん :04/11/27 14:09:45
釣れないようですね w
943 :
940 :
04/11/27 17:35:20 せっかく煽ってるんだけら、返事ください お願いします!