1 :
デフォルトの名無しさん :
2007/10/16(火) 00:59:57 "The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc11.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html ● 2007/10/12現在の最新版: 5.8.8
● 2007/10/12現在の開発版: 5.9.5
前スレ
Perlについての質問箱 32箱目
http://pc11.2ch.net/test/read.cgi/tech/1186995713/ リンク集は
>>2-3 過去スレは
>>4 あたり
2
俺のチンコは左寄り。
前スレの「前」の話の人は 上司が2ch見てたらオワタな
スレの前って言ったら、ここだろ。
11 :
デフォルトの名無しさん :2007/10/16(火) 22:54:36
で?結局、「前」 はどっちなのさ。はっきり決着をつけてもらおうか。
「前」はおやつに入るんですか?
男前 の前はどっちなん?
つか前スレの981がアホなのが諸悪の根元。 「前ってどっちですか?」なんて聞かれた日にゃ、 俺が上司ならブチ切れ。 使い物になんねから左遷だな。
15 :
デフォルトの名無しさん :2007/10/16(火) 23:34:20
と言いつつ、実はどっちが 「前」 か答えられない
>>14 であった。
16 :
デフォルトの名無しさん :2007/10/16(火) 23:40:12
もしや、これのオチは sub 前 { print "hoge"; } っていうサブルーチンの事だったと言うんじゃ・・・
17 :
デフォルトの名無しさん :2007/10/16(火) 23:48:47
アインシュタインの相対性理論を説明するときに必ず出てくるのが「電車」のたとえ。 これにならって、電車について考えてみる。 止まっている電車はどっちが前だかわからない。 だが走ってる電車ならわかる。進行方向が前だ。 これはペチャパイ女にも言える。 プログラムの「前」とは、プログラムの進行方向なのでは無いか? ・・・で、プログラムってどっちに向かって走ってるの? (とりあえず、ループとか条件分岐とかは考えにいれないでいい)
しかし981は、人間の前は「顔のある方」って言い切ってるよ博士
19 :
デフォルトの名無しさん :2007/10/17(水) 00:33:45
人を顔で判断するのは、あまり関心しないな。
21 :
デフォルトの名無しさん :2007/10/17(水) 00:45:07
>>20 ハリーポッターのヴォルデモートかいな(笑)
22 :
デフォルトの名無しさん :2007/10/17(水) 00:46:31
画面の方向です。
>20 そりゃ今お前が会話しているほうの顔が前だろ
いいからそろそろどうでもいい話やめれ。 急に新スレまで行っててビックリだ
んじゃ。 5.10っていつ出る予定なん? 5.10に期待することは? とか聞いてみる。 // とか err って5.10から使えるようになるんだっけ?
26 :
デフォルトの名無しさん :2007/10/17(水) 15:50:55
そんな事はどうでもいいだろ。 このスレにはマジメに質問するヤツはいないのか?
ウェブサイトでcgi(bbs)を扱う上で、 perlとPHPのどちらを用いるのが良いと思いますか? 調べてもPHPが楽で軽くて良い、逆にperlは重いからダメだということばかり書いていまして…
進行方向が前なら、 次スレ=前スレってことですか?
PHP厨のネガティブキャンペーン必死ですねwwww
なんだこれ、俺達に“動け”ってことか そろそろ言語のひとつでも潰して力見せる時か しかし、なんでもム板にもちこむなよな ま、実際何とかしちゃう俺らも俺らだけどw
> ま、実際何とかしちゃう俺らも俺らだけどw どんな抗うつ剤を飲むとそういう狂言を吐けるようになるの?
この中にニュー速民居たら手上げろ〜(^o^)ノ
何か?
前は住民でした
Expectモジュールについて質問 Tclの.expファイルをExpectモジュール使ったPerlのファイルに書き換えてるんだけど TclのputsにあたるものはExpectモジュールでは用意されてないの?
37 :
デフォルトの名無しさん :2007/10/18(木) 13:50:25
つまらんこと聞くな!
「つまらんこと」 =
>>37 に理解できないこと
最近、いちいち質問者につっかかる厨房が徘徊しているようだ。
39 :
デフォルトの名無しさん :2007/10/19(金) 11:56:05
mod_perl な環境で、Perl5.8 の rand() を繰り返すと 同じ数列が発生しちゃうんだけど、やっぱり srand() 必要?
まっとうな乱数が欲しいならrand()とか使っちゃダメ
そして真っ当な乱数って云うのがほぼ実現不可能と気が付くのであった。まる♪
マジレスすると、無理数がまともな乱数。
最初だけは疑似乱数で任意の数nを生成 →円周率の小数点以下n桁目の数値を乱数として取得 →以下nを一つずつ増やす とか?
結構少ない個数の観察で以降の出力を予測できるようになるから、 もう一ひねりいりそうだな。
その円周率はどこから持ってくるんだ。
スーパーπで104万桁を毎回計算させますが
48 :
デフォルトの名無しさん :2007/10/20(土) 03:23:22
↑自分ワールドで何舞い上がってるんだろ
マジレス乙
@ARGV、標準入出力、テキストファイルの中身は全て プラットフォームのデフォルトのエンコードだと仮定して、 どのプラットフォームでも同じように動作するようにスクリプト書きたい。 コード中にcp932とかハードコードしたくないので .NETやpythonみたいにstdioのエンコードを取得したりできればいいと思うけど、 どうしたらいい?
>>51 > @ARGV、標準入出力、テキストファイルの中身は全て
> プラットフォームのデフォルトのエンコードだと仮定して、
プラットフォームのデフォルトのエンコードが存在しない場合は?
>>52 そういう環境は視野に入ってないっす。
ascii扱いでいいんじゃないの。
変なバイト列だったらエラーになればいいと思う。
どちらかというと、クロスプラットフォームよりも、
とにかく日本語版Windows上のアプリとしてちゃんと動き、
なおかつ、cp932をハードコードせずに済ませることの方を重視したいかな。
それとも、
OSのAPIレベルでデフォルトのエンコードなるものを取得する手段が無い場合ってこと?
Unixとかよく分からないので、そのへん分からない。
ターミナルのエンコードとか標準化された手段で取れないんだろうか?
Term::Encoding
>>Term::Encoding どうもありがとう。 何をやるにも標準モジュールだけで足りない言語だなあ。 Perlでそれを言っちゃ駄目ですか? 自分達のリリースしたアプリや、日々の作業で使うスクリプトが 依存してるモジュールの管理ってどうしてるの? cpanで自分のマシンにインストールするだけなら簡単だけど、 必要なファイルをよりわけて、 アプリのソースと一緒にリポジトリに保存しとかないとやばいよね? それって簡単にできるんだろうか。 Perlのディストリビューション以外に、 どれだけのファイルを保存する必要があるのか、 ワケわかんなくなると思うんだけど。
皆が求める物は既に標準モジュールになっている どんな言語でも不足分を補うのがライブラリなのに それを否定されては最初から全部入りの言語を 使ってくださいとしか言い様が無い 単に自分がマイノリティな事に気付いてない 我侭言ってる子供にしか見えないけど
_,,..r'''""~~`''ー-.、 ,,.r,:-‐'''"""~~`ヽ、:;:;:\ r"r ゝ、:;:ヽ r‐-、 ,...,, |;;;;| ,,.-‐-:、 ヾ;:;ゝ :i! i! |: : i! ヾ| r'"~~` :;: ::;",,-‐‐- `r'^! ! i!. | ;| l| ''"~~ 、 i' | i! ヽ | | | ,.:'" 、ヽ、 !,ノ イェ〜イ ゝ `-! :| i! .:;: '~~ー~~'" ゙ヾ : : ::| 宮川達彦 見てる〜? r'"~`ヾ、 i! i! ,,-ェェI二エフフ : : :::ノ~|`T ,.ゝ、 r'""`ヽ、i! `:、 ー - '" :: : :/ ,/ !、 `ヽ、ー、 ヽ‐''"`ヾ、.....,,,,_,,,,.-‐'",..-'" | \ i:" ) | ~`'''ー----''"~ ヽ `'" ノ
59 :
56 :2007/10/20(土) 21:19:33
>>57 Class::Accessorとか入って無いじゃん。
・・・いや、そういうことが言いたいんじゃなくて、
どうやって管理するの?ってのがレスの要点なんだけど。
スクリプトで全部自動でインスコすればいいやん
モジュールを管理統制する モジュールがCPANにある。
63 :
56 :2007/10/20(土) 23:24:35
>>61 そのインスコされる全ファイルの把握と抽出の仕方がわからない。
ネットからじゃなくて、ローカルに保存したバージョンをインストールする方法も分からない。
>>62 なんてモジュールか教えて。ググっても分かんない。
そういうの、分厚いPerl本読んでも全然書いてないし。
| ̄``''- 、 | `゙''ー- 、 ________ | ,. -‐ ''´ ̄ ̄`ヽ、_ / |, - '´ ̄ `ヽ、 / / `ヽ、ヽ / _/ ヽヽ/ / / / / / / ヽハ く / /! | 〃 _/__ l| | | | | | | ||ヽ \l// / | /|'´ ∧ || | |ー、|| | | l | ヽ /ハ/ | | ヽ/ ヽ | ヽ | || /|ヽ/! |/ | ヽ / | ||ヽ { ,r===、 \| _!V |// // .! | | || |l |ヽ!'´ ̄`゙ , ==ミ、 /イ川 |─┘ | ハ|| || | """ ┌---┐ ` / // | V !ヽ ト! ヽ、 | ! / //| / ヽ! \ハ` 、 ヽ、__ノ ,.イ/ // | / ┌/)/)/)/)/)/)/)/)/)/)lー/ ` ー‐┬ '´ レ//l/ |/ |(/(/(/(/(/(/(/(/(/(/│|| |\ 〃 r'´ ̄ヽ. | | ト / \ /  ̄`ア | | | ⌒/ 入 〉  ̄二) 知ってるが | | | / // ヽ 〈! ,. -' | | ヽ∠-----', '´ ', | \| | .お前の態度が | |<二Z二 ̄ / ', | | | _r'---| [ ``ヽ、 ', | | | 気に入らない >-、__ [ ヽ ! \.| l. ヽ、 [ ヽ | ヽ| \ r' ヽ、 |
65 :
デフォルトの名無しさん :2007/10/21(日) 10:16:47
SJISまじりの文字列を1バイトずつ先頭から整数として 取り出したいのですが、どうすればいいのでしょうか? ActivePerl(漢字にちゃんと対応してない環境)です。 よろしくお願い致します。
親子プロセス間のシグナルの送り方についての質問です cygwin で動いたけどActivePerl 5.8.8だとだめでした 'a'をキーインするとプログラムそのものが終了します これってActivePerlの仕様でしょうか? $SIG{ALRM} = \&handler; $ppid = $$; ##alarm(5); if( $childpid = fork() ){ #親プロセス #-- 受信 print "親 $$ \n"; while(1){ sleep; print "AHAHA\n"; } } else { #子プロセス print "子 \n"; print $$,"\n"; while(<STDIN>){ if( /a/ ){ $x =kill('ALRM',$ppid); # exit; } } } sub handler{ print @_[0], "\n"; }
>>68 実装はそうなっているけど、仕様なのかな?
親から子へシグナルを送る場合には(killが)使えるけど、かなり不便。
子プロセス(forkエミュレーションで生成した別スレッド)には PostThreadMessage を使って
殆どのシグナルを送れるけど、それ以外の相手には INT,BREAK 程度しか送れない。
おまけに、それ以外は全てKILL扱い( TerminateProcess を使う)になっている。
(そして、5.6との互換性の為だと注釈が付いている)
Cが読めるなら、詳細は(Perlソースに含まれる)win32.c中の win32_kill 読んだ方が早いかと。
foreach をつかって配列@xを(0..255)まで作り、 その要素として$x[0]にa1,$x[1]にa2,・・・$x[255]にa256を代入する文がわかりません。 どなたか教えてください。
map { $x[$_] = "a" . ($_ + 1) } 0..255;
>>71 さん
foreach をつかって
>>70 のことを全部やる方法はわかりますか?
戻り値を受け取らないケースではforを使えっていつも婆ちゃんが言ってるだろ
$x[$_] = "a" . ($_ + 1) for 0..255;
なんか大学の課題には >foreach 文を実行する前に,@x = (); を実行して長さ0の配列 @x を作ってください. >そしてforeach 文を実行することで,$x[0] から $x[255] までの要素(それぞれ "a1" から "a256" までの値をもつ)を配列 @x に追加していってください. とか、書いてあるんですけどどうすればよいのでしょうか?
76 :
デフォルトの名無しさん :2007/10/21(日) 21:53:22
お前ら、鬼のようなサンプルコードで返事するとは・・・
push(@x, "a$_") foreach 1..256;
>>75 友達に聞けよ。
ここで聞くのは、小学生がお習字の宿題を親にやらせるようなもん。
教員が暇なら呼び出しを食らうぞ。
>>73 ばあちゃんの知識は古すぎるよ。
いまはvoidコンテキストのmapはリストを作らないようになってるから大丈夫だよ。
いいなぁ オレの実のばあちゃん以外にもう一人、そんなばあちゃんが欲しい
for( px = x, pa = a+1; px != x+256;i++, *px++ = *pa++ );
まちごーた for( px = x, pa = a+1; px != x+256; *px++ = *pa++ );
Can't modify constant item in scalar assignment at -e line 1, near "x," syntax error at -e line 1, near ");"
>>79 それは foreach を使う方がしっくりくる場面でさえ map で粋がっちゃう
微笑ましい子らの尻拭いを perl がやってくれるようになっただけだと
認識してるんだが、どうか。
じゃあ、俺はgrepつかってやんよ!
@x = map { "a$_" } 1..256;
@x = ("a001".."a256");
@temp = map { "a$_" } 1..256; push(@x, $temp[$_]) foreach 0..255;
foreachごときで粋がる微笑ましい子が何か言ってるぞ
map大好きっ子の的外れな反撃きたな
PBP!PBP!
foreach厨自尊心を傷付けられて必死wwwwwwwwwwwwwwwwwwwwwwwww
いやいや、
>>89 も
>>93 も根本的にハズしてるよ。
この件におけるmapとforeachの対称性は、「それを使って粋がるか否か」「その使用法に変な自尊心を持つか否か」
なのだから、mapを多用する子が反撃したかったら、自分の言われたことを返すのではなく、
逆のことを言わなくちゃいけないんだよ。「粋がる気が無いforeach厨」とかね。
現状では、黒人が肌の色を差別されて、白人に向かって「お前の肌真っ黒w」って返してるようなものだよ。
そこは属性が逆なのだから、逆のことを言わなくちゃ反撃にならないでしょ?w
95 :
デフォルトの名無しさん :2007/10/22(月) 17:52:42
なにこのスレ……
お前も相当根本的に的を外してる そして例え話を慢心で語る奴も大抵的を外してる
>>96 オウム返ししたかったら、なぜそうなのか、根拠を添えないとまるで説得力が無いよ。
どこがどういう風に的を外しているのか、ではどう書くべきだったのか。
そういうことを何も思いつかないまま、感情的にオウム返ししただけに見えちゃうよ。
あと、2行目のような怪しげな「統計」でやり返すことほど、自分を貶めるものもない。
「そういう傾向がこの世にあって欲しい」だけでは?
98 :
デフォルトの名無しさん :2007/10/22(月) 17:59:09
もっとはっきり言ってやったら? map で粋がる奴はいても foreach で粋がる奴はいない そんなこともわからずオウム返しに終始する、やっぱりmap厨は馬鹿丸出し ってw
>>94 何故言い返すのに逆の事を言わなくてはならないの?
逆のことを言えば優位になるとでも思ってるのか?
そして例え話が逸れ過ぎてて話にならない。
ただの厨房同士の喧嘩にマジレスしようとして
訳の分からない妄言を吐いてる人間にしか見えん。
そりゃ foreach は初心者が使う物だから、 そんなモノを使って粋がる奴は恥ずかしいさ。
そもそも、「無理にmapを使う奴」を皮肉っただけで(map関数を皮肉っているわけではない) 反撃に乗り出すってのが、なんか薄ら寒いよね。普段どんなコード書いてるのか。
>>99 ある性質xを持っていることを皮肉られた、ということは、
言っている相手は、その性質xを持っていないんだよ。
その性質xというのが、ここでは「粋がって(イケてる書き方だと思って)多用する」という行為。
でも、foreachっていうのは、そういう心理で選ぶものじゃないんだよね。
だから、「粋がる」という表現をオウム返ししても、まったく成立しないんだよ。
どう見ても例え話が間違ってる。君の黒人と白人の例で行くと 『お前の肌真っ白(笑)』と黒人が言ってるとしっくり来る。 どちらにせよ肌の色程度で言い争いしてるのはレベルが 知れてるって事だから、foreach厨とmap厨はレベルが低いって事になる。
>>103 急にレベルの話に移行する意味がわからない。
言っていることが、状況に即しているかどうかという話しかしていないのに。
map厨の読解力の無いオウム返しをうやむやにするための、両成敗ネタにしか見えない。
>>102 その粋がるってのが仮定だから話が違うよ。
>>89 の尻拭いも大変だな。
本人でもないのに尻拭いする意味がわからないけど。
foreach厨の文章力の無さは異常
>>106 すまん、日本語としてまるで意味がわからない。
もしかして、
「mapを使うのはクールなやり方とされていて、慣れない奴は意味もなく多用してしまう罠」
というPerl界隈の「定着した認識」に対して、今さら
「そうだという証拠はあるのかデータはいつ取ったんだ統計を提示しろさあ早く」
って詰め寄る所存?
しかしこのスレ伸びが早いな
>>104 >>105 だってこれって『馬鹿って言った奴がバーカ』
と同レベルの喧嘩だろ。真面目に考察するだけ無駄。
このレベルでなら君の言う"反撃"も別に変ではないと思うが。
話が途切れるような物言いをあえて選んできてるなmap厨
>>112 ああ、
>>89 がそういうレベルで噛み付いてただけで、
それ以上のことを何も考えていなかったのなら、このまま説明や修正無しでもすべての筋は通るね。
じゃあ、そういうことで納得するか。
つうか、普通for使うから、foreach使うのってテキストで勉強した初心者だけでじゃね?
>>114 >>84 も含めて余計な煽りレスだろ。
根拠のない決め付けを始めたのはこいつで、
後に続くレスなんて容易に想像出来たはずだ。
for厨うぜえwwwwww
118 :
デフォルトの名無しさん :2007/10/22(月) 18:33:44
foreach厨うえぇ(嘔吐
原点に戻って、$x[0]〜$x[255]まで"a1"〜"a256"を入れるという 命題について、foreach厨はどんな書き方すんの? 明らかに @x = map { "a$_" } 1..256; の方が単純明快だろ。
(´-`).。oO(WebProg板かとオモタ。。。)
>>120 それマジでWebProgに対する宣戦布告?
本気ならすぐ謝れ。謝罪しないのなら
WebProg総力を挙げてお前を潰すが。
やっぱ統合した方がいいな。WebProgの方に。
forでもmapでもどっちでも良いじゃん。 お前らPerlの合言葉を忘れたのか。
どっちでもいいとかどっちかにしろとか、どっちでもいいじゃん。
大学の教授、もう帰っちゃったぞ
for(0..255){ $i = $_+1; print "a$iと入力して下さいm(_ _)m\n"; $x[$_]=<IN>; }
<IN> ?
>>84 が余計なことを言ったせいだろ。
たぶん、
>>84 もmapに一度は嵌っている。
perlerの思春期みたいなもんだ。
>>129 ということにしておいてやるから、トイレでウンコ拭いてこい。
perlstyleさえも守れないクソの溜まり場はここですか?
まだやってんのかよw
foreach厨涙目で冷静な振りをするもバレバレで脱糞wwwwwwwwwwwww
婆ちゃんが草葉の陰で泣いてるよ
で、foreach厨 ってなんやねん
じゃあ名前を変えて foreach病 で 中二病みたいな感じでいいじゃん
mapのほうが使うの難しいと思うけど 煽ってるのはmap厨だな vipでやれ
foreach厨こそVIPで死ね
もうおまえら foreach も map も使うな。
while厨必死wwwww
goto厨死亡wwww
レベル低過ぎワロタwwwww
143 :
デフォルトの名無しさん :2007/10/23(火) 22:41:57
で、「前」ってどっち?
ティムティムがいつも向いてる方向
145 :
デフォルトの名無しさん :2007/10/23(火) 23:52:27
オレのはいつも左に向いているが。
open(FILE, "> ".$file) || die; foreach my $key ( keys %{$data} ){ print FILE join("\t", $key, $data->{$key}, "\n"); } close FILE; を foreach my $key ( keys %{$data} ){ $temp .= join("\t", $key, $data->{$key}, "\n"); } open(FILE, "> ".$file) || die; print FILE $temp; close FILE; にするとHDDにかかる負荷が減ったりしますか? それとも余分にメモリ食うだけでしょうか
147 :
デフォルトの名無しさん :2007/10/24(水) 00:11:26
後者
148 :
146 :2007/10/24(水) 00:35:48
149 :
デフォルトの名無しさん :2007/10/24(水) 00:43:30
$|=1 とかやってなければな。
151 :
146 :2007/10/24(水) 01:00:55
>>149 なるほど把握しました。
仕組みまで教えて頂いて感謝です。
そうなると、読み出しの場合はどうなるんでしょうか?
open(FILE, '< '.$file) || die;
while(<FILE>){
(my $key,$_)=split(/\t/);
$data->{$key} = $_;
}
close
と
open(FILE, '< '.$file) || die;
@temp = <FILE>;
close
while(@temp){
(my $key,$_)=split(/\t/);
$data->{$key} = $_;
}
では、まとめて読み込んでおいた方がHDDにかかる負荷が減ったりしますか?
それともメモリ食うだけでしょうか
>150
どちらが正しいのか判断が・・・
>>151 おれは、入力ファイルが1GB越えないなら、
Slurpすることにしてる。
while(<STDIN>){ print qq{1:$_}; while(<STDIN>){ print qq{2:$_}; last if $_ eq qq{\n}; } print qq{3:$_\n}; } をPerl 5.8.8で実行して内側のループを改行のみの入力で抜けた後の3:の値が 1:の時となぜか異なるのですが、$_のスコープみたいなものはどうなっちゃってるんでしょうか?
155 :
146 :2007/10/24(水) 01:40:51
>>152 ありがとうございます。
非常に参考になりました。
156 :
153 :2007/10/24(水) 01:48:59
自己解決しました。
改行($val =~ \x0D\x0A\、x0D、\x0A)が二回以上連続した場合、 その改行を</p>\n<p>に置換したいのですが、 どのようなコードを書くのがもっとも軽い処理になるでしょうか?
すみません。
>>157 の</p>\n<p>というのは、
</p>
<p>
というつもりで書きました。
\x0D\x0Aを一つの改行と考えています。
>>159 そのサイトが非常に参考になりました。
$val =~ s/(\x0D\x0A){2,}/<\/p><p>/g;
$val =~ s/(\x0D){2,}/<\/p><p>/g;
$val =~ s/(\x0A){2,}/<\/p><p>/g;
とすることで、連続している改行を
</p><p>
へと置換することまでは完了しました。
しかし、
</p>
<p>
のように改行を含んだ文字列への置換方法がよく分かっていない状況です。
そのあたりについて教えてください。
よろしくお願いします。
(なお、連続した改行でなく、単一の改行の場合は、<br />へと置換する処理を上のコードの下に書いているので、
\nとして改行すると置換されてしまってうまくいきませんでした)
16行目の++$n;で Use of uninitialized value in stringというエラーがでるのですが、 $n = 0;やundef $n;を入れて初期化してもエラーが出ます。 なぜですか? (CSVで同じ行を見るためのスクリプトです) #!/usr/bin/perl -w undef $n; open (MEDIACSV,"media_perl.csv"); @mediacsv = <MEDIACSV>; @sortedmediacsv = sort(@mediacsv); while ($sortedmediacsv[$n] ne undef) { if ($sortedmediacsv[$n] eq $sortedmediacsv[$n+1]) { print "$sortedmediacsv[$n]"; print "$sortedmediacsv[$n+1]"; }; ++$n; }; close (MEDIACSV);
163 :
デフォルトの名無しさん :2007/10/24(水) 14:14:12
難しく考えすぎ。 $val =~ s/(\x0D\x0A){2,}/うんこ<\/p>うんこ<p>うんこ/g; $val =~ s/(\x0D){2,}/うんこ<\/p>うんこ<p>うんこ/g; $val =~ s/(\x0A){2,}/うんこ<\/p>うんこ<p>うんこ/g; $val =~ s/\n/<br \/>うんこ/g; $val =~ s/うんこ/\n/g; でいいんじゃないの?
164 :
デフォルトの名無しさん :2007/10/24(水) 14:24:38
>>162 undef $n; してりゃエラー出るだろ。これは初期化とは言わない。
while ($sortedmediacsv[$n] ne undef) {
これも。undef と比較してどうする。
そもそもキミが何をしたいのか意図が伝わらない。
細かいことを言えば、if {} のうしろの ; もいらない。
基本を理解していない証拠だな。
で、↓これならどうかな。
#!/usr/bin/perl -w
open (MEDIACSV,"media_perl.csv");
@mediacsv = <MEDIACSV>;
@sortedmediacsv = sort(@mediacsv);
for ($n = 0; $n < $#sortedmediacsv; $n++) {
if ($sortedmediacsv[$n] eq $sortedmediacsv[$n+1]) {
print $sortedmediacsv[$n];
print $sortedmediacsv[$n+1];
}
}
>>163 いや、それはあまりにもひどいだろ。
いや、うんこがひどいんじゃなく、無駄にうんこを付け足そうって言う考え方がさ。
いや、うんこもひどいが。
あー、ついでだ。考え方も示しておくか。愚直にやるなら、こうだろ。 ・まず、CRLFを\nに統一する ・段落を抽出する ・段落をpタグで挟む ・改行をbrタグに置換する ・段落末尾に\nをくっつけて結合する
ついでに、上を馬鹿正直に書いてみた。動かなかったらスマソ $val =~ s/\x0d\x0a|\x0d|\x0a/\n/g; @lines = split /\n\n+/, $val; @lines = map { '<p>' . $_ . '</p>' } @lines; @lines = map { s/\n/<br \/>/g } @lines; $result = join '', map { $_ . "\n" } @lines; 多分、これ一文で書けるよ
169 :
デフォルトの名無しさん :2007/10/24(水) 16:25:50
$x = $y if ! $x; これってどう解釈すればいいんでしょうか・・・ $yが真だったら$yが代入される $yが非だったら$xが代入される(値は変わらない) ってことで大丈夫ですか?
fedora7にperl5.005_03を入れたいのですがうまくいきません。 どなたか参考になるサイトもしくは手順等をお教えいただけないでしょうか。 宜しくお願いします。
>>169 $xが偽だったら$xに$yが代入される
$xが真だったらなにも行われない。
PerlってなんでPHPと比べて劣ってるの?
またお前か
またお前か 知ってるか、PHPって最初はperlで動いてたんだぜ
でっていう
嫌韓厨死ね
変数に固定のデータを読み込む方法として、 プログラム内で $data = '1234567890...'; とやるのと、普通にファイルから読み込むのとではどちらが効率が良いでしょうか? 前者の場合はデータの分だけコードが長くなるからメモリの効率悪くなったりするんでしょうか?
>>181 プログラム内にデータを埋め込む方が効率が良いということですか。
ありがとうございます。
ちょw
184 :
デフォルトの名無しさん :2007/10/25(木) 16:54:01
失われた年金データ5000万件も、 プログラムの中に埋め込んでおけば 効率的に照合処理できるに決まってる。
185 :
デフォルトの名無しさん :2007/10/25(木) 21:24:26
そのスクリプトでしか利用しない値ならどうでもいいが、 別のスクリプトでも利用する値なら置くべき場所に置いとく
データ埋め込んだコードをモジュール化しておけばおk
__DATA__
つーかさ。データがいーかげんなデータベースを整理するのって、 どーんとプログラム作りました→動かしました じゃなくて、perlでプログラム作りながら、データ見て、 またプログラムの手直し、データの改修を逐次的に処理していかないと。 戻り作業の繰り返しで話が前に進まないんだがな。 舛添の会見見ててこいつなんもわかっちゃねーなと思うのって俺だけか?
>>188 つーかさ、まずは己を知ることだと思うんだよ。
データを代名詞的に多用してるその文章見ただけでも、おまえ人並み以下だよ。
190 :
デフォルトの名無しさん :2007/10/25(木) 22:47:13
検収
>>188 どこにでもいるお馬鹿な客の一人。今さら言うまでもない。
おヴァカな客であっても、客をその気にさせるのがプロとしての生業♪
>>192 >客をその気にさせる
頭が悪いやつだな。
社会保険庁のトラブルは、客にいやなこと(「業務フロー上、将来禍根を残しますよ」)を
はっきり言わなかったのが原因だろ。現にトラブルがプログラマのせいにされている。
「その気にさせる」じゃまずい場合の典型事例だろうが。
社保庁システムのプログラマ(どうせコボラ)には、あまり親近感はないがね。
年金とか社会保険庁の話題はもういい Perlと全くかんけーねーし
社保庁もCPAN使えばいいのにな
196 :
デフォルトの名無しさん :2007/10/26(金) 00:56:24
ほんとは年金照合なんて正規表現つかえばイッパツで出来るんだが それだと毎年800億円もの受注が受けられない。 だからわざわざ回りくどい方法でシステムつくって 人月稼ぎしているんだよ。
ほ そ だ 人
【CGI名】 Joyful2ch-Me (060604)
【配布元URL.】
http://www.supra.cx/joyful2chMe/index.html 【設置サーバ】 ロリポップ
変数を追加したくて※Aを追加したのですが、文字化けしてしまいます。
どういった原因がかんがえられるのでしょうか?
# ライブラリ取込
require './jcodeg.pl';
require './cgi-lib.pl';
require './bbs-lib.pl';
require './config.cgi';
←ここにrequire .'./.'./○○.cgi';を追加したいのですが。(※A.)
※Aを追加せずに、改行を1つだけ加えてアップしても、文字化けします。
ちなみに、PC用の方は問題ないのですが、ケータイ用だけが文字化けします。
配布者の掲示板も機能してないみたいなので、
原因分かる方居られましたら、ヨロシクお願いします。
何故かずれてるorz ※Aは「require '../../○○.cgi';」の間違いです
すみません、他で聞いてきますorz
プログラミングPerl第3版のp264にあるmygrepのコードについてなんですが push(@result, $_) if &$coderef; の&$coderefはどういう意味なんでしょうか? 配列の各要素に対して、真か偽を返す関数だと思うんですが、 引数が渡されずに関数が呼び出されているように見えるんですが・・・
あああwみすw
>>202 本物の grep でも $_ にリストの各要素が入ってくるじゃないか。
例えば my @result = mygrep { /foo/ } 'foo', 'bar', 'foobar'; なら
sub mygrep (&@) {
my $coderef = shift; # sub { /foo/ }
my @result;
foreach $_ (@_) { # ('foo', 'bar', 'foobar')
push(@result, $_) if &$coderef; # if $_ =~ /foo/
}
@result; # ('foo', 'foobar')
}
206 :
202 :2007/10/28(日) 18:57:49
うーん。 if &$coderef; が、どうして # if $_ =~ /foo/ と解釈されるのかがよくわからないですorz 括弧をつけずに関数を呼び出すと@_が引数としてわたされるとしても その内容にアクセスするには$_[0]と書かないといけないですよね。 でも実際には$_とfooがチェックされてるわけで、この$_の値が どっからきたのかがわからないんです。
207 :
デフォルトの名無しさん :2007/10/28(日) 19:24:26
わからんなら無理して分かる必要は無いよ。 自分が分かるように書けばよろし。 誰か別人が書いたコードを無理やりメンテさせられるのなら仕方ないが。 そんときは、自分でわかるように書き換えるな。俺なら。
>>206 > foreach $_ (@_) {
この $_ は foreach ブロック内に局所化 (local) されてはいるけど
グローバル変数なんだからそのまま &$coderef 内でも参照できる。
$_ = 'quux';
my $coderef = sub { print ucfirst };
$coderef->() for qw(foo bar baz); # FooBarBaz
$coderef->(); # Quux
alarmの多重化ってできませんか? use threadsを使って複数のスレッドを起動させているのですが、 そのスレッド毎にタイムアウト処理を作りたいのですが、うまくいきません。
>>209 作りなおして全部POEにぶちこんだ方が良い悪寒
211 :
至急 :2007/10/31(水) 18:53:18
CGIを自宅出張でサポートしてくれる方募集します。 CGIに詳しく都内に来れる方であれば可能 詳しい人からすればそこまで難しくないと思われます。 一日日払い即金である程度払います。。 詳細はメール下さい。
WebProgにも書き込みしてある件
>>210 情報ありがとうございます
POEを使う方向で考えてみます
> 作りなおして全部POEにぶちこんだ方が良い悪寒 POE を作り直してくれないか。
216 :
デフォルトの名無しさん :2007/11/01(木) 15:39:13
&foo; sub foo{ my @l, %h; print '"'.$h{'ex'}.'"=>'; $h{'ex'} = &bar(1,2,\%h); print '"'.$h{'ex'}.'"=>'; $h{'ex'} .= &bar(1,2,\%article_replacements); print '"'.$h{'ex'}.'"'; } sub bar{ my $a = $_[0], $b = $_[1], %h = %{$_[2]}; return 'A'; } というプログラムについてなのですが、fooの1行目が my %h, @l;だと""=>"A"=>"AA"と表示され、 my @l, %h;だと""=>"A"=>""と表示されます。 変数の順番を入れ替えただけで結果が変わってしまうのは なぜなのでしょうか? Perlのバージョンはv5.8.8 built for MSWin32-x86-multi-threadです。
217 :
216 :2007/11/01(木) 15:42:38
動作に影響は及びませんが、fooの3行目と5行目は $h{'ex'} = &bar(1,2,\%h2);です。すいません。
218 :
216 :2007/11/01(木) 15:43:42
sage忘れた上に$h{'ex'} .= &bar(1,2,\%h2);です。 本当にすみません…。
>>216 > 変数の順番を入れ替えただけで結果が変わってしまうのは
> なぜなのでしょうか?
変数の順番を入れ替えただけだと決めつけてる時点で、君はすでに敗北しているのだ。
>>216 my $foo, $bar; は my($foo), $bar; であって my($foo, $bar); ではない。
()を取りすぎたな
use strict; use warnings; をつけろ 話はそれからだ
>>216 >my $a = $_[0], $b = $_[1], %h = %{$_[2]};
my ( $a = $_[0], $b = $_[1], %h = %{$_[2]} ) ;
と判断しても、
( my $a = $_[0], my $b = $_[1], my %h = %{$_[2]};
と判断しても、、、
この前もどっかのスレで見たが、こんなトンチンカンな書き方を何処で
覚えてくるんだろう?後者は strict, warnings が通ってしまうから
なおさら、、、
この後インタプリタに文句を付けるに一票
225 :
216 :2007/11/01(木) 18:47:04
なるほど、そういう解釈を受けてたのですね。 C言語でいうint a, b;と同じ扱いだと思っていました。 お恥ずかしい限りです。ありがとうございました。
>>223 他の言語から来た奴だと結構ありがちかと。
227 :
デフォルトの名無しさん :2007/11/01(木) 22:21:15
ttp://www.traders.co.jp/investment/tool/futures/futures_top.asp このページの先物取引情報っていう表の部分だけ取り出して、
エクセルに保存するスクリプトを書いているんですが、
「ページを解析して表だけHTMLごと取り出す処理」がなかなか上手くいきません。
TreeBuilder使ったのですが、
@このページのHTMLタグ内にはclassもidもないので、
特定のtableタグをとってくる事ができない。
A加えて、TreeBuilderを使うとHTMLタグが取り払われてしまう(?)
っていう問題で苦戦してます。
どなたかこの部分のやり方を教えていただけると助かります。
>>227 無理に型に嵌めた作り方しなくても、
「TOPIX NET 」という文字が出てきたらフラグ立てて、
次の<tr>から</table>までを抜き出せばいいだけじゃないの?
とりあえず強引に取り出せばいいんじゃないの? あれこれ考えるより、とりあえず手を動かしてうまくいったら結果オーライってことで。 どうせスクレイピングなんてページの仕様が変わったらそれまでなんだし。 my $page = ここに目的のページコンテントを入れる my $tree = HTML::TreeBuilder->new_from_content($page); # とりあえず会社名に一番近いタグを目印に my @companies = $tree->look_down(_tag=> "td", bgcolor => '#CCCCCC'); my $i = 1; my @table; for my $co (@companies) { #奇数番目に関係ない要素がはいりこんだのでオミット $i++ % 2 and next; my $co = $co->look_up(_tag=>"tr"); my $co_text = $co->look_down(_tag=>"font")->as_text; my @data = map { $_->as_text } $co->look_down(_tag => "div"); push @table, [ $co_text, @data ]; } $tree->delete;
miyagawa プロダクツでもつかってろ。
KENTって人のサイトがとても役に立つのがわかった
KENTのコードは間違ってはいないのだが、 Perlっぽくない気がする。 C臭さがプンプンしていて、どうも違和感が。
234 :
デフォルトの名無しさん :2007/11/02(金) 22:12:17
だったら自分で「Perlっぽいコード」を書いて公開すればイイジャン! 文句言うだけなら子供でも言える。
236 :
デフォルトの名無しさん :2007/11/02(金) 22:28:12
で?キミはいったい、どんな「Perlらしいコード」を書けると言いたいんだい? おや、見せられないのかい?恥ずかしくて他人には見せられないの? へぇ。そう。 だったら他人のコードを批判する資格はまったく無いね。
Perl4時代ならいざ知らず現在kentが垂れ流してるコードがうんこなのは周知の事実 Perlらしいとかそんな次元の話じゃないだろ
238 :
デフォルトの名無しさん :2007/11/02(金) 23:03:28
で? 早く「Perlらしいコード」とやらを見せてくれよ。
/ニYニヽ (ヽ /( ゚ )( ゚ )ヽ /) (((i ) /::::⌒`´⌒::::\ ( i))) でっていうwwwwwwwww /∠_| ,-)___(-, |_ゝ \ ( ___、 |-┬-| ,__ ) | `ー'´ /´ | /
自分じゃ鋭い追求してるつもりなんだろうが、 哀れなほど孤軍奮闘だなw
久しぶりにKENTのコード見てみたら &jcode'convert(*line, 'sjis') でなく &jcode::convert(\$line, 'sjis') な記述になってるし flock(FH, 2) してるし、もうびっくりですよ。
242 :
デフォルトの名無しさん :2007/11/02(金) 23:46:09
perlらしいコードってあれだろ? カートゥーンのキャラクターがぼやいてるようなやつ
243 :
デフォルトの名無しさん :2007/11/03(土) 00:14:12
マウスの付いたパソコンしか触ったことの無いヤツが必死でほざいてるよ〜
KENTってハゲオヤジだよ
245 :
デフォルトの名無しさん :2007/11/03(土) 00:51:44
>>244 へ〜〜〜知らなかった〜〜〜!
そうなの、初めて知ったよ。
よく知ってるね、キミって情報ツウ?。すごいよ物知り博士だよ。
ネ申!ホトケ!天神まさ!ダイバダッタ!尊氏さまだよ!
なんか浮いてる奴がいるな
KENT=ハゲオヤジのソースは日経ソフトウェア 誰かと対談してて顔写真が載ってた
249 :
デフォルトの名無しさん :2007/11/03(土) 01:43:01
>>248 へ〜〜〜すご〜い!
何でも知ってるんだね、物知りだね。
日系ソフトウエア読んでるだけでも自慢できるよ。
こんなクソスレにネ申が現れようとは!
何事かと思ったらまたお前か
天神まさ
社労士だから、本業ついでに営業できていいよね。 あたまいいねー。
>>228 なるほど、とてもシンプルで分かりやすい方法ですね。
ぜひ試してみようと思います、ありがとうございます。
>>229 ソースまで書いていただいてありがとうございます。
とても参考になりました。
一つ質問なのですが
$co->look_down(_tag => "div");
この部分はtrタグの中の一つ目のdiv(225 BUY)しか抽出できないんですよね?
for my $attr ( $co->look_down("div") ){
@data = $attr->as_text."\n";
}
という感じで全てのデータ(225 BUY,225 SELL〜)を抽出しようと思ったのですが、
エラーになってしまいました。
良い方法があれば教えていただけると幸いです。
C言語で言う #ifdef WINDOWS のようなものはあるでしょうか? WindowsとLinuxで共通に動くプログラムを作ろうと思っています。 fork()周りがOS依存になってしまうので、Windows/Linuxで処理を分けたいです。
$^Oみたいな?
256 :
perl 修行中 :2007/11/03(土) 20:14:38
2007-10-16 21:55:38 という日付のフォーマットを Sat, 03 Nov 2007 18:40:13 +0900 というフォーマットに変換したいと 思っているのですが見つかりません。 便利なパッケージとかないのでしょうか
標準パッケージ
use DateTime::Format::HTTP; my $dt = DateTime::Format::HTTP->parse_datetime("2007-10-16 21:55:38"); print DateTime::Format::HTTP->format_datetime($dt);
259 :
254 :2007/11/03(土) 20:40:42
>>255 まさにこれです!
Linuxで実行:linux
WinXPで実行:MSWin32
となりました。ありがとうございました!
260 :
デフォルトの名無しさん :2007/11/04(日) 02:16:21
\(^O^)/
>>253 リストコンテキストなら同一ノード内の全div要素、スカラーコンテキストなら最初の要素のみ。
要素が見つからないなら、as_textメソッドを呼び出したときにエラーが出るだろうな。
for文を回して連続した数字を表示するときに、 桁の数をそろえる方法ってありませんか? 具体的に言うと 0 1 2 … 10 … 100 ではなく、 000 001 002 … 010 … 100 のようにしたいのですが。
>>263 '001' .. '100'
とかできたような気がする。
>>263 foreach (0 .. 100) {
printf qq(%0.3d\n), $_; # 数字を他の文字列等とコンカチしたいときはsprintfで
}
268 :
デフォルトの名無しさん :2007/11/05(月) 21:19:20
すでに回答が出て解決してるのに、なんでダラダラ引っ張るんだ? やっぱ Perl 使いはアホばっかだな。
またお前・・・じゃないみたいだな
270 :
デフォルトの名無しさん :2007/11/05(月) 22:26:51
sort { $a->[3] cmp $b->[3] or $a->[5] <=> $b->[5] or $a->[8] cmp $b->[8] } @array こんな文があったとします。 これをユーザの入力によって $a->[8] cmp $b->[8]を一番先に持ってきたり( sort { $a->[8] cmp $b->[8] or $a->[3] cmp $b->[3] or $a->[5] <=> $b->[5] } @array )、$a->[5] <=> $b->[5]を一番先に持ってきたりしたいのですが どのようにすればいいでしょうか?
すみません。PerlのVerは5.00503で、 モジュールは使えません。
>>270 sort block はその名の通りblockなんだから、条件式埋め込めばいいだけじゃん?
手抜きの例を書くと
my $i = 1 ; # $i を他の数字にしてみる。
my @arr = sort {
if ( $i == 1 ){ $a->[0] <=> $b->[0] or $a->[1] <=> $b->[1] }
else { $a->[1] <=> $b->[1] or $a->[0] <=> $b->[0] }
} ( [1,2],[2,3],[2,1] ) ;
>>270 各々の順序関数を @funcs に格納して、
評価する順序を変えたいときは @funcs を並び替えればいいんじゃね?
@funcs = (
sub { $a = shift ; $b = shift ; $a->[3] cmp $b->[3] },
sub { $a = shift ; $b = shift ; $a->[5] <=> $b->[5] },
sub { $a = shift ; $b = shift ; $a->[8] cmp $b->[8] }
) ;
@array =
sort {
&{ $funcs[0] }($a, $b)
or
&{ $funcs[1] }($a, $b)
or
&{ $funcs[2] }($a, $b)
} @array ;
おいらの頭では、比較演算子がorで繋がっている趣旨がわかんない(´・ω・`) 入力によってsortを選択(択一)にするのなら判るけれども。。。
>>274 a or b は aが偽のときにbを返す。
即ち、一個目のcmpが0を返したときに、次の評価が行われるようになる。
#!/usr/bin/perl -w use strict; my @order = @ARGV; my @data; chomp, push @data, [ split /\|/ ] while <DATA>; my %cmp = ( by_title => '$a->[0] cmp $b->[0]', by_author => '$a->[1] cmp $b->[1]', by_year_asc => '$a->[2] <=> $b->[2]', by_year_desc => '$b->[2] <=> $a->[2]', by_price_asc => '$a->[3] <=> $b->[3]', by_price_desc => '$b->[3] <=> $a->[3]', ); my $code = join ' or ', @cmp{@order}; local $" = '|'; print map "@$_\n", eval "sort { $code } \@data"; __DATA__ Regular Expression Pocket Reference, Second Edition|Tony Stubblebine|2007|14.99 Mastering Perl|brian d foy|2007|39.99 SQL Injection Defenses|Martin Nystrom|2007|9.99 Mastering Regular Expressions, Third Edition|Jeffrey E. F. Friedl|2006|44.99 Building Tag Clouds in Perl and PHP|Jim Bumgardner|2006|9.99 Perl Hacks|chromatic, Damian Conway, Curtis Poe|2006|29.99 Intermediate Perl|Randal L. Schwartz, brian d foy, Tom Phoenix|2006|39.99 Wicked Cool Perl Scripts|Steve Oualline|2006|29.95 Perl Testing: A Developer's Notebook|Ian Langworth, chromatic|2005|29.95 Learning Perl, Fourth Edition|Randal L. Schwartz, brian d foy, Tom Phoenix|2005|39.95
なぜか
>>263 に礼言われてる
>>265 宛て。
お題は
>>256 のとおり JST(+0900) で吐きたい、みたいなのよね。
HTTP::Date::time2str () は GMT でしか吐いてくれなかった気がする。
最近は Date::Format 使ってる。
過去に書いたコードを発掘したら use POSIX qw(strftime); と書いてるのもあると思う。
279 :
perler :2007/11/06(火) 12:15:22
DBIについての質問です。 perl + MySQLを使用しています。 MySQLにinsertする際にこれまではMyISAMを使用していましたが、 都合によりInnoDBを使用することになりました。 そうした場合、MyISAMでinsertできていたソースがInnoDBに変更したら使用できなくなってしまいました。 何か違いがあるのでしょうか。 以下ソース。 my $sth = $dbh->prepare("INSERT user SET USER_NAME='ドコモ', MAIL='docomo', PASS='1234567';"); $sth->execute();
>>279 Perlの問題というよりも、MySQLの設定がマズイような気がしますが。
Perl-DBI以外のクライアントでMySQLに接続して、INSERTできてます?
それとexecuteの後に、エラーが発生するんだと思いますが、
エラーメッセージには何と書かれているのでしょうか?
プレースホルダくらい使って欲しいなぁ。
282 :
perler :2007/11/06(火) 13:46:07
申し訳ありません。 自己解決しました。 コネクションを取得時にオートコミットをオフにしていて、 コミットをしていなかった為でした。 皆様ありがとうございました。
283 :
デフォルトの名無しさん :2007/11/06(火) 14:50:35
上げて書き込む奴は大抵馬鹿だからすぐ分かるな
285 :
941 :2007/11/06(火) 22:55:41
perlでバイナリーファイル→画像ってできますか? 指定したURLからjpgをbinmodeでファイルに書き込むまでは出来たんですが それを.jpgになおせません・・・何を言ってるか自分でもわかりませんが いい方法は無いでしょうか?
941は関係ないです・・ごめんなさい
意味が分からんけどどうやってjpgのデータを取ってきてどうやって書き込んだのさ ただ単にネット経由で画像とってきて保存したいだけなら my $ua = LWP::UserAgent->new; $ua->mirror($url, $filename) だけでもできるよ
ほんとに意味わからなくてごめんなさい
とりあえず自分で作ったソースの一部なんですがこんな感じで画像は
やはり取れないんでしょうか・・
print $client_socket "GET
http://7art-screensavers.com/screenshots/animals/lion-and-the-lamb.jpg HTTP/1.0\r\n";
print $client_socket "Host: www.clinko.com\r\n";
print $client_socket "\r\n";
while (<$client_socket>){
print $_;
m/^\r\n$/ and last;
}
$file="sample.jpg";
while (<$client_socket>){
binmode(STDOUT);
$all=join("",<$client_socket>);
open(FILE, "> $file");
binmode(FILE);
syswrite(FILE,$all,length($all));
close(FILE);
}
最終的にはイメージ検索のAPIでもってきたXMLからXML::Simpleモジュール とかつかってjpg画像を指定した落としていきたいんです・・説明へたくそ でごめんなさい
>>289 バイナリデータをreadlineで読むなよ
readlineってなんですか?無知でごめんなさい
LWP::UserAgent使えよ
デバッグくらいしろよ
ActivePerlいれたら起動しなくなりました。 どうしたらいいんでしょうか
296 :
デフォルトの名無しさん :2007/11/07(水) 01:17:40
何が?何が起動しないんだよ。人にものを話すときは、 主語述語きちんと言いなさい。学校で習わなかったかな?5W1Hって。
ActivePerlをインストールしたら OSが起動しなくなりました。 Windwosロゴまでは表示されますが その後真っ暗です。 セーフモードでの起動は出来ます。 復元でActivePerlインストール前にもどれば起動は出来ましたが ActivePerlを使いたいのです、
298 :
デフォルトの名無しさん :2007/11/07(水) 01:24:48
use Encode; use Encode::Guess qw/ gbk euc-jp shiftjis/; opendir (DIR, '.'); @files = readdir DIR; foreach $dir(@files) { print $dir; open (IN, "<$dir"); open (OUT, ">$dir-2"); while (<IN>) { Encode::from_to($_, 'guess', 'Shiftjis'); print OUT; } close IN; close OUT; } opendir (DIR, '.'); @files = readdir DIR; foreach $_(@files) { $old = $_; s/-2//; rename ($old,$_); } 初心者なもので無駄が多すぎてお恥ずかしいのですが。。。 フォルダ内にあるテキストファイルの文字コード(EUC・Shiftjis・BGなどバラバラ)を自動判別して全てshiftjisに変換したいのですが shiftjis or euc-jp or cp936 at C:/Perl/lib/Encode.pm line 186 とエラーがでます。 'guess'の部分を''gbk'とかに指定すればちゃんと変換されるのですが、それだと他コードのファイルが文字化けします。 どうすればいいでしょうか・・・?
300 :
デフォルトの名無しさん :2007/11/07(水) 04:08:16
>>297 インストールオプションで、Perl 本体と PPM ”だけ” インストールしてみてはどうだろう。
ISAPI とか PerlEX とか PerlScript とか、(必要が無ければ) チェックをははずしてみる。
うまくいくかどうかわわからんが、成功を祈る。
>>297 OSって Windows の何?XP?Vista?
サービスパックのバージョンは?
>>300 だめでした。
なんとか復元3回やってまた戻しました。
OSはXPのSp2です。
一応復元する前にPerlのファイルを別途保存してみたので
それを使って目的のことが出来ないかやって見ます。
303 :
デフォルトの名無しさん :2007/11/07(水) 22:48:10
Solaris10のsyslog(ログローテートしている)で そのsyslogの作成日が本日だった場合にはsyslogに任意の文字列を記述し、 本日でなかった場合には何もしない、という処理をさせたいのですが どうしたらよいでしょうか?
304 :
デフォルトの名無しさん :2007/11/07(水) 23:40:27
>>302 基本的にさ、perl のファイルさえあればOKなんよ。
あとは環境変数 PATH に perl のディレクトリを加えたり、
拡張子 .pl を perl.exe に関連付けしてるだけだから、
もし Active Perl のインストーラでうまくいかないんだったら
これらを手動でやっちゃえばOK・・・なハズ。
PATH とか 拡張子の関連付けとか、具体的なやりかたが分からなかったら
また質問してね。
305 :
デフォルトの名無しさん :2007/11/07(水) 23:44:24
>>303 ファイルの日付は stat 関数、
ファイル名変更は rename 関数を使う。
それぞれの使い方は google で調べてね。
306 :
デフォルトの名無しさん :2007/11/08(木) 04:27:04
456,657,787,455,… のように数字が横に並んだファイルがあるのですが 456−657,657-787,787-455,…というような前後の差分を とったファイルを出力するにはどうしたらいいでしょうか? ファイルを読み込んで、そのデータをfor文で差分をとっていけばいいと思うのですが 例えば456や657をどのように指定するかがわかりません。 指定する方法がわかればそれをひとつずつずらしていけばいいと思うのですが・・・ お手数ですが、どなたかヒントをお願いいたします。
@nums = (456,657,787,455); for $i (0..$#nums-1) { print $nums[$i] - $nums[++$i]; }
308 :
306 :2007/11/08(木) 06:22:40
>>307 さんわかりやすいプログラムをありがとうございます。
まずリスト変数にその数字をいれて指定できるようにして
そしてそのリスト値を最後のから一つ前まで代入して差分できるようにするということですね。
回答していただき感謝しております。
それと今回はその要素(456、657など)が一万個くらいあるのですが
その場合は直接リスト変数の要素として入れるわけには行きませんよね?
よろしければその場合もお教え願えませんか?
その一万個の数字のファイルを読み込んだあとにどのようにして
一万個の数字を指定して差分を求めればいいかがわからないのです・・・
>>307 も「そこから」だとは思ってなかったと思う。
my $data = '456,657,787,455';
my @nums = split(/,/, $data);
ファイルからリストに読み込む方法が分からないってこと? なんかメモリ上に1万個の要素を入れるのがマズいとも読み取れるけど・・・。 open my $in, "UNKO"; my @nums = split(/,/, do { local $/ ; <$in> }); close $in; とでもすれば。
do {local $/=","; <$in>} これでいいか。
312 :
306 :2007/11/08(木) 06:46:29
>>309 丁寧にありがとうございます。
>>310 その通りです。一万個の数値を直接プログラムに入力するのはまずいかなと思いまして。
日本語に至らないところがあり申し訳ありませんでした。
ありがとうございます!
,に対応してそれぞれの値が区切られてリスト変数の要素としてとして
認識されていくというわけですね。
丁寧な指導ありがとうございます。おかげでリストに読み込む方法がわかりました。
313 :
298 :2007/11/09(金) 00:44:58
>>299 リンク先読んで試行錯誤しましたが、できませんでした・・・
どなたか直接手直ししていただけませんか
もしかしたら文字コードの自動認識って 「失敗」することがあるもんだって、 知らないで使っているのでは。
316 :
306 :2007/11/09(金) 03:58:26
質問ばかりで申し訳ないんですが 11,22,33,44,55,66 というリストを 11,33,55 22,44,66 というように二つのリストに分けるという作業はどうしたらいいのでしょうか・・・ substrとfor文で一つ置きに抽出しようとも思ったんですが++ではなく一個置きに するというプログラムがわからなくて・・・ そもそもここでsubstrを使おうとすること自体間違っている可能性が高そうですが。
substrじゃなくてsplitすれば? 1個置きはループカウンタが奇数か偶数で分岐すればおk
318 :
デフォルトの名無しさん :2007/11/09(金) 04:37:04
(・∀・)ニヤニヤ
320 :
306 :2007/11/09(金) 06:31:59
なるほど、また一つわかりました。ありがとうございます。 つまり @data = (11,22,33,44,55,66); for($i=0;$i<=$#data;$i++ ){ if ($i % 2 == 0){ push @kisuu,"$i"; } elsif ($i % 2 == 1){ push @guusuu,"$i"; } } print @kisuu; print @guusuu; のようにすれば奇数グループと偶数グループを分けることができるというわけですね。
321 :
306 :2007/11/09(金) 06:32:38
>>316 リストの先頭から1個ずつ取り出して出力先のリストにかわりばんこに
プッシュすれば良い。
323 :
306 :2007/11/09(金) 08:08:19
>>322 ありがとうございます。おかげさまでデータを分けることができました!
あと
2,3,2,3,2,3,2,3,…と並んでいるdata.txtがありその差分を
出したいために以下のプログラムを作ったんですが
本来なら結果が
-1,1,-1,1,-1,1,-1,…という風に1番目から2番目を引いた結果、2番目から3番目を引いた結果を
出力するつもりだったのが
1,1,1,1,1,1,1,…という風に1番目から2番目を引いた結果、3番目から4番目を引いた結果と出力されてしまいます。
どこがおかしいのでしょうか?
open IN, "data.txt";
open OUT, ">sabun.txt";
while (<IN>) {
@all = split(/\,/,$_);
for($i=0;$i<=$#all-1;$i++ ){
$kekka = $all[$i] - $all[++$i];
print OUT $kekka,"\n";
}
}
close IN;
close OUT;
324 :
306 :2007/11/09(金) 08:24:44
すいません、自己解決しました! for($i=0;$i<=$#all-1;$i++ ) を for $i (0..$#all-1) にしたらうまくできました。 しかしこの二つの文は僕には同じようにしか見えないんですがどこが違うんでしょうか。。。
同じです
326 :
306 :2007/11/09(金) 08:49:01
>>325 でもなぜか
for($i=0;$i<=$#all-1;$i++ ) だと
(2-3),(2-3),(2-3),(2-3),…となって一個飛ばしの差分にしまったんです。
for $i (0..$#all-1) だとちゃんと
(2-3),(3-2),(2-3),(3-2),(2-3),…となりできるんですが。
>>326 だって、まず
$kekka = $all[$i] - $all[++$i];
のケツの部分で一回インクリメントされて、そのあと
for($i=0;$i<=$#all-1;$i++){
のケツの部分でもう一回インクリメントされてるわけだから。
>>324 数をカウントアップしてるのと、数列を順に入れてる という違いだが
基本的に同じ。 ってかカウンター変数触んなよ。バグの元凶だ。
329 :
306 :2007/11/09(金) 10:17:35
>>327 二重にカウントされてるようなものってことですね。ありがとうございます。
>>328 for文の後ろの方いじるとまずいんですね、知りませんでした。
if文などでなんとかしたほうがいいということですか?
皆さんあと一つだけ知恵をお貸しください… suuji.txt というファイルがありまして中身が
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, ←ここで改行してある
21,22,23,24,25,26,27,28,29,30
というものなんですが、これを偶数と奇数に分けたくて、まず偶数を出力するために以下のプログラムを
作ったんですが、出力結果が
0,2,4,6,8,10,12,14,16,18,20,0,2,4,6,8,10,12,14,16,18,20,21,23,25,27,29,
となってしまい
「1行目が2重に含まれている」
「2行目からずれてしまっている」という二つのわからない点が出てしまいました。
何度もしつこいですが、どうか考え方をお教えください・・・
open IN, "suuji.txt";
open OUT, ">guusuu.txt";
while (<IN>) {
@all = split(/\,/,$_);
for $i (0..$#all){
if ($i % 2 == 0){
push @guusuu,"@all[$i]",",";
}
elsif ($i % 2 == 1){
push @kisuu,"@all[$i]",",";
}
}
print OUT @guusuu;
}
close IN;
close OUT;
>>329 > 二重にカウントされてるようなものってことですね。
ようなもの、じゃなくて、二重にカウントされてるんだよ。
言葉尻を捉えた突っ込みに思うかもしれないけど、ここで曖昧さを排除することは凄く重要だよ。
君の目と意識が、ハッキリ「二重にカウントしてる」のを捉えるまで、わかった気になっちゃダメ。
> for文の後ろの方いじるとまずいんですね
よくわからないうちに相手の意見を「自分流に言い換える」のも危険だよ。
カウンター変数ってのはこの場合$iのことで、この$iの中身を「ループ内部で」書き換えるのは混乱の元だ、という話。
ループの内部でこの値を変更するというのは、「ループ内部から見ると、$iは毎回1ずつ増えて降ってくる
絶対的なものに感じられる」というある種の信頼を崩すということで、これは本当に混乱する。
事実、君はその信頼に囚われて、たった2行なのに原因を見つけられなかったでしょ?
だから、君の解釈であるところの「for文の後ろの方いじるとまずい」は正反対だ。for文の後ろでしかいじっちゃいけない。
これも、「よくわかんないけど、とにかくカウンター変数はfor分の最後でいじれということですね」とか
曖昧な解釈で終わっちゃダメだからね。何故そうすべきなのか、納得するまで考え込むように。
> 出力結果が > 0,2,4,6,8,10,12,14,16,18,20,0,2,4,6,8,10,12,14,16,18,20,21,23,25,27,29, > となってしまい いや、なってないから(*1)。 突っ込むところは複数あるんで、書くのが面倒だな・・・。とりあえず、 (1) suuji.txtの1行目の終わりに","が付いていて、且つ、末尾の改行を除去していないので、 @allに最初に入るのは、1から20までと「空白+改行」の、全21要素である。 (2) だから2行目に入ると、奇数偶数が入れ替わる。 *1 というか、$add[n]の中身がn + 1なので(ややこしい)、君の言うようには出力されない。 (3) push関数は「@allの後ろにどんどん要素を追加していく」だけでクリアなんかしないわけだから、 1行目の処理の時に詰め込んだものが2行目の処理の時に残っているのは当然。 前のカウンター変数の時もそうだけど、君自身は毎回のループ処理を独立させて捉えているのに、 君の書くコードは「次のループに影響する何か」をいちいち残していってる。それが混乱を生んでる。 (4) @all[$i]という書き方は「配列スライス」といって、この場合たまたまスカラーを取り出してるような 結果になってるだけ。$all[$i]と書くべき。「スライス」をキーワードにして調べるように。 あたりは絶対に直さないとダメ。他にも「よりよい方法に変えるべき」点はあるけど、書ききれない。
教えてください ある文字列内に含まれている [−] (半角スペース,半角[,全角マイナス,半角],半角スペース) を削除したいため、置換演算子でコードを書いてみましたが、 ]が残ったり、なぜか'|'に変換されます。 その1 $aaa =~ s/\s\[−\]\s//ig; その2 $aaa =~ s/\s\[\−\]\s//g; その3 $aaa =~ s/ \[\−\] //g; その4 $aaa =~ s' \[−\] ''; など (修飾子と区切り文字列の組み合わせは他に試していますが、 すべての組み合わせを実行していません) よろしくお願いします。
>>332 ソースファイルを保存するとき、文字コードは何にしてます?
>>329 無駄が多い気もするけどこんな感じか?
use strict;use warnings;use IO::File;
my $IN_FILE = 'data.txt';
sub open_or_die {IO::File->new( $_[0] ) || die("$_[0]:$!")}
sub slurp {local $/;my $fh = open_or_die($_[0]);<$fh>}
my @all = (my $data = slurp($IN_FILE)) =~ /([-\d]+)/g;
my @R = ([],[]);
push(@{$R[$_%2]},$_) for @all;
printf "偶数:%s\n",join(',',@{$R[0]});
printf "奇数:%s\n",join(',',@{$R[1]});
335 :
332 :2007/11/09(金) 14:25:40
>333 SHIFT-JISです。
337 :
306 :2007/11/09(金) 15:07:14
>>330 ご指摘ありがとうございます、そういうことだったんですか。ループ中の
[]の中に++を使うと確かに意味がわかっていませんでした。
>>331 アドバイスありがとうございます。
まず、以下のプログラムによって、改行+,を 改行にして「途中からずれる」という問題は解決できました。
open IN, "suuji.txt";
open OUT, ">suujikai.txt";
while (<IN>) {
s/,\n/\n/g ;
print OUT $_;
}
close IN;
close OUT;
>push関数は「@allの後ろにどんどん要素を追加していく」だけでクリアなんかしないわけだから
1行目の処理の時に詰め込んだものが2行目の処理の時に残っているのは当然。
>「次のループに影響する何か」をいちいち残している
この次のループに影響する何かというものを教えていただけませんか?
自分ではsuuji.txtの1行目の偶数を@guusuuに出力、その後2行目の偶数を@guusuuに出力しているつもりなのですが
どうしても1行目の偶数を出力、その後1行目と2行目の偶数を出力という風に2重に出力してしまいます・・・
338 :
306 :2007/11/09(金) 15:18:32
>>334 わざわざプログラムを作成していただきありがとうございます。
しかし申し訳ないのですがプログラム初心者の私には、少々高レベルで理解できません・・・
レベルの低い質問で申し訳ないのですが、よろしければ二重に出力される原因を教えていただけたら幸いです。
334とは別の人間だが。
>>338 print OUT @guusuu;
がwhileの中にあるのがマズイんじゃね?
closeの後に@guusuuを出力するようにしてみ。
改行なんかより、配列のインデックスの奇数偶数を評価してるところとか、 ループ中で作った配列をクリアしないで回してるところとか、 そういう本質的な間違いに気がつくべきだと思うな。 だいたい初心者なら、まずデータをコードに埋め込んでプログラムするもんだろ。 あと、chompつかえよ。
>>337 > 自分ではsuuji.txtの1行目の偶数を@guusuuに出力、その後2行目の偶数を@guusuuに出力しているつもりなのですが
つもりとか言ってないで、調べろよ。想像していないで、どうなっているのかいちいち調べろ。
課題を熟考するのはいいことだが、出てきた疑問点に 他の人から答えをもらおう って所が見込み無い。 課題をこなしてる意味もあんまない。
344 :
デフォルトの名無しさん :2007/11/09(金) 16:47:00
最近はフローチャートとか学ばないんかね。
俺はフローチャートを習った覚えはないな。
しかも人の話を全然聞いてないし。 (なんでこの一連の流れでまだ「二重に出力される理由」がわからんのよ)
>>334 ([-\d]+)は(-?\d+)のほうがいいね。
>>338 >しかし申し訳ないのですがプログラム初心者の私には、少々高レベルで理解できません・・・
人のソース読むのも勉強だし
自分で作ったコードと比較して何が悪かったのか調べるのも勉強だと思うぞ
>>337 おまえもう工場のライン工やっとけ。
出来た製品二重に流すんじゃねーぞ。
なんだかみんな手厳しいな。 「偶数奇数が‥‥」って言っている時点で 厨房か工房あたりだろうにw
3日ぐらいひとりで考え込んだほうがいい 質問スレは便利だけど、もらえるのはヒントだけ 結局考えるのは自分自身なのだ
ワロタ
答えてやりてえけど、どこから答えたらいいのかさっぱりわからん。
>>349 もし本人がいい大人だったら、一番手厳しい意見だw
後の二重出力分野における創始者である
355 :
306 :2007/11/09(金) 17:49:45
皆さんお騒がせしてすいません。
昨日からperlというかプログラムを初めて勉強しはじめたので
ずいぶん低レベルなレスをしてしまったと思われます。。。
工場のラインを避けるべく、今日も徹夜でperlを勉強しようかとおもいます。
>>339 さん、ありがとうございます。その通りでした。
>>341 修正するごとに実行してるんですがそれでもわからなかったので・・・
>>348 先生、ホワイトカラーの仕事がしたいです・・・
>>350 このスレの皆さんからとても貴重なアドバイスがいただけました。
>>352 ありがとうございます。次回の書き込みからはもっと明確な言葉を使うようにします。
明確な言葉というよりも、むしろ自分自身で何を考えてるか分かってないんじゃないの。
357 :
デフォルトの名無しさん :2007/11/09(金) 18:10:21
フローチャートを知らない世代がこれからの日本のIT界をしょって立つのか。 なんだか恐ろしいな。 こんなことだからシャホチョーの5000万件漏れが起きるんじゃないのか?
フローチャート厨(笑)
>>357 しらんがな。
しかもシャホチョのはフローチャート世代だろうに
冷静な突っ込みに吹いた でも仕様書用にフローチャートは書けたほうがいい 細かいプログラムにいちいち書いてらんねーけど。
このくらい小学生でも書ける奴は書けるんだがなぁ…
「貴様・・・自分が何をやっているか、わかっているのか!」 なんて台詞がよく漫画にあるけど、フローチャートはまさにそこんところの証明兼、説明手段。 ただ、書かないと自分のやっていることがわからない、ってわけではないし、 ある程度の経験者なら、自分が今「書こうと思えば書ける」状態なのか否かは、自己診断できる。 だから、書けることは大事だけど、古い人が口にするような重みは無いな。
ラリー「フローチャートなど使うプログラマは池沼」
364 :
デフォルトの名無しさん :2007/11/09(金) 19:53:43
実際に紙にフローチャートを書くか書かないかという問題ではなく
フローチャートさえ書けないのか?って事。
紙に書きたくないなら頭の中に書いてもいい。
でも、頭の中にでさえフローチャートが書けないようじゃヤバイだろ。
基本中の基本だろ?
>フローチャートなど使うプログラマは池沼
これは、フローチャートを卒業して、次のステップに進んだ者が言うセリフだよ。
>>328 のようなおかしなコードを書く初心者には
自分の考えを確認する意味でも、図に書いてみるのは大切な事。
フローチャートの図形の意味を試験に出されたときには閉口しました
今時フローチャートなんか中学校の情報の授業でさえ習うのに
367 :
306 :2007/11/09(金) 20:20:37
すいません、質問させてください。 x成分の速度データが入った「a.txt(中身は1,1,1,1,とする)」、 y成分の速度データが入った「b.txt(中身は2,2,2,2,とする)」があって 二つの成分を合わせた速度データを作成することは可能でしょうか? 仮にそれをc.txtとすると中身は{(1^2+2^2)^0.5},{(1^2+2^2)^0.5},{(1^2+2^2)^0.5},{(1^2+2^2)^0.5}, すなわち√5,√5,√5,√5,となるようにしたいのですが。 以下のようなプログラムを作ってみたのですが、失敗しました。 open IN, "a.txt"; while (<IN>) { @nums = split(/\,/,$_); } close IN; open IN, "b.txt"; while (<IN>) { @suuji = split(/\,/,$_); } close IN; for($i=0;$i<=3;$i++ ){ $goukei[$i] = $nums[$i] ** 2 + $suuji[$i] ** 2; $sokudo = $goukei ** 0.5,","; @sokudo = split(/\,/,$sokudo) } print @sokudo;
で、さっきの疑問は解決できたのかい?
369 :
306 :2007/11/09(金) 20:25:32
二つの成分を合わせた速度データとは (x方向の速度の成分の二乗+y方向の速度成分の二乗)の平方根のことです。。。
370 :
306 :2007/11/09(金) 20:30:33
>>368 おかげさまで解決することができました。
print OUT @guusuuを
print OUT $guusuuにしました。
未だに行末のカンマと改行を取り除こうとしないんだな。
>>367 センスないよ。プログラムやめたほうがいい。
プログラミングなんてしなくてもいい仕事たくさんあるから。
キーパンチャーとかいいんじゃね
375 :
306 :2007/11/09(金) 20:55:59
>>371 可能ですか!?まだ希望が持てます。
open IN, "a.txt";
while (<IN>) {
@nums = split(/\,/,$_);
}
close IN;
open IN, "aa.txt";
while (<IN>) {
@suuji = split(/\,/,$_);
}
close IN;
for($i=0;$i<=3;$i++ ){
$goukei[$i] = $nums[$i] ** 2 + $suuji[$i] ** 2;
$sokudo[$i] = $goukei[$i] ** 0.5;
push @sokudo,"$sokudo[$i]";
}
print @goukei;
このプログラムで何とか5,5,5,5 まで表示することができました。
376 :
306 :2007/11/09(金) 20:56:49
×aa.txt ○b.txt
質問てか宿題に限りなく近いだろこれ
Perlを使うことが目的なのか、計算結果を得ることが目的なのか。 後者なら、Excelでやった方が楽な気がする。
379 :
306 :2007/11/09(金) 21:32:57
無事できました! open IN, "a.txt"; while (<IN>) { @nums = split(/\,/,$_); } close IN; open IN, "b.txt"; while (<IN>) { @suuji = split(/\,/,$_); } close IN; for($i=0;$i<=3;$i++ ){ $goukei[$i] = $nums[$i] ** 2 + $suuji[$i] ** 2; $sokudo[$i] = $goukei[$i] ** 0.5,"\n"; push @sokudo,"$sokudo[$i]"; } foreach $a (@sokudo) { print $a,"\n"; } 実行結果 2.23606797749979 2.23606797749979 2.23606797749979 2.23606797749979 2.23606797749979 ところで実行結果が一つ余分に出てくるのは何故でしょうか?
380 :
306 :2007/11/09(金) 21:34:10
>>379 お前、自分の書いてることの意味分かってないだろ
物事の中間過程をまったくイメージしていないのがよくわかるな。 致命的な指摘ほど無視してるし。
383 :
306 :2007/11/09(金) 22:20:48
>>381 あまりよくわかってないですね。最後の値が2重に表示される意味がわからないですし。
>>382 無視してるんじゃなくて、意味がわかっていないのです。
フローチャートって言うのは、知能も才能もない人間でも プログラムを書けるようにするための補助輪のようなもの。
せっかく指摘してくれてんのに、無視すんなら、このスレに書く意味無いジャン。 自分の言いたいことだけ書き込んで、問題を解決する前に問題を拡大させて。
ときどき厚顔無恥な自称初心者があらわれるが、 初心者ってのはみんなこうなのか、同一人物による荒らしなのか? いずれにせよ、初心者名乗るヤツはNGな
フローチャートを書くことに意味を見出せませんww
>>306 こんなとこで質問せずに、図書室でも図書館でも行って入門書でも読んでろ。
Perl本なんて今じゃ人気なくて不良資産化してるはずだから、
いくらでも見つかるはずだ。
ま、図解ってとこだな
390 :
306 :2007/11/09(金) 23:49:35
厚かましいのは無駄に文句ばっか言ってくる建設的でない人たち(少数)でしょう。 正直「そんなのもできないの?」 とか書きこんでる馬鹿とかなんなの? 意味ないでしょう、そんな書き込み。まあそれこそ同一人物による荒らしだと思いますがね。 アドバイスやご指摘を下さった方々には感謝しております。 どうもありがとうございました。
391 :
306 :2007/11/09(金) 23:51:08
>>388 ありがとうございます。僕がいると荒れるのでこのスレから出て図書館にこもることにします。
それでは。
この反応は… 厨房工房説は正しかったようだな。
393 :
306 :2007/11/10(土) 00:07:27
すみません、うちの近所で図書館ってどの辺にあるでしょうか?
394 :
306 ◆9ytKL4.iPs :2007/11/10(土) 00:12:19
いや・・・ 偽物が多すぎなんですがwww 僕はそんな暴言吐かないですよw 皆さんどうもありがとうございました。
今更トリ付けて何になる
net-snmpで # snmpwalk -v 2 -c public localhost .1.3.6.1.2.1.1 SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost.localdomain 2.4.19-0vl11 SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10 SNMPv2-MIB::sysUpTime.0 = Timeticks: (4714464) 13:05:44.64 SNMPv2-MIB::sysContact.0 = STRING: ***@***.ne.jp みたいにバージョン、コミュニティ名、ホスト、OIDを指定してエージェントからデータを取得するってのを Net::SNMP使ってやりたいんだけど ($session, $error) = Net::SNMP->session( -hostname => 'localhost', -version => 'v1', -community => 'public' ); @result = $session->get_next_request(-varbindlist => .1.3.6.1.2.1.1); とやっても@resultにHASH(0x*****) みたいな値しか取れない 指定したOID以下の情報をずらっと取得するようにしたいんだけど どうすればいいの?
Data::Dumper
工場ラインの現場でも、設備の吐き出すデータをメーカ製の糞高くて融通の効かないうんこアプリで効率悪く管理するよりも、 cronで定時計測、perlでちょこまか好きなように集計解析管理している方が精神衛生上にも良かったりします♪ ・・・おかげで夜中に携帯が鳴ったりするけれども(´・ω・`)@数値異常検出とか警報とか ♯シーケンサをどうにかして撲滅したい。。。@殊にξ菱
ここはあなたの日記帳ではありません
>>395 なんだかんだであと半年くらい
こういう居座り方をするつもりなのかも。
>>297 > ActivePerlをインストールしたら
> OSが起動しなくなりました。
> Windwosロゴまでは表示されますが
> その後真っ暗です。
> セーフモードでの起動は出来ます。
> 復元でActivePerlインストール前にもどれば起動は出来ましたが
> ActivePerlを使いたいのです、
ずいぶん遅レスになってしまったが、おそらくレジストリが壊れている。
今後、ActivePerl に関係ないところでも障害が出てくる可能性が高い。
OSの修復インストール、再インストールなどをするしかあるまい。
メインのスクリプト内である値をスカラで持ってるんだけど、 この値をモジュールから参照するにはどうすればいい? our $hoge とかして、モジュールでは $::hoge とすれば 参照できるわけなんだけど、とっても美しくない気がしているの。 (ちなみに参照したいだけで書き換えはしない)
$main::hoge だが、そういう参照が必要になるってのは、 構造上の問題を孕んでいる可能性が高いと思う。
その変数の値が色々と変わりしかも現時点での値を必要とする→むしろその変数ごとモジュールに切り出すべきじゃね? ある時点の値が分かれば OK→new とかに渡す
>>405-406 うん、多分今の構造が美しくないんだと思う。
誰かが作ったシステムに追加でモジュール書かなきゃいけなくなってねぇ。
最大の問題は俺がオブジェクト指向を知らないことなんだけどさw
プログラム書くのが本職ではないので知らなくても困らなかった。
ourのままやっちゃうかなぁ、う〜ん。
408 :
デフォルトの名無しさん :2007/11/10(土) 23:10:58
他人の言うことを鵜呑みにするこたぁ無い。 趣味でプログラミングしてるんなら別だが すでに出来上がって稼動しているシステムを 「ツーチャンネルで相談したら、こう言われたので」 というくだらない理由で 1から書き直すという愚考は会社にとって迷惑。
>>408 「rewrite せよ」なんて誰も言ってないと思うが、、、
404氏がちょっとobjct指向覚えれば、最低限の修正で
済むんじゃないの?
>>408 1から書き直しはさすがにしないぞ。
でも比較的楽に綺麗になるならある程度の修正は
やってみたいなぁとは思っている。
>>409 まぁなんというか簡単に「ちょっと」覚えられればいんだけどねw
411 :
297 :2007/11/11(日) 01:04:54
>>403 どうも、修復のためのSP2CD作ってました。
しかしなぜか再起動を繰り返していると起動するようになったので
Perlを別途保存しておいたやつを環境変数設定して再起動したら
問題なく起動した。そのごJcode.pm(Jcode.pl)をぶっこむと
起動しなくなった。どうやらこれが影響してるみたい。
フォトショの日本語フォントの表示が文字化けしてるのも関係あr・・・ないか
どちらにせよJcode使う必要があるので、修復が必要ぽいな
>>411 Jcode モジュールは古いバージョンで必要なものだよ。
今のバージョン(5.8以降)では、標準で付いているEncode
モジュールを使うべき。
文字コードの自動判別したい時ってEncodeだと役立たずだよね。
でもJcodeの自動認識はかなり当てにならんかったような。
やっぱり &jcode'getcode ですよね。と書いておけばいいのかな。
>>411 は記述に謎が多いけど(Jcode.pm と jcode.pl の区別とか)
Jcode.pm使用の既存スクリプトをローカルでごにょごにょするんだろうとか
5.6でも動くものを書こうとしてるんだろうとか(たぶん違うけど)
思い込んで、ニヤニヤ眺めていればいいと思うんだ。
レンタルサーバはPerl5.0が多いから・・・
fack you
>>418 oh,,, miss spell
"Fuck you"
>419 Fuck you
pod2htmlについて一つ質問があるのですがここでよいでしょうか。 =item 日本語 とかかれたPODをHTMLに変換すると、<a name="___?_?_?__?_" class="item">のように文字化けしてしまいます。 PODファイルの文字コードはS-JISやUTF-8など、いろいろ試してみたのですがどれもだめでした。解決法はないでしょうか。
> "=encoding encodingname" > This command is used for declaring the encoding of a document. Most users won’t need this; but if your > encoding isn’t US-ASCII or Latin-1, then put a "=encoding encodingname" command early in the document so > that pod formatters will know how to decode the document. For encodingname, use a name recognized by the > Encode::Supported module. Examples: > > =encoding utf8 > > =encoding koi8-r > > =encoding ShiftJIS > > =encoding big5 perldoc perlpod より
=encodingを指定したら正しく表示されるようになりました。 ありがとうございました。
425 :
デフォルトの名無しさん :2007/11/13(火) 11:54:45
雑誌に掲載されていた 192.168.0.0/24 のようなアドレス記述を
192.168.0.0
192.168.0.1
192.168.0.2
:
と変換するプログラムですが、
#!/usr/local/bin/perl
if( $#ARGV eq -1 ){
die();
}
($ADDR,$BITL) = split( /\//, $ARGV[0] );
($S1,$S2,$S3,$S4) = split( /\./, $ADDR );
$MASK=0;
if( $BITL >= 24 ){
$mbit=0x80;
for($CNT=0;$CNT<($BITL-24);$CNT++){
$MASK |= $mbit;
$mbit = $mbit
>>1 ;
}
}
else{
die();
}
$LEN = ( $MASK^255 ) ;
for($CNT=$S4;$CNT<=($S4+$LEN);$CNT++){
print "$S1\.$S2\.$S3\.$CNT\n";
}
このままだと192.168.0.0/15のようなサブネットのアドレス変換は行うことが
できません。上のプログラムを192.168.0.0/15のようなアドレス変換にも対応
できるようにするにはどうすればいいでしょうか?
また、同じようなプログラムはないでしょうか?
24を15にすりゃいいんじゃね?
ポートスキャンの香り
429 :
デフォルトの名無しさん :2007/11/13(火) 15:20:56
文字列内部の、正規表現にマッチした部分を「取得」(置換ではなく…)したいのですが どのようにすれば良いでしょうか。 たとえば "apple++orange@@-pie" から /([a-z]+)[^a-z]/ にマッチするものを順次取得、 つまり "apple", "orange", "pie" を取得したい、という目的です。
>>429 "apple+", "orange@" しかマッチしないだろ
perl -le 'print q{apple++orange@@-pie} =~ /(\w+)/g ;' 後は自分で勉強しろ、配列に入れるトコとか正規表現とか、、、
perlって匿名関数使えるんですか?
はい
436 :
デフォルトの名無しさん :2007/11/13(火) 20:16:59
まず、ド素人がperlイジってすみません。土下座します。生まれてきてすみません。 while (-e "$a$b") { print 〜 } の"-e"の意味がわかりません。 $aと$bが同じでない間はprint〜を実行、って意味になるんですか? ageですみませんが教えて下さい。
変数$aと$bを連結した名前の ファイルもしくはディレクトリがあれば真
ありがとうございました!
439 :
デフォルトの名無しさん :2007/11/13(火) 20:53:52
readline(*STDIN) でコンソールから文字列を入力させていたんですが エコーが邪魔なので消したいです。どうしたらいいでしょうか。
Term::Getch
# 手抜き system("stty -echo");
442 :
デフォルトの名無しさん :2007/11/13(火) 21:44:36
>>441 なるほどw perlでどうこうする前に先ず試すべきでした。
>>440 こういうのがあるんですね。使ってみます。
ありがとうございました。
perlインストールしたらHDの容量が4GBぐらい増えたんだが これはなんでだ? インストールするとき、えらい長かったんだが。
>>443 それはperlとは関係なくね?
空き容量が4G増えたとしたらなんか消したってことだろ。常考。
インストール作業中にファイル整理してなかったか?
445 :
429 :2007/11/14(水) 11:51:21
しかしKENTは本当に害悪だな
俺は先人に敬意を払うが
>>447 無差別に敬意を払うのは、だれにも敬意を払わないのと同じ。
無差別に敬意を払うとは書いていない
名前出すなよ。鬱陶しい。
もはやKENTの売名としか思えなくなってきた。
453 :
デフォルトの名無しさん :2007/11/14(水) 20:25:41
>>454 449の鋭い論理の前にボロクソに言い負けて涙目な448乙。
理由はどうあれ KENT に複雑な思いがあることは分かったよ
うおw 俺
>>448 になっちまったのか?!
ってか
>>449 が鋭い論理って・・・。
ズレてるから補正してやろうと思ったが、とりあえずそのままズレてろw
458 :
デフォルトの名無しさん :2007/11/15(木) 00:47:00
while ($perlDevelper s/KENT/who is next/) {}
>>457 > うおw 俺
>>448 になっちまったのか?!
うん、昨日の18:42:03から、このスレでは君は448。
苦しい現実だから、綺麗サッパリ忘れたいんだろうけどね。
お前のような気がする
こういうときは上から目線の奴のほうがしねばいい
まあ実際KENT WEBの影響力は馬鹿には出来ないよ。 WebPGの中でも特にKENTは匂いが違うしな。 何というか…“本質”みたいな物が見えているよね、KENTは…
463 :
デフォルトの名無しさん :2007/11/15(木) 11:16:00
お世話になります。 ご存知の方いらっしゃいましたら、 教えていただけませんでしょうか。 以下の様にデータセットの参照を動的に行いたいのですが、 $tmpColumnNameのところで参照ができない状況です。 この様な動的参照をする際には、 どの様に対応すればよいか教えていただけませんでしょうか。 $tmp = ref(($RecordSet->{Fields}->{$tmpColumnName}->{Value}));
エスパー待ちの質問に質問。 そのrefはなんのためにあるん?
465 :
デフォルトの名無しさん :2007/11/15(木) 11:23:48
>>464 失礼しました。
ref()は無くしてください。
$tmp = ($RecordSet->{Fields}->{$tmpColumnName}->{Value});
print("$tmp");
の様になります。
値を入れてる部分は?
467 :
デフォルトの名無しさん :2007/11/15(木) 11:28:49
$tmpColumnNameにカラム名を順次入れて参照するループ内の一部になります。
/' ! ━━┓┃┃ -‐'―ニ二二二二ニ>ヽ、 ┃ ━━━━━━━━ ァ /,,ィ=-;;,,, , ,,_ ト-、 ) ┃ ┃┃┃ ' Y ー==j 〈,,二,゙ ! ) 。 ┛ ゝ. {、 - ,. ヾ "^ } } ゚ 。 ) ,. ‘-,,' ≦ 三 ゞ, ∧ヾ ゝ'゚ ≦ 三 ゚。 ゚ '=-/ ヽ゚ 。≧ 三 ==- / |ヽ \-ァ, ≧=- 。 ! \ イレ,、 >三 。゚ ・ ゚ | >≦`Vヾ ヾ ≧ 〉 ,く 。゚ /。・イハ 、、 `ミ 。 ゚ 。 ・
my $RecordSet = { Field1 => 'Value1', Field2 => 'Value2', Field3 => 'Value3', }; my $tmpColumnName = 'Field2'; my $tmp = $RecordSet->{$tmpColumnName}; print $tmp; こうなんじゃないかと予想
またエラー隠蔽者か
未熟な質問者によくある過ちの一つに、 プログラムの動作結果を「自分の望み通り」と「それ以外」の2種類だけで捉える、 っていうのがあるな。 「思った通りになりません」というのは、やってしまい得る無数のことのうちの 特定の一つではなかった、と言ってるだけで、まともな情報になってない。 「あなたのお名前は?」と訊かれて「太郎ではありません」と答えるようなもんだ。全然足りねえよ。 「どうなったのか」を書け。エラー報告も含めて。
472 :
デフォルトの名無しさん :2007/11/15(木) 13:26:17
失礼しました。 エラーですが、何も表示されないんです。。。
第2段階エスパーの出現が求められています。
コードを全て曝け出せ
475 :
デフォルトの名無しさん :2007/11/15(木) 13:34:24
もう少し、書き加えさせていただきます。 $strSQL = "SELECT * TABLE_NAME"; $intArrayNumber = 0; $RecordSet->Open($strSQL, $objDB); while(!$RecordSet->EOF and $RecordSet->{RecordCount} != 0){ print($RecordSet->{Fields}->{$arrColumnName[$intArrayNumber]}->{Value}); $intArrayNumber = $intArrayNumber + 1; } ここで、$arrColumnName[$intArrayNumber]とありますが、 ループ内で該当変数を表示させようとするとすべて表示されます。
476 :
デフォルトの名無しさん :2007/11/15(木) 13:41:00
while($intArrayNumber != $intArrayMax){ print($arrColumnName[$intArrayNumber]."\n"); ←ここは表示できます。 $tmp = ($RecordSet->{Fields}->{$arrColumnName[$intArrayNumber]}->{Value}); ←ここでカラムのデータを取りたいが、取り出しができない。(エラー表示はなし) print($tmp); $intArrayNumber = $intArrayNumber + 1; }
そのハッシュリファレンスの固まりみたいなコード、 ひとつひとつ分解して、中身を丁寧に調べるしかないんじゃねーの? SQLが間違っていて、最初から結果が空だったっていう オチのような気もするが。
>>472 Perlのエラーはブラウザではなく、Webサーバーのログを見なければならない
apache/logs/error.logを参照のことと一応いっておく
>>476 配列参照だから print(@$tmp[0]); で出ないかい?
Data::Dumper 使って$RecordSet が実際にどういうデータか確認するといいと思うよ
481 :
デフォルトの名無しさん :2007/11/15(木) 13:58:16
皆様ありがとうございます! ご指摘・アドバイス頂いた点を確認してみます。
482 :
デフォルトの名無しさん :2007/11/16(金) 03:48:48
1から1000までの乱数の集合(@ransuu)があるとき 1から250までの数字をA、251から500までをB、501から750までをC 751から1000までをDとわけたいんですが、どのようにしたらよいかアドバイスを いただけないでしょうか? if ($ransuu){ s/$ransuu/A/; } elsif ($ransuu){ s/$ransuu/B/; } elsif ($ransuu){ s/$ransuu/C/; } elsif ($ransuu){ s/$ransuu/D/; } 「ある数字が1から250だった場合」のように範囲の決め方がわかりません。
if($ransu >= 1 && $ransu <= 250)
484 :
デフォルトの名無しさん :2007/11/16(金) 05:09:09
ありがとうございます! 助かりました!
それにしてもKENTは本当に害悪すぎる
486 :
デフォルトの名無しさん :2007/11/16(金) 05:44:05
まあまあそんなにKENTに嫉妬すんなって(笑) 自分より上の立場の人間が憎いのは分かるよ(笑)
____ / \ / ─ ─ \ / (●) (●) \ | (__人__) | それはない \ ` ⌒´ ,/ r、 r、/ ヘ ヽヾ 三 |:l1 ヽ \>ヽ/ |` } | | ヘ lノ `'ソ | | /´ / |. | \. ィ | | | | |
嫉妬とかどうしたらそういう発想が出てんだ
どこかのサイトに載っていたインタビューかなんかで、KENT本人も それ言ってたね。 ―いろいろ非難もされてるようですが 「ああ、あれはぼくに嫉妬してるんです」 とか
粘着も擁護もどっちもウザい
494 :
デフォルトの名無しさん :2007/11/17(土) 20:16:15
モジュールについての質問なんだけど Net::SNMPとData::Dumper使ってMIBを取ると $VAR1 = { '.1.3.6.1.2.1.1.1.0' => 'Linux localhost.localdomain 2.6.22.9-91.fc7 '.1.3.6.1.2.1.1.2.0' => '.1.3.6.1.4.1.8072.3.2.10', '.1.3.6.1.2.1.1.4.0' => 'Root <root@localhost> (configure /etc/snmp/snmp.local.conf)' }; って返ってくるけどこれをnet-snmp使ったときみたいに SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost.localdomain 2.6.22.9-91.fc7 SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf) SNMPv2-MIB::sysName.0 = STRING: localhost.localdomain みたいにOIDじゃなくて名前で返すようにって出来ない?
496 :
デフォルトの名無しさん :2007/11/18(日) 18:19:41
Last-Modified: Tue, 10 Apr 2007 01:57:19 GMT だそうです♪@404だけれどもね
498 :
デフォルトの名無しさん :2007/11/18(日) 20:46:54
use
HTTP::Lite; use
HTTP::Date; my $url = '
http://www.unko.com/ ';
my $http = new
HTTP::Lite; $http->{'method'} = 'HEAD';
my $status = $http->request($url) or die 'web ページ取得に失敗しました: '.$!;
print $url,' ',$status,"\n";
if ($status eq '200') {
my $Last_Modified = $http->{'resp-headers'}->{'Last-Modified'}[0];
print $Last_Modified,"\n";
my $mtime = str2time($Last_Modified);
if ($mtime) {
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($mtime); # = gmtime($mtime);
print sprintf("%04d/%02d/%02d %02d:%02d:%02d\n",
$year + 1900, $mon +1, $mday, $hour, $min, $sec);
}
}
499 :
デフォルトの名無しさん :2007/11/18(日) 21:31:54
>>498 おおっ!
ありがとうございます.
LWPでもヘッダから更新時刻を取得できるようなので,こちらも同じことをしてみました.
が,ヘッダにLast Modifiedが付加されない場合もあるので,ムリっぽいです.
必ず,更新時刻を取得できるみたいな方法ないですかねぇ.
perlってopenでプログラム実行できるっけ?つーかやり方教えてください catコマンド引数つけて実行したりできる?
502 :
デフォルトの名無しさん :2007/11/18(日) 23:49:48
>>501 $programResult = `ls -a /usr`;
print "$programResult¥n";
パールだけじゃなくプログラミング初心者なんだけど 自動的にブラウザを起動し任意のところに書き込むみたいなこともできますか? ブログを複数やってるんですが、同じ作業をどうにかしたいと思いあちこちみてまわってます。 メールの本文から指定のURL抽出するみたいなこともできればとおもってますが。
実行時に年と月を与えるとそのカレンダーを表示するperlプログラム 作ってもらえませんか? UNIXのcal?とかを使うらしいんですが
>>503 直接POSTでも投げたら?
多分微妙に板違いだからWebProg板に逝くといいよ
>>504 今日一番ワロタw
cal使っていいのかよw
open使えばいいだけじゃね?
もったいぶらないでソースください_ト ̄|○
510 :
デフォルトの名無しさん :2007/11/19(月) 00:50:50
>>509 心配するな
もったいぶってるんじゃなくて、俺達には出来ないんだ
な、みんな?そうだろ?
学生時代の宿題にCGIとして作ったやつなら
やべぇww教えてあげようと思ったら俺の環境calがうまく動かない・・・ 引数2個指定すれば普通は年、月で指定できるのに年までしか指定できねぇ とりあえずヒントやるから自分でがんばれ #!/usr/bin/perl open(EXE, "cal 2008|"); while($buf=<EXE>){ print $buf; }
もう誰も教えてくれないからこれでいいや
#!/usr/bin/perl use Disp::Cal; $cal = new Disp::Cal; $cal->setYear(2007); $cal->setMonth(12); $cal->output(\*STDIN); 後は任せた
515 :
デフォルトの名無しさん :2007/11/19(月) 01:13:20
system 'cal 2008';
#!/usr/bin/perl { package Disp::Cal; my $VERSION = "0.01"; sub new { my $self = shift; my @t = localtime; bless {"YEAR" => ($t[5] + 1900), "MONTH" => ++$t[4]}, $self; } sub setYear { my $self = shift; my $year = abs(int(shift)); if($year < 1970 or $year > 2037){ die "bad year" } $self{"YEAR"} = $year; } sub setMonth { my $self = shift; my $month = abs(int(shift)); if($month < 1 or $month > 12){ die "bad month" } $self{"MONTH"} = $month; } sub output { my $self = shift; my $handle = shift; syswrite($handle, `cal $self{MONTH} $self{YEAR}`); } }
$cal = new Disp::Cal; $cal->setYear(2007); $cal->setMonth(12); $cal->output(\*STDIN); __END__
$cal = new Disp::Cal; $cal->setYear(2007); $cal->setMonth(12); $cal->output(\*STDIN); $cal->output(\*STDIN); なぜか二重出力される様に改良しました
>>516 $VERSIONはourのほうがよくね?
>>516-518 無視すりゃいいのに。
ここの住人ってお人好しなのか、ただのマゾなのか。
>>520 罵倒していないで、なぜ無視するべきなのかを説明して説得に勤めること。
522 :
デフォルトの名無しさん :2007/11/19(月) 16:33:24
system 'cal 2008'; たった1行でできるのに、わざわざ”車輪のナントカ”する必要は無いだろ。
chrootされた環境にcalがあるとは限らない。
calを使っていいっていう条件なんだから、 ファイルシステムから全体からcalを探索すればいいんじゃなかろうか。
四角くない車輪ならまぁいんじゃね?
Audio::Beep のサンプルを鳴らしたいのですが (<>) ここにファイル名入れても鳴らないのですが。。。 #!/usr/bin/perl -w # use this program to play the examples in this directory # use: ./beep_player.pl music_file use strict; use Audio::Beep; undef $/; my $beeper = Audio::Beep->new(); $beeper->play(<today>);
529 :
デフォルトの名無しさん :2007/11/20(火) 06:42:40
>>529 > って書かれてたんだけど、リンク切れで分からん。
↓
バージョンが変わったのかと推測する
↓
検索してみる
vista使いですけど、OS規定のプログラムでファイルを実行させるにはどうしたらいいですか?
system($file);
mkdir -pを行える標準モジュールってありますか?
536 :
デフォルトの名無しさん :2007/11/21(水) 01:38:01
system 'mkdir -p';
自分のHDDの内容を2chで人に尋ねるのって哀しいよね
perlでバックグラウンドで処理を動かすにはどうしたらいいでしょうか? shellで言うと、 hoge1.sh & hoge2.sh & hoge3.sh & みたいな感じです。 そして、それぞれのバックグラウンド処理の終了を監視できるといいのですが。
541 :
539 :2007/11/21(水) 21:57:59
増やしたいだけ親プロセスからfork()を繰り返す。
543 :
デフォルトの名無しさん :2007/11/21(水) 22:07:12
このエラーの解決方法を教えてください ----- C:\work>pp -o a.exe a.pl Can't load 'C:/Perl/lib/auto/IO/IO.dll' for module IO: load_file:指定されたプロ シージャが見つかりません。 at C:/Perl/lib/XSLoader.pm line 64. at C:/Perl/lib/IO.pm line 11 Compilation failed in require at C:/Perl/lib/IO/Handle.pm line 263. BEGIN failed--compilation aborted at C:/Perl/lib/IO/Handle.pm line 263. Compilation failed in require at C:/Perl/lib/IO/Seekable.pm line 101. BEGIN failed--compilation aborted at C:/Perl/lib/IO/Seekable.pm line 101. Compilation failed in require at C:/Perl/lib/IO/File.pm line 133. BEGIN failed--compilation aborted at C:/Perl/lib/IO/File.pm line 133. Compilation failed in require at -e line 405. C:\Perl\site\bin/pp: Failed to extract a parl from 'PAR::StrippedPARL::Static' t o file 'parl3qS37ar.exe' at C:/Perl/site/lib/PAR/Packer.pm line 1149, <DATA> lin e 1.
544 :
539 :2007/11/21(水) 22:15:32
>>542 すいません、今perlの環境がないので試せませんが、こんな感じでしょうか。
それとバックグラウンド処理の結果を受け取るにはどうしたらいいでしょうか。
テンポラリファイルに書き出し→読み込みは思いつきましたが、なるべくファイルを作りたくないので。
if( $pid = fork ) {
# なにもしない
} elsif (defined $pid) {
# バックグラウンド処理1
exit;
}
if( $pid = fork ) {
# なにもしない
} elsif (defined $pid) {
# バックグラウンド処理2
exit;
}
if( $pid = fork ) {
# なにもしない
} elsif (defined $pid) {
# バックグラウンド処理3
exit;
}
>>544 > それとバックグラウンド処理の結果を受け取るにはどうしたらいいでしょうか。
perlipcを読んで、プロセス間通信のモデルと枠組みを理解しろ。
う〜ん、IPC::Open3してselectしてSIGCHDをキャッチしてwaitpidするのが 今でもベストなのか?
Parallel-ForkManagerとかProc-Forkとかいうのがあるようだな。
548 :
539 :2007/11/21(水) 23:13:09
>>539 のシェルの場合、結果はどのように受け取るつもりなんだ?
まあそれはともかく
>>539 にはファイルでやりとりすることをお勧めする。
550 :
539 :2007/11/22(木) 01:14:57
>>549 シェルは説明の為に例えで書いたことですが、やるとしたらファイルしか思いつきません。
perlだったら他の方法でやり取りできるのかと思って質問させてもらいました。
perlipcをちらっと見ましたが理解するのに時間がかかりそうなので、とりあえずファイルで対応します。
>>538 ありがとうございます!
自力で作ろうとFile::Basenameまでは触れてました…。
添付ドキュメントのperlmodlibに一覧があるんだがな。
553 :
デフォルトの名無しさん :2007/11/22(木) 15:47:20
Web::Scraperを入れようとしたらテストに通らず困っています。 # prel -MCPAN -e shell cpan> install Web::Scraper ... t/12_html.................ok t/13_textnode.............1/4 # Failed test 'RAW HTML' # at t/13_textnode.t line 20. # got: ' bar & baz' # expected: ' bar & baz' # Looks like you failed 1 test of 4. t/13_textnode............. Dubious, test returned 1 (wstat 256, 0x100) Failed 1/4 subtests t/14_absolute_nested......ok t/15_absolute_hash........ok ... make testまでは特にエラーもなく進むのですが、13_textnodeの RAW HTMLのテストのみ失敗してしまいます。 Result: FAIL Failed 1/18 test programs. 1/39 subtests failed. make: *** [test_dynamic] エラー 255 事前に入れておくべきモジュールなどはありますでしょうか。Bundle::CPANは入れました。 考えられる要因などありましたら、お教えください。原因解決に提示すべき情報があれば 提示します(他にどのようなものを提示すればよいのか分かっていません…)
失礼します。 変数を動的に呼び出したいのですがどうしたらできますか? 例えば、変数$hoge1,$hoge2,$hoge3という変数が3つあるとして $callという変数に上記3つうち扱いたい変数の変数名を代入します。 $call = 'hoge2'; この後で、$callを使って$hoge2に代入したり読込んだりしたいです。 教えてください、お願いします。
>>556 変数の「参照」になります。
$hoge1=10; $hoge2=20; $hoge3=30;
print "$hoge1,$hoge2,$hoge3\n";
$call = *hoge2;
${$call}++;
print "$hoge1,$hoge2,$hoge3\n";
>10,20,30
>10,21,30
>>556 普通リファレンスを使うと思うのだが、どうしてもどうしてもどうしても
どうしてもどうしてもどうしてもどうしても変数名じゃないとダメなのか?
>>556 お勧めできない(俺が思うに)最悪の方法であるが、シンボリックリファレンスを
用いることにより可能である。
最悪な点
・読みにくい
・判りにくい
・遅い
・時代遅れ
やりかた
$call = 'hoge2'
print ${"$call"};
ハードリファレンスを用いるか、あるいは
%hash = ('hoge1' => 10,'hoge2' => 20,'hoge3' => 30);
$call = 'hoge2;
print $hash{$hoge2};
560 :
556 :2007/11/23(金) 17:40:15
皆さんレスありがとうございました。
>>557 ありがとうございました。やりたい事ができました。
>>558 すいません。リファレンスの存在自体知らなかった者ですので・・・
あの・・・僕は今までずっとuse strictとmyの変数宣言を使っていたのですが
>>557 さんの例だと結果が
>10,20,30
>10,20,30
と変わってきました。
あと、スカラー変数ではなくハッシュの場合で
変数名を動的に呼び出せれるかテストしてみたんですが
use strictを使わない場合はうまくいきましたが
use strictを使うとエラーが出てしまいました。
ちなみにこんなエラー(renhogeはハッシュの名前)
Can't use string ("renhoge") as a symbol ref while "strict refs" in use at testRef line 30.
普通use strict とかは使わないほうがいいんですかね?
>>560 use strict;は、使ったほうがよい。この「use strict;」は、「strictプラグマ」などと呼ばれる。
>>559 のようなシンボリックリファンレンスという方法(${"$hoge"}というような方法)は、
今は使わないほうが良いとされているので、strictプラグマが使われているとエラーになる。
多分・・・
$hoge = "renhoge";
${"$hoge"}{"key"}
とかやったんじゃないのか?シンボリックリファレンスは使わないほうがいいと思う。
562 :
デフォルトの名無しさん :2007/11/24(土) 01:54:54
ポインタを使いたいのですが良い方法あるでしょうか?
use Pointer
564 :
553 :2007/11/24(土) 14:58:47
遅くなってすみません。
>>554 ありがとうございます。
現象としては、ほぼ同じだと思います
>>555 ありがとうございます。
HTML::TreeBuilderのアップグレードを試してみましたが、インストール
済みの3.23が最新のもののようでした。お教えいただいたView/Report Bugsを
読んでみましたが、まだ解決策は分かりません。
細かいことなのですが、インストールが成功する環境では
テスト進行中の表示で、スキップした際に
t/07-live...............skipped
all skipped: LIVE_TEST not enabled
t/08-leak...............skipped
all skipped: LEAK_TEST is not defined
と表示され、失敗する環境では
t/07-live.................skipped: LIVE_TEST not enabled
t/08-leak.................skipped: LEAK_TEST is not defined
というように、微妙にメッセージが異なります。
調べてみたら、Test::Harnessのバージョンが、成功する環境では2.64、
失敗する環境では3.03でした。これが関係あるかは分かりませんが、古い
バージョンに戻すのは他に影響が出そうだし、現在インストール可能な環境を
インストール不可になる危険を冒して検証するのも怖いので、どうしよう
かと思っています…。
>>564 そっか、力になれなくてスマン。
source からインストールも試してみれば?(他の必要モジュールはCPAN経由で入れてさ)
- Web::Scraper の必要モジュールは .pm に書いてある。
- README を読めば source からのインストール方法も書いてある。
package Web::Scraper;
use strict;
use warnings;
use Carp;
use Scalar::Util qw(blessed);
use List::Util qw(first);
use HTML::Entities;
use HTML::Tagset;
use HTML::TreeBuilder::XPath;
use HTML::Selector::XPath;
use UNIVERSAL::require;
今回のと関係ないけど、CPANインストールにコケる時に
terminalの言語環境が英語じゃないとダメってのもあったなあ。
不特定のファイルの種類を調べようとしています。 fileコマンドだと、画像ファイル(PCX)の場合に解像度まで表示されてしまう場合があります。画像フォーマットの種類だけわかれば十分なのです。 fileのmanによると、通常text,executable,dataのいずれかがつくとのことだったので、以下のような正規表現で種類だけ抜き出せないかなと思っています。 if($file =~ /^(.+?(?:text|executable|data))(?: .+|, .+|)$/){ $format = $1; } else{ $format = $file; } でも、ざっと /usr/share/file/magic を見ると、MP3形式の時に以下のような結果となり、ビットレートなどを除いた情報がとれません。 MPEG ADTS, layer III, v1, 128 kBits, 44.1 kHz, JntStereo それようのモジュールがあるような気はするのですが、見つかりませんでした。 何か良い方法はありませんか。
>>566 それがどうして問題になるのかわからん。分ければ良いだけのこと。
とまれ、File::MMagicでも読めばなにかわかるんじゃないか?
ちょっとここでいいかわからないけど、とりあえず質問です。 DynaLoderとかXSLoderについてなんですが、 例えば、use DBD::mysqlとかした時に、@INCにある、auto/DBD/mysql.so(.dll)をLoadしに行って、 さらにそこから、mysqlの例だと、例えば/usr/lib/mysql/libmysqlclient.so(Winだと、C:/MySQL/bin/libmysql.dll) とかを探しに行ってLoadしてるんだと思いますが、 例えばMySQLを標準以外のprefixでインストールした時(/usr/local/mysql/)に、DBD::mysqlをmakeするときは perl Makefile.PL --libs="-L/usr/local/mysql/lib -llibmysqlclient ・・・"とかを指定してコンパイルしますが、 これをインストールしてから、perl -e ’use DBD::mysql’とかしてみると、 Can't load '・・・DBD/mysql.so' for module mysql: libmysqlclient.so.15: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません at ・・DynaLoder.pm line 230 みたいな出力になります。 ここで、そのlibmysqlclient.so.15を/usr/lib/mysql/にコピー(またはsymlink)すると、エラーなしで上のコードが実行できます。 もちろん、mysqlの場合だと、コンパイル時に--staticとかつけてstatic linkでmysql.soを作成するとか、 Winの場合だと、C:/otherdir/mysql/bin/を環境変数PATHに突っ込んでやったりすると問題なくLoadできます。
570 :
つづき :2007/11/25(日) 10:57:56
で、なにがしたいのかとゆうと、 staticにしたくない(またはできない)場合のmoduleの、DLLの検索Dirの制御を動的にできないか? とゆうことです。 PerldocやCPANのDynaLoaderやXSLoaderのDocumentや、Linuxの環境変数についてとか調べた結果、 システム環境変数(?)の$LD_LIBRARY_PATHや、perl -V した時の libpath、DynaLoader.pmの@dl_library_pathなんかに DLL(.so)を探しに行くときのDefaultのPATHが格納されているようなんですが、これって外側から制御することは可能ですか? 例えばとあるModuleをコンパイルする時に、perl Makefile.PL OPTIMIZE="-O3・・・"とかしたら、デフォルトの設定から OPTIMIZE変数を上書きしてコンパイルしてくれます。 でも、上のmysqlの例だと、LIBPATH=/usr/local/mysql/lib とか、LD_LIBRARY_PATH=/usr/local/mysql/lib とかつけて、 perl Makefile.PLしても、make test ブロックなんかでやっぱり上記のエラーが出て止まってしまいます。 この時も、/usr/lib/以下に/usr/local/mysql/lib/の内容をコピーしてやったりしたらmake testが通るようになるんですが、 そうじゃなくて、LIBPATH=/usr/local/mysql/lib make test みたいなコマンドで、適宜LoadDirectoryを追加とかできないですか? mysqlの場合だと、異なるいくつかのVersionを同じシステム上で動かして(当然default-unix-socketやportが違う) 動作テストをしたいときや、 mod_perlがらみのscriptとかの動作テストをする時も、/usr/local/apache2/libなんかをLibrary検索pathに含めたいんです。 (これも、perl -e 'use APR'とかすると、Can't load ・・・libaprutil-1.so がありません とか言われてしまう。)
>564 Web::Scraper 0.23がでてて、ChangelogによるとテストがこけるのはHTML::TreeBuider::XPathのバグみたい。
>570 "LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH" make test で通らないの?
573 :
570 :2007/11/25(日) 15:25:58
>>572 それが、今やってる環境がCent4 & Cent5 なんですけど、mysql
sshターミナルでLoginして、printenvしたり、setしても、LD_LIBRARY_PATHが定義されてないんです。
で、例えば、LD_LIBRARY_PATH=/usr/local/mysql/lib perl -e 'use DBD::mysql'だとなにも言わない(エラー無し)なんですが、
LD_LIBRARY_PATH=/usr/local/mysql/lib make test だと、やっぱり ’Can't load ・・・’なエラーを吐きます。
574 :
566 :2007/11/25(日) 15:31:21
>>567 ファイル一覧の付加情報としようと思うので、あまり長いと都合が悪いのです。
File::MMagicを試してみましたが、fileで扱うデータを食わせると同じ結果にしかなりません。当たり前でしょうけど。
あと、Debianでは、File::MMagicで読み込めるmagicファイルのフォーマットが古く、search型の部分でエラーになりました。
>>568 mimeにしちゃうと、情報が減りすぎて。
575 :
デフォルトの名無しさん :2007/11/25(日) 22:07:08
あるファイルがCGIとして呼び出されたか、 requireで実行されたかそのうファイル内で判断したいのですが、 どのようにしたら良いでしょうか? # CGIとして呼び出されたときはページを表示し、 # requireで実行されたときはページを表示しないということをやりたいのですが。
>>575 環境変数で判断できない?
REMOTE_ADDRが設定されていれば、CGIとか。
別のCGIからrequireされたかどうかの判断なら、自分のコマンド名で判断できるかな。
$0をチェック。
こっちのスレやる話題じゃないけどGATEWAY_INTERFACEがCGI/1.1かどうかってモロなのがあるぞ?
578 :
575 :2007/11/26(月) 02:29:50
>>576-577 ありがとうございます。
requireで呼び出しを行ったプログラムがCGIだったせいで、
環境変数系は全滅でしたが、$0で判別することが出来ました _ _
>>570 長くてちゃんと読んでないので見当はずれだったらごめん
rootで
/etc/ld.so.confにディレクトリ書くか
/etc/ld.so.conf.d/にディレクトリ書いたファイル作って
ldconfig実行する
580 :
570 :2007/11/26(月) 14:33:06
>>580 やっぱりそれしかないでしょうか?
ごめんなさい、またちょっと長くなりますが、
うちで一晩やってみて、ますますわけが分からなくなった。いったんmysqlからは離れますが、
/*--- dl.pl ---*/
#!/usr/bin/perl
use DynaLoader;
print "Content-type: text/plain\n\n";
print map("$_<br>\n",@DynaLoader::@dl_library_path);
/*--- apr_t.pl ---*/
#!/usr/bin/perl
use ARR;
use ARR::Pool;
use APR::Request; #これはlibapreq2用なのでなくてもいいです。
print "Content-type: text/plain\n\n"
print "APR OK!"
と簡単なファイルを二つ作って、コンソールからと、Apache(CGI,mod_perl両方)からテストしてみたんですが、
# perl dl.pl -->出力 /usr/lib /lib /usr/local/lib (実際は改行されます)
# perl apr_t.pl --> Can't load ・・・ libaprutil-1.so が開けません。そんなファイルありません。
http://localhost/cgi-bin/dl.pl -->コンソールと出力同じ
http://localhost/cgi-bin/apr_t.pl -->500 Internal Server Error (エラー内容はコンソールと同じ)
http://localhost/mod_perl/dl.pl -->コンソールと出力同じ
http://localhost/mod_perl/apr_t.pl --> APR OK!
ここまでは予想通りなんです。でも・・・
581 :
570 :2007/11/26(月) 14:33:39
export LD_LIBRARY_PATH=/usr/local/apache2/lib ; perl dl.pl --> /usr/lib /lib /usr/local/lib "/usr/local/apache2/lib" <-増えた!
export LD_LIBRARY_PATH=/usr/local/apache2/lib ; perl apr_t.pl --> APR OK! (よし、ちゃんと読んでるようだ)
では、cp /usr/local/apache2/lib/* /usr/local/lib/ してから、
http://localhost/cgi-bin/dl.pl --> /usr/lib /lib /usr/local/lib ( <-ちゃんと、/usr/local/lib あるよな?)
http://localhost/cgi-bin/apr_t.pl --> 500 Internal Server Error! (なんで〜?)
そこで、# unset LD_LIBRARY_PATH して、/usr/local/lib/〜には、libapr-*.soがある状態で、
# perl dl.pl --> /usr/lib /lib /usr/local/lib (最初といっしょ)
# perl apr_t.pl --> Can't load ・・・ libaprutil-1.so ・・・ /usr/local/libを読んでくれない...orz ってな状況です。
う〜ん、@DynaLoader::dl_library_path って、DynaLoaderが、.soファイルを探し出すための検索Dirじゃないの?
うちでの環境は、/usr/local/apache2/にApache2.2を手動でインストール、mod_perlもこのApacheめがけてmakeしてあり、
/usr/lib/以下には、これらのLibrary(.so)が一つも入ってない状態です。(rpm系からインストールすると、/usr/libにsoが入ります)
似たような環境の人で、お手すきの方いましたら試してもらえませんか。(そんな人いない?
582 :
580 :2007/11/26(月) 14:40:53
読まずに当てずっぽうを言うが、-Lじゃなくて-Rの話と違うのか?
>>583 ??? すいません。わかりません。
多分 -Lとは、gccとかのコンパイル時のオプションで、linkまたはlink(lib)pathのことだと思いますが、
-Rってのがわかりません。
gccのオプション一覧で探しましたが見つからず、perlにも、そのようなオプションはないようですが・・・。
>>581 > cp /usr/local/apache2/lib/* /usr/local/lib/ してから
この辺りちょっと気になる。
linuxはかじった程度だからあってるかどうかあやしいけど、
LD_LIBRARY_PATHをセットしたとしても、.soファイルに静的にリンクしている場合、
コピーしただけじゃリンク先が変わらないから、その辺りが原因じゃないかなぁと思う。
LD_RUN_PATHの話じゃないのか
長くて読んでないが、runtime library search pathの話なら、 LD_RUN_PATHかLD_LIBRARY_PATHかDT_RUNPATHかDT_RPATHの話か?
588 :
570 :2007/11/26(月) 17:30:10
>>585 そうなんですか。でも多分APR.soとかAPR::Pool.soは動的リンクだと思います。
現に上の状態から、cp /usr/local/apache2/lib/* /usr/lib/ で、
# perl apr_t.pl も
http://localhost/cgi-bin/apr_t.pl も APR OK! となります。
(コピーしただけ、/sbin/ldso とか LD_LIBRARY_PATHは何も操作してない。)
つまり、DynaLoader.pmは、/usr/lib にあるライブラリはちゃんと探し出して、読み出しに行ってくれてるみたいです。
>>586 ,587
LD_RUN_PATH DT_RUN_PATH DT_RPATH
これらの環境変数は知りませんでした。今ちらっとmanpage読んだんところ、
コンパイル時に、指定のライブラリパスをバイナリに埋め込むようなんですが、
目的のことと、ちょっと違うような気がしますが、とりあえずもう少し詳しく調べてみます。
httpd.confにSetEnv LD_LIBRARY_PATHが無い
>>580 のtestコードは構文エラー
素直にrpm使えば?
自宅のプロバからは、書き込み規制中で、昨日は書き込めませんでした。
>>589 すいません。
>>580 の、dl.plの4行目は正しくは print map("$_<br>\n",@DynaLoader::dl_library_path); です。
後ろの”@”は不要でした。apr_t.plの方は、
>>582 の通りです。
> httpd.confにSetEnv LD_LIBRARY_PATHが無い
> 素直にrpm使えば?
Apacheの環境変数LD_LIBRARY_PATHをCGIに渡せることは確認しました。
でも、せっかく提示してもらって恐縮ですが、そうゆうことではなく、また、別にRPMが使いたくないとかでもなく、
>>570 みたいなことが目的です。
>>580 ,
>>581 は、今の自分の環境で、すぐに試せそうなテストを書いてみたわけです。
ワンライナー風にするなら、export LD_LIBRARY_PATH=/path/to/lib; perl script.pl のような感じで出来るのは
確認しましたが、Makefileの中とかで、shやperlを多重に(?)呼び出す(子プロセスから子プロセスみたいな感じの)時は
上のようなコマンドでは無理なようです。(子プロセスや、suidには、LD_LIBRAY_PATHを渡せないような記述を見かけました。)
そこで、DynaLoader.pmの@dl_library_pathに注目してみたわけです。
連投すいません。
>>レス頂いたみなさま
あれから昨夜、LD_〜環境変数や、/lib/ld.so、/sbin/ldsoconfig等をもう少し詳しく調べてみたんですが、
自分は、DynaLoaderや@dl_library_pathについて、重大な思い違いをしていたみたいです。
http://search.cpan.org/~nwclark/perl-5.8.8/ext/DynaLoader/DynaLoader_pm.PL こことかを参照して、@DynaLoader::dl_library_pathは、DynaLoader(perl)が.soファイルを検索するためのPATHだと
思っていたんですが、その(perlが)検索する.soファイルは、あくまで{perl-module-name}.soであり、
そこから先のDLLについては、一切感知してないようです。
例えば、上のapr_t.plの例で言うと、
1: use APR; --> perlが@INCから、APR.pmを探し出してLoadする。
2: APR.pm内のuse DynaLoader; --> DynaLoaderが、@dl_ibrary_pathから、APR.soを探してLoad
3: APR.soはlibaprutil-1.soに動的リンクしているので、こいつを探し出してからLoad(AP2.0.Xならlibaprutil-0.so)
4: perlがscriptをコンパイル and 実行
自分は今まで、この’3’の段階まで、DynaLoaderの仕事とばっかり思ってたんですが、実際は’2’までで、
’3’については、システムのld.so(ld-linux.so)の仕事のようです。
上のURLの内容や、export LD_LIBRARY_PATH=/path/to/lib; perl dl.pl の出力結果などにより、勘違いをしてました。
perlからLoadされる.soだから、当然perlプロセスの管理下だろうし、そのライブラリを検出したりするために、
@dl_library_pathがDynaLoaderには組み込まれてるんだろうと思ってました。実際はほとんどのperl-modlueが、
@INC内で完結するか、ld.soのデフォルトpathである、/lib,/usr/lib内で見つかってしまうのと、さらに、
export LD〜=〜/lib で、@dl_library_pathに 〜/lib が追加されてしまうため、
@dl_library_pathとゆうのは、perl内部でのみ有効なLD_LIBRARY_PATHだと混同しておりました。
実際には、@dl_library_pathにある /usr/local/libは、ld.soの検索対象PATHには含まれていない為、
>>581 のような結果になるのは当然でした。
今まで色々とアドバイス等、ありがとうございました。
Perlのモジュールか何かでsnmptranslateと同じようなことって出来ない? .1.3.6.1.2.1.1.1.0 <--> SNMPv2-MIB::sysDescr.0 みたいにOIDの表示形式を変換したいんだけど
調べてないんだけど、Net::SNMPあたりにないん?
594 :
デフォルトの名無しさん :2007/11/28(水) 11:06:34
質問です。 自分でfirstというディレクトリを作成し その中にsecondというディレクトリを作成するにはどうしたらいいですか? chdirで作業ディレクトリをfirstにうつせば出来るんですが その後、またもとのディレクトリに戻る方法が分からないため挫折。
( ゚д゚)
597 :
デフォルトの名無しさん :2007/11/28(水) 12:03:30
>>594 ディレクトリ作るだけなら
>>596 でもいいが
これからもプログラミング続けるなら
相対パスでググって出てきたページを100回ほど音読しとけ
でもchdir 'hoge'したあとchdir '..'で戻れるとは限らなかったりする。(hogeがsymbolic linkの場合) 自分で今作ったディレクトリなら大丈夫だとは思うがね。 fchdirがあるシステムなら、カレントディレクトリを開いてファイルハンドルを保存、戻りたくなったら とっといたファイルハンドル指定でchdirするのが楽ですな。(5.8.8以降)
質問なのですが、特定のキーが押されているかどうかって、 どうやってチェックするのでしょうか? <STDIN>とかTerm::Readkeyだと、入力待ちになってしまいますよね。 動作を止めずに、特定キーが押されている時だけ分岐したいのですが。
>>593 調べてみてNet::SNMPにtranslateってものがあったけどOIDの変換はなさそうだった
Net::SNMPのリクエストで使うOIDを.1.3.6.*みたいな数字形式じゃなくて
SNMPv2-MIB::sysDescr.0みたいな形で指定したかったんだけど何か無いんだろうか
602 :
デフォルトの名無しさん :2007/11/28(水) 23:50:07
多分アホらし過ぎる質問だろうけど誰か助けて orz ActivePerl5.8インストールしようとしたら Indalid Drive:G とか出てくる ちなみに外付けを必要によって接続したりしなかったりで使ってるのが原因ぽいです 対処法をだれか・・・
>>602 subst g: c:\
とでもやってみたら?
それで回避できるのか分からんが。
>>601 CPANのSNMPかSNMP::MIB::Compilerあたりが使えそうだが
Excelで書き出したCSVを読み込もうとしています Excelで一つのセル内に改行が入っていた場合、CSVに書き出すと abcd,efgh,"ij kl" ABCD,"EF GH",IJKL このようにダブルクォーテーションで囲まれた中に改行がそのまま入ります。 全体を配列等に格納するまえに、こういった改行を別な文字(例えば<br>)に置き換えておこうと思い 正規表現でどうにかしようと考えました。 セル中の改行が一つなら s/"(.*?)¥n(.*?)"/$1<br>$2/g これでどうにかなるのですが、改行が複数の場合どうすれば良いのでしょうか。
そんなこと自前でやらずにText::CSVでも使えばいいと思うよ。
エクセルで改行置換しろ 検索する文字列にCtrl+Jな
608 :
デフォルトの名無しさん :2007/11/29(木) 18:31:49
>>605 たしか Windows の改行コードは \r\n の2バイトで
セル内の折り返しは \r の1バイトだったと思います。
この違いを利用して \r を <br> に置換するだけ
chomp;
s/\r/<br>/g;
というチョ〜手抜きでも実用上はOKじゃないかな。
神経質な人にはオススメできませんけど。
>>605 そんなこと考えるよりText::CSV_XSインストールしてgetline使え。
610 :
605 :2007/11/29(木) 19:32:31
回答ありがとうございます。
>>606 >>609 まさにうってつけのモジュールがあるんですね。
調べてみます。
>>608 そんな構造になっていたとは。試してみたいと思います。
>>607 なるべくエクセル側では手間のかからないようにしたかったのです。
関数の引数として、第一引数に配列、第2引数に文字列を渡したいのですが、 下のようにしても受け取るのができませんでした。 配列と文字列の関係を維持したまま引き渡すことは可能でしょうか? &array_test(@arr,$str); sub array_test { @arr=@_[1]; $str=$_[2]; }
ActivePerlつかっているんですが、 ppmでYAML::Syckをインストールして使おうと思ったら Syck parser (line 3, column 0): syntax error at C:/Perl/site/lib/YAML/Syck.pm line 53, <FH> line 1. とエラーが出てしまいます。 YAML-Syckのバージョンは0.91 同じ症状のひといますか?
&array_test(\@arr,$str); sub array_test { @arr=@$_[0]; $str=$_[1]; }
615 :
デフォルトの名無しさん :2007/11/30(金) 01:28:47
すみません、動詞を三人称単数現在にするモジュールってありますか?
616 :
デフォルトの名無しさん :2007/11/30(金) 01:43:48
$a の行頭に、$n 個の全角スペースを挿入したいんですが、 どうすればいいでしょうか?
>616 for文で回しながら1個ずつくっつける。
618 :
616 :2007/11/30(金) 01:53:55
>>617 なるほど
でも、できればいっぺんに挿入したいんですけど、
そういうやり方はないでしょうか?
>>616 $a = 'AAA'
$n = 10;
$a = ’ ’ x $n . $a;
620 :
616 :2007/11/30(金) 02:32:31
>>619 ありがとうございます
うまくいきました
621 :
617 :2007/11/30(金) 02:37:32
>619 そんなのあったのか。勉強になった、ありがとう。
substr($a, 0, 0, " " x $n); substr($a, 0, 0) = " " x $n;
623 :
デフォルトの名無しさん :2007/11/30(金) 02:58:03
>>615 > すみません、動詞を三人称単数現在にするモジュールってありますか?
lingua stemあたりでCPANを検索しる
624 :
612 :2007/11/30(金) 03:58:40
自己解決しました。 yamlファイルのデータのコロン(:)の後に半角スペースがなかっただけでした。
626 :
625 :2007/11/30(金) 08:36:41
リロードしてなかった上に読み間違えだったわすまそ
「->」演算子について質問です 「->」演算子は、配列/ハッシュリファレンスにデリファレンスを 行う際に使用する演算子と理解しています。 しかし、パッケージ名に対して使用すると、 対象パッケージに含まれる関数を呼び出すこともできます…。 これは、 「->」演算子は、 ・配列/ハッシュリファレンスに対して使用するとデリファレンスを行う ・パッケージ名に対して使用すると関数の呼び出しを行う と、理解すればいいのでしょうか? ※「->」演算子は、"配列/ハッシュリファレンス"に使用する場合と "パッケージ名"に対して使用する場合では、全く別ものということでしょうか? 以上、何かレス頂けたらありがたいです。
>>627 デリファレンスは「配列/ハッシュ」に限らない
関数呼び出しは「パッケージ名」に限らない
>>627 左側の形で決まる。詳しくはマニュアル読め。
デリファレンス
...->[...]
...->{...}
...->(...)
メソッド呼び出し
...->method_name
...->$scalar_variable
630 :
627 :2007/11/30(金) 11:50:38
>>628 早々のレスありがとうございます。
>>デリファレンスは「配列/ハッシュ」に限らない
そのようですね。
関数へのリファレンスをデリファレンスすることもできるようですね。
>>関数呼び出しは「パッケージ名」に限らない
これは、
Perlにおけるクラスインスタンス(リファレンス)に対しても使用することができ、
関数の呼び出すことができる
ということをおっしゃっているのでしょうか?
そもそもなのですが、「->」演算子って、なんなのでしょうか?
…続く
631 :
627 :2007/11/30(金) 11:54:15
>>629 レスありがとうございます。
続きを書こうとしたところで、解答をいただけたので
やめておきます。
左辺のきまるのですね^^
と、いうことは、「->」演算子は、
「->」の左辺によってまったく異なる動きをする
と解釈してよろしいのですよね・・・
マニュアル・・・
Perlの言語仕様が日本語で書かれているサイト・・・
探してみたのですが・・・
もう少しさがしてみます。
ありがとうございました。m(_ _)m
632 :
629 :2007/11/30(金) 12:07:36
すまん、左側じゃなくて右側
関数じゃなくてメソッドでしょ。 左辺がパッケージ名ならクラスメソッド。インスタンス変数ならインスタンスメソッド。
634 :
デフォルトの名無しさん :2007/11/30(金) 17:22:22
すみません。どなたかご教授願えたらと思います。Perl初心者です。 あるバイナリファイル(test1)をLinuxのコマンド上で # od -a test1 > test2 そして # od -f test1 > test3 としてtest2,test3のファイルが生成されるのを同じようにPerlでプログラム するにはどのようにしたらよろしいのでしょうか。 unpackなどを使ったらよろしいのでしょうか。 ご存知の方がいらしたらよろしくお願いしたいと思います。
635 :
デフォルトの名無しさん :2007/12/01(土) 04:58:30
system "od -a test1 > test2"; system "od -f test1 > test3";
636 :
636 :2007/12/01(土) 09:57:23
すみませんが、どなたかご教授をお願いいたします。
目的:
Perl から形態素解析エンジン Mecab を呼び出したいとおもいます。
操作:
WindowsXP Professional SP2環境に
Mecab (
http://mecab.sourceforge.net/ )自己解凍インストーラ (mecab-X.X.exe) を実行して
インストールしたのち、
Perl のスクリプト言語バインディングをダウンロードして動作させようとしましたが、
>perl makefile.PL
のときに mecab-config が無いとか言われ、Perl から Mecab を呼び出す環境が構築できません。
備考:
Yahoo! の形態素解析呼び出しは簡単なのですが、
「 Yahoo!に文書ログを取られ放題の可能性あり。 」
という状態はまずいので、Mecab を使いたいと思っています。
>>636 Mecabのバージョンは?
WindowsでMecab使ったことあるけれど、
インストールで躓いた記憶なし。
639 :
636 :2007/12/01(土) 16:17:21
>>638 さま
Mecab のバージョンは 0.96 (最新)です。
->[ EXPR ] で一つの後置演算子 ->{ EXPR } で一つの後置演算子 ->IDENTIFIER で一つの後置演算子 とでも捉えればいいんじゃない? >「->」演算子は、配列/ハッシュリファレンスにデリファレンスを >行う $a = ['unko']; print(($a->)[0]); こう出来るのであればともかく、その捉え方は違う気がする。
ちょwwww更新してなかったwwwおのれJaneめ。朕を辱めおって。ゆるさん!
あるモジュール(Aとする)があって、ロード先の名前空間に 別の特定モジュール(これをBとする)がロードされていなければ、 そこにBをロードする、というコードを書きたいのですが、 ロード先にBがロードされているかどうか、Aで調べるには どういうふうに書けばいいですか? Bのメソッドをcanで調べるぐらいしか思いつかないんですが・・・
643 :
636 :2007/12/01(土) 18:05:00
>>642 ${A::}{B::}
でいけると思うけど、今perlの環境がないので未確認。
use Encode; print encode('utf8', 'う'); としても う と表示されエンコードしてくれません。 Encodeのバージョンは2.23です。 何か原因が考えられますか?
646 :
645 :2007/12/02(日) 01:20:04
すいません。変換されてしまいました。
>>645 は↓が正しいです。
use Encode;
print encode('utf8', '&#x3046;');
としても &#x3046; と表示されエンコードしてくれません。
Encodeのバージョンは2.23です。
何か原因が考えられますか?
はぁ?Encodeって何するモジュールかわかってんの?
>646 use Encode; print encode('utf8', "\x{3046}"); >何か原因が考えられますか? >645 の脳が足りない、……とまでは言わないが色々と理解が足りないと思う。
>>645 何がやりたいかを書いた方が、適切な返事がもらえると思われ。
650 :
デフォルトの名無しさん :2007/12/02(日) 17:07:52
エンコードしたいって書いてあるだろ
651 :
デフォルトの名無しさん :2007/12/02(日) 17:11:03
sub url_encode($) { my $str = shift; $str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg; $str =~ tr/ /+/; return $str; }
652 :
デフォルトの名無しさん :2007/12/02(日) 17:12:56
use CGI::Lite; print url_encode('うんこ');
653 :
デフォルトの名無しさん :2007/12/02(日) 17:40:09
ここでいいのかわかりませんが、質問失礼します。 PerlでImageMagickを使って、画像の拡大や縮小を試しているのですが、 Resize()やScale()など、拡大縮小にも様々な方法があり、どれを使うべきか迷っています。 なるべくきれいに、画像のサイズ変更のみをしたい場合はどれを使うべきなのでしょうか?
全部試してみて仕上がりが好みのやつが いいんじゃないかな
655 :
デフォルトの名無しさん :2007/12/02(日) 17:57:25
「 PerlMagic CGI 」でググれ。 縦横比を変化させずに、横幅を 120 にするには、 my $ImageMagick = Image::Magick->new; $ImageMagick->Read("unko.jpg"); $ImageMagick = $ImageMagick->Transform(geometry=>120); $ImageMagick->Write("gif:unko.gif");
656 :
デフォルトの名無しさん :2007/12/02(日) 18:03:09
おっと訂正。k が抜けてました。 「 PerlMagick CGI 」でググれ。 「きれいに」 って言うのは、縦横比が歪まないようにって事でOK? 画質はどうやっても変わらんと思うよ。
単なる画像のリサイズにもいくつかアルゴリズムがあって 最も単純なのはジャギーが出て、画質が悪いように見える。
658 :
653 :2007/12/02(日) 19:07:18
>>654-657 レスありがとうございます。
縦横比はそのままでジャギーなどがあまり出ない方法が良いのですが、
色々試してみたところ、Resize()でも比率そのままできれいに出来ましたので、
とりあえずResize()を使っていこうと思います。
>>657 ImageMagick(PerlMagick)でリサイズするときに、アルゴリズムって選べたっけ。
>659 SampleとScaleとResizeだと画質が違ったはず
>>665 別人だが、そんな方法があったのね。
自前でサイズ測って拡縮してた。
662 :
659 :2007/12/03(月) 19:43:08
>>660 そいや、Sampleだと細かい指定ができずに画質も汚かった気がする。
昔作ったリサイズスクリプトでは、Resize()を使ってた。
663 :
661 :2007/12/03(月) 19:51:10
あ、いや、自己レスで申し訳ないが、>661は勘違いだった。 縦横ともに上限があって、その中に収まるように縮小だから自前で計算してたんだった。
結局どれが一番きれいだったんだろう…
どれもきれいで、一番いいよ
お前が一番きれいだよ
ありがとう(*´д`*)
CPANにあるPoCo::YahooMessengerって 今のyahoo chatで使えるんでしょうか? 使った経験のある方います? CPANに上げたのが02 Dec 2002になってるんですけども…。
もの凄く下らない質問なんですが open (FH,$file); binmode FH; read (FD,$hoge,-s $file); と open (FH,$file); binmode FH; undef $/; $hoge = <FH>; って何か差はあります?
$/ の説明で以下の部分があるので、違うんじゃないかな。 >Perl5.005-では、未定義にすると空のファイルからの最初の読み込み時には空文字列が得られ、次回からは未定義値が得られる
>>670 -s は stat してるので、stat でサイズを返さないファイルだと動かない。
undef $/ は read() で eof になるまで読むからdeviceとかも動きそう。
$word に 連続したシフトjisのひらがな・カタカナ・漢字が3文字入っているか チェックするにはどうすればいいでしょうか? 3文字連続した日本語が入っていなければ、スパムとみなしたいのです。 if ( $word !~ [シフトjisのコード][シフトjisのコード][シフトjisのコード]) { print "これはスパム"; } みたいな感じでしょうか?
674 :
デフォルトの名無しさん :2007/12/07(金) 22:33:43
おおむね合ってるけど、細かく言えば if ($word !~ m/[シフトjisのコード]{3}/) { print "スパム"; } {3} を使えば3回連続という意味になるよ。
>>672 ありがとう。参考になりました
内部的にはread()なんだね
>>673 こうするとSJIS以外も対応できそう
@mb_strings = split /[ -~]+/, $word;
unless(grep { length $_ > 6 } @mb_strings){
print "これはスパム";
}
677 :
676 :2007/12/08(土) 01:17:30
逆にSJISの下位バイトで切っちゃってまずいな。 もう一ひねり入れると気持ち悪くなるし…。
連想配列は呼び出すたびに呼び出す順番が 変わると聞いたのですが、実際やってみても 毎回同じ順番になってしまいます。 同じ順番になる条件や環境ってあるのでしょうか?
>>678 perldoc -f each
> Entries are returned in an apparently random order. The actual
> random order is subject to change in future versions of perl,
> but it is guaranteed to be in the same order as either the
> "keys" or "values" function would produce on the same
> (unmodified) hash. Since Perl 5.8.1 the ordering is different
> even between different runs of Perl for security reasons (see
> "Algorithmic Complexity Attacks" in perlsec).
>>679 ランダムになるはずですよね…
%LIST=(
"2"=>"0,0,0,,,","3"=>"0,0,0,,,","4"=>"0,0,0,,,",
"5"=>"0,0,0,,,","6"=>"0,0,0,,,","7"=>"0,0,0,,,",
"8"=>"0,0,0,,,","9"=>"0,0,0,,,","10"=>"0,0,0,,,",
);
while (($Key,$Value) = each %LIST){
print "$Key,$Value\n";
}
をコマンドプロンプトから実行しても
同じ結果しか表示されないですorz
>>680 > ランダムになるはずですよね…
毎回異なるわけではない
>>681 なるほど。
しかし、10回やっても、20回やっても
すべて同じになってしまいます。
「ランダム」っつうか「適当」じゃないか? 均一なランダムになるものとは思えん。
ていうか
>>678 は、ランダムという言葉に何か別のイメージを持っているんだろう。
680の%LISTを呼び出すと 適当な順番で呼び出されるけど %LISTの内容が同じだったら、 呼び出される順番は常に同じ?
ハッシュを「魔法の小箱」みたいに思ってるレスが痛い。 実装することを考えれば、何がrandom orderで、何が固定されるかくらいわかるだろうに。
?? 妙な空間になってるな
燃え上がーれーランダムー
簡単に説明してやると、順番が保証されないだけだろ。 だから仕様上、同じになっても違っていてもおかしくはない。 ほんとにどうなっているのか知りたければ、ソースでも嫁。
693 :
デフォルトの名無しさん :2007/12/10(月) 20:39:01
”ハッシュ” という言葉の意味を理解してないだろ。
一般論を語る前にドキュメント読めよ……
perl のサブルーチンって、C の関数って解釈でいいんでしょうか? それと、サブルーチンの宣言と内容は使用するプログラム内で、 サブルーチン使用箇所より上の行なら構わないんですか?
>>696 ありがとうございました
知りたい範囲のことはわかりました
698 :
デフォルトの名無しさん :2007/12/11(火) 15:03:34
どうやって調べていいかわからないんで教えてください コマンドラインで test.pl なら標準出力、「-o ファイル名」を付けたらファイルに出力というプログラムを作ろうと思ってます で、この場合の書き方ってどうするのがいいものですかね? オプションにありなしをGetopt::Longで拾って if (オプションあり) { open my $wfh, '>', ファイル名; print {$wfh} '出力'; close $wfh; } else { print '出力'; } ってやろうとしたのだけど、一般的にもっといい方法あるのかな?と。 あと、こういうことを調べたい時に何で調べると良いか誰か知ってたらヒントください。
>>698 > あと、こういうことを調べたい時に何で調べると良いか誰か知ってたらヒントください。
同じようなことをやっているプログラムを読む
>>698 $wfh = *STDOUT;
print $wfh '出力';
>>698 my $file = '-';
if (オプションあり) {
$file = 'ファイル名';
}
open my $wfh, ">$file";
print '出力';
close $wfh;
702 :
698 :2007/12/11(火) 16:26:57
ありがとう、ありがとう
>>699 おぉ。CPANを漁ったりして中身を見る?
>>700 分岐はどこですれば良いですか?
openしちゃうとファイル名のファイルが出来ちゃうかファイルハンドラの前でやる?
>>701 いけた!3つの引数のopenでもいけました。
print {$wfh} "出力"
ですよね?
703 :
デフォルトの名無しさん :2007/12/11(火) 20:14:01
質問の回答とは違うけど、そういうときのために > があるんだが、それは選択肢に入れないの? つまり test.pl -o ファイル名 とするかわりに test.pl > ファイル名 とすればいいだけ。中身はただの print 文だけでいいんだけど。
704 :
698 :2007/12/11(火) 20:26:15
>>703 cronで自動的にアクセスログを処理しようとしたのでファイル名も自動で作りたかったんですよね
で、スクリプトを1つで完結させたいなと思い、perlの中に書いてしまおうかなと。
ただ、標準出力で試す時もあるだろうから、そのための道も用意しておきたかったんです。
>>702 print {$wfh} "出力"
このブレースは何のためにつけてるの?
というか、どこで覚えたの?
708 :
デフォルトの名無しさん :2007/12/12(水) 14:47:39
すみません。Perl初心者です。 どなたかご教示願えたらと思います。 1行目 no no no no no no no no A B C D no no no 2行目 no no no no no no no no A B C D E F G 3行目 H I J K no no no no A B C D E F no 4行目 no no no no no no no no A B C D E F G 5行目 H I J K L M N O P Q R no no no no 6行目 no no no no no no no no A B C no no no no 上記の様にそれぞれの行がスペースで区切られた16のフィールドを持つ ファイルから ABCD,ABCDEFGHIJK,ABCDEF,ABCDEFGHIJKLMNOPQR,ABCという配列を抜き出 すにはどのようにしたらよろしいのでしょうか? 1. 名前の始まるフィールド(Aの位置)は決まっています。 2. 4~6行目の様に名前が長く次の行のAのフィールドまで達すると、次の 名前は更に次の行から始まってしまいます。 1行ずつ読み込む方法ではループがクロスしてしまい、nextやlastを使って も私の能力不足で上手いようにはいきません。 申し訳ございませんが、どなたかお教え頂けたらと存じます。
ずらしちまえ 0行目 no no no no no no no no 1行目 A B C D no no no no no no no no no no no 2行目 A B C D E F G H I J K no no no no 3行目 A B C D E F no no no no no no no no no 4行目 A B C D E F G H I J K L M N O P Q R 5行目 no no no no no no no no no no no no 6行目 A B C no no no no
腐った入力データフォーマットの方を何とかした方がいいとは思うが: my @a; while (<>) { chomp; for my $x (split) { if ($x eq 'no') { # do nothing } elsif ( $x eq 'A') { push @a, $x; } else { $a[-1] .= $x; } } } Aじゃないものではじまる名前があったときはどうなっても知らん。
undef $/ で読んで /(?<=no )(?!no )(.+?)(?=no )/g とマッチ
こうかな open(IN,"hoge.txt"); undef $/; $_ = <IN>; s/\n/ /g; @list = /(?<=no )(?!no )(.+?)(?=no )/g;
noは必ずnoか? A〜Rは?
HEXダンプの臭いがする
715 :
デフォルトの名無しさん :2007/12/12(水) 17:40:27
すみません708です。 みなさま、いろいろご教示ありがとうございます。 説明不足で大変申し訳ございません。 すべてを配列として読み込んでjoinした後、(no)+で区切って配列化すると、 実際の名前の部分(上記の大文字の部分)にn oという文字が入っていた場合、 名前のその部分が削られてしまって、正しく名前が抽出出来なくなる問題が あります。(必ずしもA B C D . . .ではないです。すみません) noは必ず1フィールドにnoですが名前は1フィールドに1文字で任意です。 説明不足またはご指摘とは違っていたら申し訳ございません。
:Dn
>>708 何かのログだと思うけど、
普通に行くならこんな方法。
1行ずつ読んでって先頭がnoじゃなければ前のレコードにくっつける
くっつけた状態で1行の処理を始める
もしそれがCSVならもっとまともな方法がある
Aから、次のAかファイル終端までの文字列取り出して 英字以外を外せば完成じゃん
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; open(my $fh , '<' , '708.txt') || die($!); (my $data = do {local $/;<$fh>}) =~ s/\r?\n//g; my @data = split /\s+/,$data; my @R = (); my $i = 0; for(@data){ if($_ eq 'no'){ $i++ if defined $R[$i]; next; } push(@{$R[$i]},$_); } my @R2 = map join('',@{$_}),@R; print Dumper(@R2);
エレガントじゃないな
>>708 が理解できてなさそうだったから
分かりやすいようにifとかnextとか使って書いてみたんだが
723 :
698 :2007/12/13(木) 13:53:25
>>705 > print {$wfh} "出力"
> このブレースは何のためにつけてるの?
亀レスでごめん。Perlベストプラクティスで見たような気がする。
普通の変数を出力しようとしてるのか判断がすぐつくようにとか。
今手元にないからもしかしたら勘違いしてるかもだけど。
>1. 名前の始まるフィールド(Aの位置)は決まっています。 open my $fh , "dump.txt"; my @data; while(<$fh>){ push(@data,split(/\s/)); } print join("-",@data),"\n"; print join("",grep(!/no/,@data[8..22]));
区切り文字にはスペースはカンマはあんまり使わんなあ俺。 ものぐさなもんでタブばっかだ…orz
すみません、 任意の時間ID(年月日時分秒の14桁で、例えば20071213123401)を、 UTC(unixtime)に変換する方法を教えてくださいませ。 Time::Localは使えません。 どうぞ、よろしくお願いしますm(__)m
727 :
デフォルトの名無しさん :2007/12/13(木) 18:41:17
use POSIX; して mktime 使えばいいよ。
ありがとうございます! use POSIX; でチャレンジしてみます
729 :
デフォルトの名無しさん :2007/12/13(木) 23:09:08
ちょっと質問です。 ActivePerl 5.8.x を知る上でのお勧め書籍を教えてください。 C/C++ 上がりなんで、差分について詳細に記載があるものが希望です。
ActivePerlは、Perlを動かすためのソフトであって、 Perlの文法とか、そーゆーのとは違うぜ。
C/C++とPerlの差分について扱っている書籍はしらんなぁ・・・
俺もC++からだったけど、continue はどうやるんだみたいなのも、 とほほとか見てなんとかなったっよ。
あー、でもC経験者は数が多いからか、 last next if elsif とかに、「C経験者は間違えないように!」って書いてる本はあるな。
ActivePerl関係あるの?
736 :
デフォルトの名無しさん :2007/12/14(金) 20:47:19
いちいちActivePerlにツッキミ入れるなよ。しつこいなぁ。
737 :
729 :2007/12/14(金) 23:20:23
>>734 さん
ありがとうございました。
Perl は、いまいち把握していないところが多いので、C風にクドクドと
printf("%s%s",$foo,$bar);
なーんてことをしてしまったりしますが、このサイトがあればなんとかなりそうです。
ところで、最近はピリオドで繋ぐ技を身に付けました。
print $foo.$bar;
さいきんは関数呼び出しに悩む日々です。
ポインター無しに関数への配列渡しをどうすればよいか、とか
構造体はどうやって実現すべきか、などと悩みます。
たぶん Perl 風のエレガントな表記法があるのでしょう。
>>737 配列渡しは、以下のようにやる。適当に書いたから、エラーになるかもしれんけど。
my @hoge1 = (1,2,3);
my %hoge2 = (a=>1,b=>2);
&fuga(\@hoge1, \%hoge2);
sub fuga($$)
{
my($hoge1,$hoge2) = @_;
print $hoge1->[0];
print $hoge2->{'a'};
}
構造体の変わりは、連想配列かな。
バイナリーレベルで必要なら、packでできるけど、結構めんどくさい。
000135 って格納されている数字を 135 とプリント文で出力したいんですけど、 どうすればいいか教えてもらえませんか?
$num = "000135"; print $num-0;
741 :
739 :2007/12/15(土) 18:58:09
>>740 ありがとうございます
上手く表示できました
Math::Random::MTを使ってマルセンヌ・ツイスタな 良い感じの擬似乱数を出したいのですけども、 srandに渡す種はtimeで良いのでしょうか?
>>743 ありがとうございます。
頻繁に呼び出す予定ので
srand(time ^ $$)
はやめておいて、かと言って
srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`)
では時間がかかり過ぎるので、
結局、
srand(time ^ ($$ + ($$ << 15)))
にするとこで落ち着きました。
>>744 乱数の種にPIDを入れてるから毎回違う値がほしいんだろうけど、わざわざ種を指定するメリットは必ず同じパターンのランダムになるってだけだと思う。
>>743 のリンク先を読んだなら、普通はsrand()はいらないって理解できると思うんだけど。
それとも、Perlのバージョンが古いから自分で種を与えないといけないってこと?
746 :
742 :2007/12/19(水) 00:40:52
>>745 Math::Random::MTを使ってメルセンヌ・ツイスタで擬似乱数を作る場合は、
乱数種の設定が必須だからこういう風にしてみました。
線形合同法を使っているcore perlのrand関数は使いたくなかったのです。
下位ビットを捨てたりなんだり工夫すればcore perlのrand関数でもある程度きちんとした乱数も作れるんでしょうけども、
今回はメルセンヌ・ツイスタで作ってみたかったのです。
種無しでMath::Random::MTのsrand呼ぶだけでいいんじゃないの? あとはよきにはからってくれたとおもうんだけど。
749 :
デフォルトの名無しさん :2007/12/19(水) 18:37:16
すみません。大変初歩的なことですが、どなたか教えて頂けたらと思います。 @a=(); for($i=0;$i<2;$i++){ if($i == $a[0]){ print "BAD\n"; }elsif($i != $a[0]){ print "OK\n"; } } とすると、 BAD OK と出力されるのですが、空の配列の要素0は数値0と同等と考えて宜しいのでしょうか。 又、あくまで数値$l=0, 1と空であることを比較演算して、 OK OK と出力されるにはどのような記述があるのでしょうか? 恐縮ですが、どなたかご指導願えたらと思います。
perlop
defined
752 :
デフォルトの名無しさん :2007/12/19(水) 19:43:02
== != は数値に変換してから比較する。("0" == "" ⇒真) eq ne は文字列で比較する。("0" eq "" ⇒偽) @a=(); for($i=0;$i<2;$i++){ if($i eq $a[0]){ print "BAD\n"; }elsif($i ne $a[0]){ print "OK\n"; } }
Perl 5.10.0 がリリースされましたが一言どうぞ
でっていう
俺の使用言語からPerlはほぼ消えたからどうでもいい。
じゃあこのスレからも消えてください
Perl::Tkで、書き込み終えたテキストファイルを自動で開きたいのですが、コマンドラインに パスを渡してしまうと、その時点でperlが終了してしまいます。 $target_text = shift @ARGV; #結果ファイルの指定先パスを格納(*.txt) .....#処理、書き込み、FHクローズ eval exec ($target_result." &"); #ファイルは開くが、スクリプトも終了してしまう eval で囲ってあげても終了してしまいます。Windows環境で上のコマンドを実行するのはムリでしょうか。 よろしくお願いいたします。
759 :
デフォルトの名無しさん :2007/12/20(木) 00:54:53
それが exec の正しい動作だからです。 普通は spawn してから exec します。 もっと簡単なので system を使うという手もあります。
>> 759
ありがとうございました。初めは system でやってたのですが、対象ファイルを開いていると
エディタの「現在開いています...」アラートメッセージ (とか秀丸のアレとか) と、ファイルハンドルの取り合いになって
TKがフリーズしてしまうのです。spawn 試してみます。
>>758 「perldoc -f exec」はもう一度読ませていただきました。ありがとうございました。
>>753 > Perl 5.10.0 がリリースされましたが一言どうぞ
もう安楽死させてあげたらと思った。
>>757 Win32で&とか付けても意味なくね?
"start " . $target_result
のほうがいいかもよ。
>>753 sayとかswitchとか//演算子とか、、、
こんなの5.6あたりで実装しとくか、perl6まで実装しないかの二択だろ?
@+,@-,(?{})を捨てちゃうのも個人的には×だな。
過去スクリプトの見直しをせにゃならんかもしれん、、、
>>763 後半はあんたの読み間違いじゃないんかい?
readdirやglobを使ってるWinユーザは大騒ぎになりそうな仕様に読めるが、
大丈夫なんだろうか?
ますますわけの分からんブキミなカタマリになったんだな。
な、なに?! switch付いたのか! Perlも進化したなw
767 :
デフォルトの名無しさん :2007/12/21(金) 02:10:27
Statistics::Clutoをインストールしたいのですが、make testでエラーがでてしまいます。
どなたか正しいインストールの手順を教えていただけないでしょうか?
以下に私が行った手順を書いておきます。以下の記事を参考にしました。
ttp://blog.livedoor.jp/techblog/archives/64598859.html Clutoのパスは
/home/hogehoge/cluto-2.1.2/Linux-i686/libcluto.a
Statistics::Clutoをダウンロードし解凍した場所のパスは
/home/hogehoge/Statistics-Cluto-0.01
です。
Statistics-Cluto-0.01ディレクトリに移り
$ perl Makefile.PL LIBS='-L/home/hogehoge/cluto-2.1.2/Linux-i686/libcluto.a -lcluto'
PREFIX=/home/hogehoge/local/perl LIB=/home/hogehoge/local/perl/lib
INSTALLMAN1DIR=/home/hogehoge/local/perl/man/man1 INSTALLMAN3DIR=/home/hogehoge/local/perl/man/man3
$ make && make test
としたのですが、エラーがでてしまいます。
エラー内容を貼り付けるのを忘れていました。 t/Statistics-Cluto......1/51 # Failed test 'use Statistics::Cluto;' # at t/Statistics-Cluto.t line 9. # Tried to use 'Statistics::Cluto'. # Error: Can't load '/home/hogehoge/Statistics-Cluto-0.01/blib/arch/auto/Statistics/Cluto/Cluto.so' for module Statistics::Cluto: /home/hogehoge/Statistics-Cluto-0.01/blib/arch/auto/Statistics/Cluto/Cluto.so: undefined symbol: CLUTO_S_BuildTree at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/DynaLoader.pm line 230. # at (eval 3) line 2 # Compilation failed in require at (eval 3) line 2. # BEGIN failed--compilation aborted at t/Statistics-Cluto.t line 9. &Statistics::Cluto::constant not defined at t/Statistics-Cluto.t line 62 # Looks like you planned 51 tests but only ran 2. # Looks like you failed 1 test of 2 run. # Looks like your test died just after 2. t/Statistics-Cluto...... Dubious, test returned 255 (wstat 65280, 0xff00) Failed 50/51 subtests
>>767 > undefined symbol: CLUTO_S_BuildTree at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/DynaLoader.pm line 230.
770 :
デフォルトの名無しさん :2007/12/21(金) 20:15:21
おじいちゃんスイッチなどいらん
またPerlが危篤状態なのか。 今度こそ絶命してくれよ。 しかし、過去の法則からして、そろそろ誰かが爆発的に流行する何かを作るだろうねw 無理矢理蘇生させてしまって、人類の負の遺産がいつまで経っても廃棄処分できないw
お前は本当にPerlが大好きなんだな
Perlのプログラムのコンパイル時間が長いので、perlcc -Bでバイトコードを 生成したのですが、実行すると "Don't know how to handle magic of type \156 at ./a.out line 2." とエラーが出ます。 ぐぐってもperldiagのページくらいしかひっかからないのですが、どのように 調べて直していけばいいでしょうか?エロいひと教えて!
そういう一見無駄なことをして成長していく
Perl扱い始めて5年以上経つんだけどね…OTL 電卓は簡単なものだとばかり思っていたが、半日もかかって鬱だった。 つことで、ちょっと現実逃避しかけてたマジモンの制作に取り掛かる。
PHPでサーバがオンラインかどうかを判定するには、どうすればよい?
アクセスして応答があるかみればいいんじゃね
sayや//はまさに待望の機能だと思うけどな。switchは…、どうでもいいかな。
正規表現の仕様追加はありがたいものが多い。 正規表現のおまけに言語がついているような言語なのに、 MS .netに仕様面で負けてるとこがあっちゃかっこ悪いもんね。
781 :
デフォルトの名無しさん :2007/12/23(日) 15:52:23
そりゃ後出しじゃんけんされたら負けてもしょうがないだろ
> 正規表現のおまけに言語がついているような言語 それはないわww
CPANのおまけに言語がついてきてるんだよな
785 :
デフォルトの名無しさん :2007/12/24(月) 01:43:37
元はテキストエディタの ed
>>787 ed→vi
↓
ex→vedit
じゃなかったっけ?それってSunOSだけ?
viとexは同じもの。
X68000でもedだったよなぁ。。。@ed.x
edを元にラインエディタexを作ってた奴が 作ったスクリーンエディタがvi、じゃねーの? exはviの一部にはなっちまったが元々ex自体はあったはず
>>791 > edを元にラインエディタexを作ってた奴が
× edを元
○ emを元
本当5.10に興味ないんだなw
5になったときには、たしかに目をランランと輝かせながら かぶりつきました。
>>794 あの時のおまえは少女の様な目をしていたよ。
あの時は確かに少女だったんだよ
幼女の方がいい。
変質者だろ。ほっとけ。
ネタならまだしもそっちはほっといちゃいかんだろ
排他制御について質問です。 バージョンはPerl 5.005。また、DBは使えないとします。 以下の2つのプログラムが並行して走っています。 プログラムが走る頻度は、Prog1 >>> Prog2 とします。 Prog1:hoge.txtを読み込み、何らかの処理を行った上で新たなデータを書き込む。(上書きまたは追記) Prog2:hoge.txtを読み込み、処理を行った上でhoge.txtそのものを削除する。(中身を空にするのではない) 個人向けウェブサイトによくあるCGIアクセスカウンタのようなものだと思ってください。 具体的には、Prog1がカウンタで、Prog2でカウンタの「現在の値」を利用した処理を行うというものです。 Prog2でファイルを削除したあとにProg1が実行された時は、hoge.txtが新規作成されるものとします。 Prog1だけ動いている分には、いくらでも排他制御のしようがあるのですが、 Prog2でファイルを削除する部分をどのように実装すればよいか分かりません。 ファイルの中身を空にするだけならflockによる排他制御でいいのですが。 open(FH,"+>>$filename"); flock(FH,LOCK_EX); #何らかの処理 close(FH); #ここでロック解除 unlink($filename); #ロック解除後にファイル削除するのでマズそう
802 :
デフォルトの名無しさん :2007/12/25(火) 22:14:34
言い忘れました。 >801の最後にあるソースは、Prog2のイメージです。
>>801 ロック用のファイルを別に用意すればいい。
>803 具体的にはどういうことでしょうか? 昔懐かしロックファイル方式とか、そういう話?
そういうこと。 消してしまうからにはロックのしようがない
ありがとうございました、検討してみます。
>>801 prog2のcloseとunlinkの順を逆にすればうまくいきそうだけどな。
まぁ、ロックファイル作るのが確実だが。
「昔懐かし」になんかムッとした 何故だっ!?
>>807 UNIX系ならそれでいいけどWindowsだとだめだったきがす
元の質問者がどの環境を対象にしてるのかわからんけんど
5.10いいよ5.10。
特定の場合にしか使えない奇天烈なやり方を考えるのはパズルのようで おもしろいのは否定しないが、実用にするなら手堅くロックファイルに しとけ。 flockを使った排他制御でflock対象のファイルを削除するとだいたい 以下のようなパターンにはまって終わる。 Prog2 open Prog1 open Prog2 flock Prog2 処理 Prog2 unlink Prog2 close Prog1 flock ← 既に開いたファイルはunlinkされてもアクセスできる Prog1 処理 ← 他の誰もアクセスできないファイルにむなしく書き込むのみ これでめでたくデータ消失w
つっこみどころがありまくりと思ったら同一テキストを扱う場合だったのか…なるほど
同一じゃなかったら、そもそもロックの話にすらならないような(笑)
814 :
デフォルトの名無しさん :2007/12/29(土) 16:24:53
5.10と、5.8の違いについて日本語で解説しているところは無いでしょうか? Unicodeに対応したのと、新しい正規表現が追加された ((?-n)、(?+n)、(?(-n)、(?(+n)、\k{name}、\g{name}、\K、(?|、\h、\H、\v、\V) という事は判りましたが、この表現がどういう効果があるのかよく解りません。
816 :
デフォルトの名無しさん :2007/12/29(土) 19:30:27
perlのfinance quoteを使っている人はいますか? どんなことができるのでしょうか?
perl初心者です。 必要に迫られて(仕事ではありませんが…)学習しています。 sjisのデータファイルを読んで、全角カタカナを全角ひらかなに変換しなければなりません。 y、trを試しても駄目でsplitして1文字づつ変換しようとしましたがこれも駄目でした。 やり方をご教示ください。
use utf8; open my $fi, "<:encoding(Shift_JIS)", "in.txt"; open my $fo, ">:encoding(Shift_JIS)", "out.txt"; while(<$fi>) { tr/ァ-ン/ぁ-ん/; print $fo $_; } close $fo; close $fi; ソースはUTF8で保存。
>>818 有難うございます。
今からやってみます。
>>819 できました。有難うございます。
これで用は足りるのですが、後学のために教えていただけると助かります。
つまり、ソースはUTF8で書くのをdefaultにするのがよいのかということと
もう一つ、この例の場合標準出力に出す場合はどのようにすればよいのかと言うことです。
後者は、わからなくても良いのですがなんとなく欲求不満な状態に陥りそうなもので…。
Shift_JISとかの問題点はよくご存知だと思います。 >817の問題もそうですけど、文字列を扱う時はShift_JISよりUTF8の方が都合が良いことが多いです。 仕様上、Shift_JISで入力してShift_JISで返さないとならない場合もありますが、 そういう場合は、内部でUTF8に変換して、最後にまた戻す、なんてことをよくやります。 で。 扱う文字列がUTF8ならソースもUTF8の方が便利よね、と。
初心者用テンプレがいつのまにかいなくなってるじゃないか。
>>820 ソースをUnicodeで書いて入出力もレイヤをかましてUnicodeで行うのが最近の流行りやね
別にUTF8でなくてもいいんだけど、<U+7F範囲の文字を多用するから都合がいいだけ。
で、既に開かれているストリームにレイヤを適用するならbinmode関数を使えばいい。
binmode STDIN, ":encoding(Shift_JIS)";
binmode STDOUT, ":encoding(Shift_JIS)";
これから開くストリームに対してデフォルトのレイヤを指定したいなら、openプラグマ。
詳しい仕様とかは適当にぐぐっといて。
820です。 既存のソースファイルを utf8 にコンバートすべく次のようにやってみましたが、 出力されるのは Shift_JIS のようです。 何が悪いのでしょうか? ご教示くだされば幸です。 use utf8; binmode STDIN, ":encoding(Shift_JIS)"; open OUT, ">utf_$ARGV[0]"; print OUT <>;
826 :
デフォルトの名無しさん :2007/12/31(月) 16:54:18
それは open 文の古い書き方だよね。
>>818 のようにパラメータ3つの open 文を使うといい。
open OUT, ">", "utf_$ARGV[0]";
あと、余計なおせっかいかもしれないが Windows 環境で動かすなら
":encoding(Shift_JIS)" じゃなく
":encoding(CP932)" が適切だよ。
827 :
デフォルトの名無しさん :2007/12/31(月) 17:19:30
binmode でうまくいかないなら use utf8; open IN, "<:encoding(CP932)", $ARGV[0]; open OUT, ">:utf8", "utf_$ARGV[0]"; print OUT <IN> while not eof IN;
<> と <STDIN> は等価じゃない。 この場合は print OUT <STDIN>; あと、shiftjis と cp932 も、変換出来無い文字があったりするから、 Windows環境ならいつも cp932 でおk、って訳でもない。
829 :
820 :2007/12/31(月) 22:00:42
>>828 > あと、shiftjis と cp932 も、変換出来無い文字があったりするから、
> Windows環境ならいつも cp932 でおk、って訳でもない。
何気なく見過ごしていましたが、このような場合、どの時点でどのように対処するのが
効率的か、お教えいただければありがたいです。
831 :
デフォルトの名無しさん :2008/01/01(火) 20:11:22
シフトJIS は Windows だけのものでは無いってこと。
ケータイもシフトJIS。
マッキントッシュもシフトJIS。
古いPC-9801のMS-DOSもシフトJIS。
どのマシンがどのシフトJISを使っているか調べて
それに応じて使い分けよう。
で、Windows は cp932 というシフトJISなわけ。
>>828 はそこらへんを混乱している。
832 :
デフォルトの名無しさん :2008/01/01(火) 20:16:13
ActivePerl v5.8.6 built for MSWin32-x86-multi-thread Archive::Zipで空の(or不正な)ファイルを読み込ませると、エラー文がだらだらと表示されてしまいます。 これを表示させない方法(or read前に正常なzipか判定する方法)があれば教えてください。 ---------- ソースの一部 ここから ---------- $zip = Archive::Zip->new(); die "error\n" unless $zip->read($zipfile) == AZ_OK; ---------- ソースの一部 ここまで ---------- ---------- 出力(パス書き換え済) ここから ---------- format error: file is too short at 〜/site/lib/Archive/Zip.pm line 1015 Archive::Zip::Archive::_findEndOfCentralDirectory('Archive::Zip::Archive=HASH(0x275188)', 'IO::File=GLOB(0x182f7ec)') called at 〜/site/lib/Archive/Zip.pm line 923 Archive::Zip::Archive::readFromFileHandle('Archive::Zip::Archive=HASH(0x275188)', 'IO::File=GLOB(0x182f7ec)', 'test.zip') called at 〜/site/lib/Archive/Zip.pm line 904 Archive::Zip::Archive::read('Archive::Zip::Archive=HASH(0x275188)', 'test.zip') called at 〜/test.pl line 28 error ---------- 出力 ここまで ----------
>>832 ドキュメントのsetErrorHandler()を参照。
$oldErrorHandler = Archive::Zip::setErrorHandler(\&myErrorHandler);
という感じでエラーハンドラを設定できる。デフォルトのエラーハンドラは\&Carp::carp。
my $old = Achive::Zip::setErrorHandler(sub{ });
$zip->read($zipfile);
Archive::Zip::setErrorHandler($old);
とするなりsetErrorHandler(\&Carp::croak)とでもしてアボートさせるなりすればいい。
834 :
832 :2008/01/01(火) 20:58:16
>>833 レスありがとうございました。
エラーハンドラというのは知らなかったので、いろいろと調べてみます。
>>831 > で、Windows は cp932 というシフトJISなわけ。
とすると、 cp932 は shiftjis を完全に内包している筈だけど、そうではない場合がある。
例えば、 "\x{301c}" は、 shiftjis だと正常に変換できるけど、 cp932 だとエラーになる。
cp932 を shiftjis に機種依存文字などを追加したもの、と理解していると、ハマる事がある。
836 :
デフォルトの名無しさん :2008/01/01(火) 21:17:30
>>835 まだ理解してないね。
>Windows は cp932 というシフトJIS
これのどこが「cp932 は shiftjis を完全に内包している」と読めるわけ?
shiftjis など一言も書いてないんだが。
いろ考える前にさ、ネットで検索でもしてコード表とか眺めてご覧よ。
そのほうが早いって。
ころしあえー
shiftjisはシフトJISと同義だろ。
839 :
デフォルトの名無しさん :2008/01/01(火) 21:59:50
掲示板の荒らし対策で、 プロキシ経由の書き込みは、はじこうとして以下のような記述をしたんだけど、 うんちゃらかんちゃら処理を行う前に、白いエラー画面になってしまう。 うんちゃらかんちゃら処理を行わせるにはどうしたらいい。 ネット調べたが、分からん。 ちなみに俺COBOLER。コボプロをせっせと書いて生活費稼いでる。 if ( HTTP_VIA =~ "") {うんちゃらかんちゃら処理}
^^;
841 :
デフォルトの名無しさん :2008/01/01(火) 22:04:18
>>840 いや、そう笑うなって。
馬鹿な質問してるのは、なんとなく分かるんだけど。
if($ENV{'HTTP_VIA'}){}
843 :
デフォルトの名無しさん :2008/01/01(火) 22:21:02
>>842 その記述でも、やっぱ駄目だな。
エラー
リクエストされた URL は取得できませんでした
--------------------------------------------------------------------------------
以下の URL を取得した際に:
http://123cgi.plala.or.jp/oreatamawarui/dousiyoumonaibbs/mousinitai.cgi 次のエラーが発生しました:
アクセスできません.
現在設定されているアクセス制御の設定のため,あなたからのリクエストは受けつけられません.この設定が正しくないと思われる場合には,このサービスの管理者へ連絡してください.
--------------------------------------------------------------------------------
Generated Tue, 01 Jan 2008 13:14:44 GMT by Casper (squid)
ってメーッセージが出た。
プロバイダの設定なのかな。ちなみにぷらら。
つwebprog板
845 :
デフォルトの名無しさん :2008/01/02(水) 01:56:58
よりによって「ぷらら」とは・・・ そこね、ネットサーフィン専用プロパイダと割り切った方がいいよ。 努力しても時間の無駄だと思うな。
>>830 perlのcp932はWindows3.1Jのcp932(から外字を除いたもの)で、今のWindowsのcp932とは
微妙に異なっているからじゃ?
特にJIS X 0213(Shift_JIS-2004)への対応の差で問題が表面化しやすい。
Perlのcp932はShift_JIS-2004に対応していないが、Windows(Vista)のcp932は対応している違い。
Perlは標準のEncodeモジュール自体がJIS X 0213へ対応していないけどね。
やりたい事が Shift_JIS/JIS/EUC-jp 間の相互変換ならば(意外にも)jcode.plが使えるけど、
ちゃんとしたユニコード化が必要なら諦めた方がはやい。
蛇足になりますが。 私自身、shiftjis と共通する部分の文字は全て cp932 でも同じように変換される、と思いこんでいた時期がありました。 しかし実際は、 shiftjis と cp932 、どちらを指定するかで結果が変わってしまう文字が存在します。 あのレスでは、こういう副作用があるので shiftjis の代わりに cp932 を使う時は注意した方がいい、という事を言いたかったのです。 今回の事は、私も勉強になりました。
もしスレ違いならごめんなさい。PERL(正規表現?)教えてください。 「6〜15文字の英数字の文字列チェック」をしたくて、以下の3行プログラムを作りました。 (パスワードの妥当性チェックみたいなイメージです。) #!C:/Perl/bin/perl $pass = "\%pass12"; # \記号無しの"%pass12"でも結果は一緒 print (($pass=~ /[a-zA-Z0-9]{6,15}/) ? "$pass: 妥当" : "$pass: 不正"); 結果は「%pass12: 妥当」になります。 %記号は[a-zA-Z0-9]ではないと思い、結果を不正にしたいのですが、 ググったけど分かりません。どこ嫁ばいいですか?
/^[a-zA-Z0-9]{6,15}$/
ありがとうございました。吊ってきます…。
PerlでYAMLを使ってみようと思い、YAML.pmをインストールしました。 しかし YAML::Load() してみると、データがすべて文字列になります。 例えば - hoge - 123 - true が [ 'hoge', '123', 'true' ] になってしまいます。 これって仕様なんでしょうか。みなさんどうしてますか?
文字列じゃなくちゃんと数値になってるよ。
use YAML;
use Scalar::Util;
print "\$YAML::VERSION = $YAML::VERSION\n";
my $arrayref = Load(<<'__HERE__');
- hoge
- 123
- true
__HERE__
foreach (@{$arrayref}) {
# cf.
http://blog.livedoor.jp/dankogai/archives/50916183.html print "$_: ", Scalar::Util::looks_like_number $_ ? 'num' : 'string', "\n";
}
Dumpしてみればいいじゃないか
>853 looks_like_number って数字に「見える」なら文字列だって真にならない? >852 多分、YAML.pm の仕様。 とりあえず YAML::Syck で $YAML::Syck::ImplicitTyping = 1 にすれば数値になるはず。 他にも YAML 系のモジュールはあるんで調べてみるといいかも。
856 :
デフォルトの名無しさん :2008/01/06(日) 20:03:44
ActivePerl使ってます。 print "start\n"; while(<>){ chomp; last if(/q/); print "ok\n"; } これがcmd.exeでは正しく動くのにCygwinでは動きません。 対話型を要求するスクリプトではいつもそうで、それ以外のだとcygwin上で動きます。 <>を使えるようにしたいのですが、どうしたらいいですか。
>856 Cygwin 上って cmd.exe + bash 上でってこと? 一番安易な解決策だと Cygwin 上では cygwin perl を使う。 後、ck + tcsh on Cygiwn だと use IO::Handle; STDOUT->autoflush(1); してやれば ActivePerl でも動いてるように見える。
858 :
デフォルトの名無しさん :2008/01/06(日) 20:27:01
>>857 cygwin上でperlを使いたいのではなくて、上記のような対話的プログラムを動かしたいんです。
cygwin上でperlを使うことは既にできています。
active perlを使っています。
cmd.exeは普段全く使っていません。
TeraTerm+CygTerm+Cygwinからactive perlへのPATH通してperl使っています。
で、以上はどうでもいいことで、今回の質問の本筋ではありません。
知りたいのは、対話的プログラムについてです。
シェルはbash使っています。
普通は
print "start\n";
while(<>){
chomp;
last if(/q/);
print "ok\n";
}
動きますよね。ところが動かないので、なぜなのか知りたいのです。
違ったプログラムの書き方をすることで動かしたいのではありません。
上記の書き方で動くような設定の仕方を知りたいです。
cygwinというと対話的モードとそうでないモードがあると聞きます。
それが関係あるかもしれません。
以前はcygwinでも上記のようなプログラムが動いていたので、
cygwinでこういうことやろうとすることが間違っているとは思っていません。
きっと設定とかいじればうまくいくはずと思っています。
ところがうまくいかないので困っています。
対話的モードで書いてくれ
860 :
デフォルトの名無しさん :2008/01/06(日) 20:48:04
>>859 対話的モードでプログラムを書くということですか??
それだとしたら意味がわかりませんので教えてください。
cygwinを対話的モードにするということでしたら、やり方が分かりません。
ので、別途調べる必要がでてきます。
それに、cygwinを対話的モードにするだけで解決するかどうかもまだよく分かりません。
説明お願いします。
>>860 >>859 はただの混ぜっ返しだろ。
おれには、あんたが糞くだらないことで蹴躓いているように思えるよ。
いくつか推測ができるが、状況を的確に説明できない質問には答えたくない。
862 :
デフォルトの名無しさん :2008/01/06(日) 21:09:38
>>861 状況をもう一度整理します。
まず、cmd.exeを使っていると書いたのは、めったに使っていなくて、プログラムそのもの
が原因でない証拠を示しただけです。
環境としては、TeraTerm+CygTerm+Cygwinからactive perlへのPATH通してperl使っています。
そして、やりたいこととしては、ダイヤモンド演算子<>を使ってシェル(bash)上の対話的プログラムを
書きたいんです、perlで。
そのための基礎練習として、
print "start\n";
while(<>){
chomp;
last if(/q/);
print "ok\n";
}
というプログラムを書きました。
そして、cygwinから動かしたのですが、
$ perl interactive_test
■
となって止まってしまいます。これが症状です。
ここで、■というのは次なるプロンプト($)が出ずにキャレットが点滅している状態を
示しています。つまり、エラーも出ず、何か入力しても反応しません。
例えば、「a」で何も出ないし、「q」で出ることも出来ません。
C-Cで出ることは出来ます。
863 :
860 :2008/01/06(日) 21:09:59
そして、cmd.exeで上記のコードを動かすと正しく動きます。 ということはプログラム自体が悪いのでなく、cygwin環境の設定が悪いのか、 cygwinの設定とプログラムの書き方の相性が悪いらしい、と考えました。 それで、設定(/etc/profile, ~/.bashrc)を調べてみましたが、とくに対話的シェル でなくすような設定が見あたりませんでした。 以上が状況説明です。
864 :
860 :2008/01/06(日) 21:11:03
訂正 つまり、エラーも出ず、何か入力しても反応しません。 ↓ つまり、エラーメッセージも出ず、何か入力しても反応しません。
とりあえず、 bash で (echo a;echo q)|perl interactive_test としてみるとか… # a,q の後に改行してないとかかな
866 :
860 :2008/01/06(日) 21:36:49
>>865 ありがとうございます。よく分からないのですが、試してみたところ、
以下のようになりました。
$ echo a | perl interactive_test
start
ok
$ echo q | perl interactive_test
start
$ (echo a;echo q)|perl interactive_test
start
ok
$
867 :
852 :2008/01/06(日) 21:59:58
>>853 そのスクリプトで $arrayref を print Data::Dumper::Dumper($array) すると
$VAR1 = [
'hoge',
'123',
'true'
];
となりました。123もtrueも文字列として認識されてますよね?
>>854 おっしゃるようにDumpしてみておかしいと思ったので質問してみました。
>>855 >多分、YAML.pm の仕様。
Perlは数値も文字列も区別しないからこういう仕様でも構わないということでしょうか。
>>862 >>857 の言うようにするか、
$|=1;
をおまじないでscriptの前の方に書くことにする。
理由を書くのはめんどくさいや。
あんたが本筋でないと言っているところの問題。
$ perl interactive_test して、
a の後に改行はしてる?
してなかったら、してみる
してたら、UNiX 系と Windows では改行コードが違うからそこらへんでひっかかってるのかもしれない。
だから、
>>857 に「Cygwin 上では cygwin perl を使う。」と書いてるでしょ?
cygwin 用の Perl と active perl は違うよ?
870 :
860 :2008/01/06(日) 22:23:57
>>868 ありゃ、いけました。
$|=1;
を追加したところ正しく動作しました。
ありがとうございます。
思わぬところに原因があったんですね。
原因についてはよく分かっていないので、今後調べて理解します。
cygwinの設定というよりも、cygwinとperlの書き方の相性の問題だったようですね。
ところで、
>>857 についてはよく分かりません。
$|=1;
のほうが文字数は少ないですが、
>>857 のように書いたほうが本来は良いのでしょうか??
場合によるのかもしれませんが。
871 :
860 :2008/01/06(日) 22:27:23
>>869 改行しているかどうかというのはどういう意味でしょうか。
$perl interactive_test
a●
この●の部分で改行しましたが、
$ $perl interactive_test
a●
■
となります。この■はキャレットが点滅している状態を示しています。
ところが、
$perl interactive_test
a●
q●
start
ok
$
と一気に表示されてしまいます。
これが$|=1で出力をバッファリングしないようにしたらうまくいった理由なんですね。
余談ですが、さっきまではqで無反応だったのが設定を裏でいじっているうちにうまくいくようになりました。
どうやらcygwin.batの設定にも問題があったようです。
cygwin perl, active perlが違うことは知っていましたが、違いを理解しているわけではありませんでした。
本来はcygwin perlを使うほうがトラブルが少ないというのは知っていました(というより
耳にしていました)が、
・cygwin perl関連のドキュメントが極めて少ない(と思うのですが)こと
・cygwin perl には変な動作(bug?)が多いと聞いたこと
からこれはなんとしてもactive perlを使うようにしなければと苦肉の策でactiveperlを使うようになった次第です。
間違った考えでしたら、忌憚ないご意見待っています。
>cygwinとperlの書き方の相性の問題 全然違うよ。 とりあえず件の問題はおまじないですませて、 あんたの言うところの「本筋」を習得してくれ。
873 :
860 :2008/01/06(日) 22:53:37
>>872 私はゆくゆくはWeb programmingをしたいんですよ。
だから、UNIX系OS使うことになりそうじゃないですか?
なので、今はcygwinでやってます。そのうち、mac買います。
そういったこともふまえると、やはり、こういうIO関係(?)の知識は大事になって
くるんでしょうか??
perlというとperlのなかだけの話だけで完結するかと思いきや、そうではなかったんですね。
それとも、macに変えればcygwin+activeperlといった泥臭い(?)話はなくなるのでしょうか。
(つまり、相性どうこうといった話ぬきに、すっきり扱えるようになるのでしょうか)??
まあ、どっちにしてもIOは大事なのかもしれませんが、なんかcygwinだとperlの「本筋」とは関係のない
ややこしいことが無駄に多量出現している感があります。
VMwareでもインストールすればぁ?
IO関係(?)の知識云々よりもまず人の話をきちんと聞くことのほうが大事だな。
876 :
860 :2008/01/07(月) 00:06:14
>>874 それはcygwinだとやはり面倒だという意味でしょうか?
cygwinは面倒だと思いますか??
VMWareに興味ありますけど、cygwinみたいな面倒な点はないかもしれないですが、
これはこれで面倒なことがあると聞きます。
一応、virtual PCを昔使ったことがあるし、colinuxもインストールしようとして
失敗した経験を持っています。
>>875 話を聞いていなかったということでしょうか??
たぶん、それは私の心あたりにない点なので、良かったらどの部分か教えてください。
話に聞き漏らしがあるのは、視力が悪いせいかもしれません。
自分では人の話をよく聞くことを人生で大事にしているのですが、
メールなどではなかなかよく見ようという気にならないです。
多分、角膜の病気だからだと思うのですが、世間ではそういういいわけが通用しないことは
心得ています。
迷惑かけてすんません。
ところで、IO関係となるとunixのシェルやカーネルの知識が必要になるみたいですね。
初心者には厳しい部分な気がいたします。
やはり初心者はIO関係が苦手なものなんでしょうか。
IO関係だけが苦手分野なんですよ、perl全体をいろんな分野に分けて見たときに。
そこで、気持ち悪いじゃないですか、知識に穴があるみたいで。
この穴を埋めてから次のステップに進みたいのですが、どういう手だてがあるでしょうか。
あるいは、IO関係は上級者向けだからノータッチ推奨ですか。
1つ1つの知識を完璧にしながら進むなんてほとんど不可能に近い。 とりあえずおまじないを覚えておいて、理解が深まってから振り返ると意味が分かるなんてことはよくある
878 :
860 :2008/01/07(月) 00:31:11
>>877 もう返事がないものかと半分あきらめて、このスレももう店仕舞いかと思っていた矢先のコメント
ありがとうございます。
何も私は完璧を目指しているのではありません。
穴を完璧に針の穴さえもないくらいに無くそうとしているのではなくて、
IO関係全般に「ぽっかり」と開いた巨大ホールをなんとかならないものかと
腕組みして困り顔をしている次第です。
やはり、私のように情報系の教養を大学で学んでこなかったし、
かといってIT系職種に就いているわけでもないような、言って見りゃ「畑違いな人種」
にとってみれば、まったくの未知との遭遇と申しますか、つまるところ不安なのです。
とくに不安なのが、IO関係で、他の人はここらへんどうなのだろうかという一般論を知りたいと
思います。
日本中のPerl学習者で統計をとったときに、私のようにIOだけチンプンカンプンな人というのは
これは珍しいのでしょうか。
なぜこういうことを聞くかというと、珍しいのだとしたら私は直さないといけませんよね、だからです。
おまじないについては、宝物です。
それはもう、大事に覚えておきます。
んなこと大学でもIT企業でも教えてくれないよ。 ジャン。
880 :
860 :2008/01/07(月) 00:46:13
>>879 大学やIT企業の例を出したのは、私がコンピュータ界隈に縁がないし、周りにもそういう人が
いないがために、他の人の学習のありさまがどうだか全く把握していないという点を説明するためです。
なので、別に、日本全体の統計をとったらIOがまるでダメなPerlerが何パーかというのが
大学や企業行けば把握できるということではありませんよ、ご冗談ですか??
私が知りたいのは、次のようなことです。
IO関係があまりにチンプンカンプンなのにも関わらず、『初めてのPerl』という言わば
超初心者向け(?)な本にサラリと、さも分かって当然かのごとく書いてあったので、困っているのです。
もちろん、初心者向けなので詳しく書かずにサラリと触りだけ書いてあったのかもしれませんが、
私はその「触り」さえもつかむことができませんでした。
それはもしかすると、unix系の知識がゼロだったからなのかもしれません。
実際、この章はunixを前提とします、って書いてましたから。
だから、初心者がIO関係で身につけるべき事項が100あるとしたら、私は20ほどしか分かっていなくて、
他のジャンルだと80以上は分かっているという憂慮すべき事態は、
UNIXの知識不足が原因なのか、はたまた、IO関係は初心者ノータッチ推奨なくらい難易度が高いため
なのかが非常に気になるところなのです。
誰か親切中田おしえてください。
初心者はIOなんて知らなくていい
882 :
860 :2008/01/07(月) 01:08:00
>>881 ありがとうございます。これで安眠できますww
やはりノータッチ推奨でございますか。
いずれにしても、macのほうがいいよとうるさい知人がいて、
実際、macのほうが良さそうなのでmacにしてみようかなと思っています。
やっぱりweb programmingだと、windowsでperlって難しいですよね??
perlって汎用言語じゃないですか、何でも出来るっていう。
でも、windowsだと出来ることが限られるような気がいたします。
それは私がwindows関係のモジュールとか知識に明るくないからなのかもしれませんので、
突っ込みコメント常時歓迎です。
私はunix系にしたほうが良さそうな匂いをすでに嗅ぎつけているつもりです。
lampだってlinux, 主要なWeb系のサービスのアーキテクチャ(?)も調べてみたら
linuxで、でも、別の知人はwindowsでも出来るよと言ってます。
本当なんでしょうか。その人、私のような超初心者が言うのもなんですが、
perlのそれほど出来る人ではないんですよw
だから、眉唾状態です。
883 :
デフォルトの名無しさん :2008/01/07(月) 01:24:08
Perlプログラミング救命病棟でいうレベル7以下ならWindowsで問題無し
>>882 XAMPでぐぐって黙ってコードを書けよハゲ。
886 :
デフォルトの名無しさん :2008/01/07(月) 01:37:29
ファイル処理をしたいです。 以下のようなファイルがあって、「1列目が "aa" なら、4列目を取得する」には どのようにしたらいいでしょうか? -- aa bb cc dd bb cc dd aa cc dd aa bb aa dd cc bb -- この場合は、"dd" "bb" が出力されればOKです。 よろしくお願いします。
>>883 対数とったほうがと見た目がいい、としか。
底はfactorで相殺されるからなんでもよし。
888 :
860 :2008/01/07(月) 02:02:52
>>883 longtail部分の見せ方の問題ですよ。
まず、把握しておくべきこととして、$tag_item->{level}というのは、タグのfontの大きさです。
12+(level数)がそのタグの大きさになります。
たとえば、単純化して、以下のようなデータをクラウドにする場合を考えます。
1000count : 1tag
100count : 10tags
10count : 100tags
1count : 1000tags
この場合、logをとらずに等間隔に$self->{levels}を割り振ると大変なことになります。
どう大変かというと、ほとんど
1count : 1000tags
の部分でlevelが配分されてしまい、1000countのタグと100countのタグたちと10countのタグたち
がほとんど同じ大きさになってしまいます。
つまり、countの多いタグどうしをタグの大きさで視認できなくなって困ります。
logをとるとその心配がなくなります。
889 :
860 :2008/01/07(月) 02:09:55
>>884 その本をもっているのですが、どこにレベルについて書かれていますか???
>>885 なんでそんなに怒っているんですか。
確かにハゲかけてはいますが、ハゲといわれる筋合いはありません。
perlのプログラミングスキル的にハゲだという意味なら仕方ないです。
実際そうなんですから。
でも、XAMPPですか、それはwindowsにパッケージでインストールするだけでperlが使える
というものですよね。
それを使うことで私が抱えている問題を解決できるのでしょうか。
例えば、windowsで大丈夫か心配だという不安を抱えていて、
unixも勉強したほうが良さそうだと思っているのですが。そこでxamppというのは
私の要求にはそぐわない気がするのですが、いかがでしょうか。
是非お返事まっています。
まずは何でもいいから勉強しろよ。阿呆か。
891 :
860 :2008/01/07(月) 02:24:21
>>884 今見つけました。目立たない場所にありました。54ページでした。
ついでに、
Perlプログラマのレベル10 - Perlプログラミング救命病棟より - naoyaのはてなダイアリー
http://d.hatena.ne.jp/naoya/20050809/1123563794 も見つけました。
で、本題です。私のレベルは何かと思い、最初レベル7かと思ったんです。
「レベル7: オブジェクト指向モジュールを自分で作成できるようになり、
コードを再利用することの喜びをようやく感じている。
パッケージならびにレキシカル変数とダイナミック変数の違いを理解している。
Perl の正規表現(regular expressions)が「普通の」という意味のレギュラーではなく、
単純なテキスト操作をはるかに超えるものだと知っている」
はい、当てはまります。
でも、レベル8をみると
「CPAN にバグレポートやパッチやモジュールを送ったり、
ドキュメントについて提案したり、、、、」
これは!!!!!!!!!!!!!!!!!!
私は超初心者のつもりであり、パッチ送るなんて5年あとの話だと思っていました。
ところが、私はこのレベル判定によると(おそらくそうだと思うのですが)レベル7
であり、その次のレベルであるレベル8まであと一歩だという話になっているのです。
ちょうど、善良な一般市民が王様に祭り上げられた気分です。
なんだか、このレベル判定って(少なくとも)私を測定するには向かないなあと思いました。
と思ってたら、
「レベル5: 正規表現、演算子、I/O、およびスコープについて基本的な理解がある。」
「I/O」
orzorzorz
892 :
885 :2008/01/07(月) 02:26:56
>>889 インストールするだけでPerlを使ってウェブプログラミングが出来るんだよハゲ。
君はIO関係で問題にあたる程スキルがない、だから黙ってコードを書けよハゲ。
そんな長文書いてる時間があったら本の一冊でも読めよ。 いくら日本語が上手くなってもPerlがかけるようになるわけじゃないだろ。 とにかく本読んでコード書いとけ。そのうち出来るようになるから。
894 :
860 :2008/01/07(月) 02:29:39
以上のような理由から、私はレベル4〜7の範囲にあることが分かりました。
いかがでしょうか。
>>890 自分はアホでなくて私がアホだと決めてかかるのはどういう了見ですか。
私は現にこうやってこのスレでも勉強しています。
それを勉強していないということはあなたはきっとさぞ大量に勉強しているんですね。
でもですよ、私みたいに毎日コンピュータプログラミングの勉強時間がたっぷり無い
人間もいるのです。
なぜ私が十分な勉強時間がないかと申しますと、本業がIT系ではないからです。
といっても副業であるprogrammingで一銭も稼ぎを得てはいませんけど。
だから、マイペースでやるしかないですか。それこそ、1日5ページでいいから、
プログラミングの本を読む、あるいは、1日100行でいいからコードを書く。
あなたみたいにガリガリやっている人がすべてではなく、マイペースな人もいますよ。
世間知らずな私がえらそうに言ってごめんなさい。
頭が悪いのに口だけは達者な馬鹿の典型だなw で、どこから釣り?
896 :
883 :2008/01/07(月) 02:33:35
897 :
860 :2008/01/07(月) 02:37:58
>>892 なぜ怒っているんですか。ハゲと人に言ったら自分がハゲるとひいおじいちゃんが言ってましたよ。
MySQL, Perl, Apacheなどがセットに入っているんですよね。
でも自分でインストール時の設定できないのではないですか?
出来たとしても、そういう生ぬるい環境ではスキルが育たないような気もします。
何よりも、根本のOSの違いまでは吸収されないでしょう。
だから、macにしようかなと思っています。
web programmingを職業にするには、当然unix系、という意識があるのですが、間違ってますかね。
それから、レベル7まではwindowsと誰かがおっしゃってましたが、私は分野を限定しさえすれば、
レベル7です。ということは、windows卒業そろそろという時期じゃないですか。
そういう意味でも、macにするときかなという想いをより一層強めました。
IO関係でスキル無いことは大いに認めますが、私が知りたいのはIO関係でスキルを
身につけるために地道に努力すれば身につくかという一般論ではなくて、初心者である私が
IO関係の「ぽっかり穴」をどう対処すべきかという特殊論なのです。
そろそろ秋田
899 :
860 :2008/01/07(月) 02:43:19
>>893 なぜみんなして、私が勉強していないと決めてかかるのですか。
私は勉強していますよ、ただしあなたのようなガリ勉ではありません。
リラックスが必要なのですよ、私にとっては。
それから、長文だからどうこうというのも決めつけです。
確かに私は他人と比べれば長文ですが、これは私にとってナチュラルなスタイルです。
それを何やら批判的な言い方をされるのはちょっと納得がいきません。
世の中には、私のように「長文」な人がたくさんいますよ。
なぜ長文に対して2chでは風当たりが強いのかということが気になります。
>>895 こういう無意味なレスは相手しません。怒っています。
900 :
900 :2008/01/07(月) 02:47:47
どっからmacが出てくるんだよ。サーバOSのシェア考えてみろよ。 キチガイさん、釣りはOK Waveか小町でやってください。 真面目に答えてるここの皆さんに失礼です。 貴方に良心があるなら、このスレへのレスはもうやめなさい。 貴方の言ってることの正否はともかく、貴方のレスでこのスレは荒れています。 他の利用者の方に失礼だと思いませんか。 それとも貴方は自分の我が儘を突き通すのですか。 返信不要
> 世の中には、私のように「長文」な人がたくさんいますよ。 > なぜ長文に対して2chでは風当たりが強いのかということが気になります。 くそレス読まされるほうの身にもなってみろってんだ。
>>899 いや君は簡潔に書く能力が低いのよ
しかもその点で向上心が無いの
だからそんな奴に対するそういう態度は当然だよ
903 :
860 :2008/01/07(月) 02:54:30
コードかけはげ五月蠅いので、
>>886 書いてみました。
open FH, '<filename' or die 'can't open file';
my @lines = <FH>;
my @results;
for $line(@lines){
next unless $line =~/^aa /;
push @results, (split / /, $line)[-1];
}
## @resultsに結果が入っているので、出力の仕方はご自由に。
904 :
860 :2008/01/07(月) 02:55:38
叩きたいなら人格ではなくコードを叩いてください。 人格攻撃する人のほうがよっぽどハゲですよ。くだらない。
人を叩いてないで精進しましょうね。
906 :
860 :2008/01/07(月) 03:00:28
>>900 正義漢のふりすればいいとでも思っているんですか。
人を勝手に我が儘呼ばわりして。
シェアを考えるとmacよりlinuxがいいんですね。そうですか、参考になりました。
ただ、サーバOSと開発環境のOSとがごっちゃになってますね。
ここでハッキリさせるために、
「私は開発環境OSとしてマック使うつもりです」
と明言しておきます。これなら、macでもいいでしょう???
いかがですか。
>>901
開発環境ならwinでいいじゃん
909 :
860 :2008/01/07(月) 03:02:38
910 :
860 :2008/01/07(月) 03:04:34
>>901 繰り返しますが、そういうあなたこそクソレスではないんですか。
こういう無意味なレスは相手しませんので、よろしくお願いします。
>>902 確かに簡潔ではないですけど、言うべきことを正確に言うためには必要だと思っています。
そこをどうこういうのは正義の問題というより思想・趣味の領域でしょう。
>>905 私へのメッセージですか??
相手しませんとか言って全レスしてるあたり萌える
>>903 正規表現やsplitよりsubstr使った方が早いだろ、常識的に考えて。
なんで$lineだけがレキシカル変数じゃないんだよ、常識的に考えて。
使用するサーバと開発環境のOS合わせた方が仕様の差異が少ないんだから、ウェブプログラミングしやすいだろハゲ。
最初から決めてるなら質問するなよ馬鹿。お前の日記帳じゃないんだよ。
>>900 macは、perlの学習用にはそう悪い選択じゃないと思うよ。
perl、apache、phpあたりは最初から入ってるし……。
わざわざ乗り換えるほどのこともないとは思うけど。
914 :
860 :2008/01/07(月) 03:12:27
>>907 そうだったんですか!!!本当だとしたら勉強になります。
ところで、開発環境ならwindowsでも良いというのはどうしてですか???
凄腕エンジニアたちにはunix系使いが多いと聞いていますが、それとは矛盾しませんか??
○windowsを開発環境にする
●メリット: 今自分が持っているパソコンである、ツールが充実している
●デメリット: unixの知識が身につかない、
サーバOSをunixにする場合両方のOSの知識が必要になり大変・混乱する
○unixを開発環境にする
●メリット: CLI環境が充実していて開発効率が向上する、サーバOSと同じOSだということで
覚えるべき量が減る
●デメリット: とくになし
というイメージなので、やはりunixがいいかなと思っています。
そして、同じunix系ならmacが最近人気なようなので、ミーハー気分で
macにしようとおもっています。linuxではなくmacなことにとくに深い理由はありません。
きが くるっとる
917 :
860 :2008/01/07(月) 03:20:56
>>912 あっそこのmyよく忘れるんです、勉強になりました。
substr速いというのは『初めてのPerl』にも書いてましたね。勉強なりました。
最初から決めてるのでなく、私の見解・予定を明示した上でのほうがより的確な
アドバイスが得られるとの考えです。
やはりOS合わせたほうがいいのですね。貴重なアドバイスありがとうございます。
であれば、
server : mac
development : mac
にします。macもOSXであればlinuxとほとんど同じと聞いたので、
開発環境兼サーバーOSとしてmac、というのはあり得る話ですよね??
>>913 乗り換えるほどのことはないとはいえ、レベル8からはwindows卒業しどきとおっしゃった
方がいましたし、それに、ゆくゆくはweb programmingをすることを考えると
今からwindows卒業しようかなと思っています。
そこのあたりどうお考えになりますか???
それから、macが悪い選択でないというのは他に何か理由があるのでしょうか。
プリインストールについては聞き及んでいましたが、それって大したメリットでない
ようにも思えます。なぜなら、インストールくらいは私でも出来るからです。
それでもプリインストールのメリットってあるものなんですかねえ。
(∩゚д゚)
919 :
886 :2008/01/07(月) 03:34:36
>903 どうもありがとうございます。 実は、、文字の間はスペースのほかにタブがくることがあります。 先頭の文字の前にもスペースかタブがくることがあります。 5列目、6列目に "ff", "gg" があったりします。 -- aa bb cc dd ff gg bb cc dd aa ff cc dd aa bb ff gg aa dd cc bb -- その中で、1行目の "dd" と 4行目の "bb" を拾えないでしょうか? 2度手間ですみません。。。
920 :
860 :2008/01/07(月) 03:36:52
>>916 確かにスレチな部分も多々ありましたが、それは他の人が勝手な解釈で私の言葉を
受け止めたから、反発的に自分の意見は誤解されているということを言いたくなった
だけですよ。
スレ違いな話をここで展開するつもりは毛頭ございません。
それはそうと、もうちょっとhospitalityのある対応をお願いしたかったところですよ。
皆さんストレスたまっているようですね。リラックス大事ですよ、お願いしますよ。
922 :
860 :2008/01/07(月) 03:47:10
>>919 要件がちょっと曖昧にしか理解できないのでお尋ねします。
1列目のddというのは4列目にないのに、貴方は、'aa'を拾うことを要求してますよね。
これは、
>>886 の「4列目を取得する」という条件から、
「途中の空白な列は数えずに4列目を取得する」、という条件に仕様変更した
という意味でしょうか。
それから、4列目は最初にaaがないですよね。
これは1列目にaaがあったら、という
>>886 の条件ではなくて、
最初の空でない列がaaだったらという条件に変更したということですか??
my $filename = 'filename'; my @results; open (my $fh, '<', $filename) or die; while (my $line = <$fh>) { chomp $line; my @elm = grep /[a-g]{2}/, split(/[^a-g]/,$line); if ($elm[0] eq 'aa') { push @results, $elm[3]; } } close $fh; # print @results;
924 :
860 :2008/01/07(月) 03:48:38
2カ所訂正です。 1列目のddというのは ↓ 1行目のddというのは 4列目は最初にaaがないですよね。 ↓ 4行目は最初にaaがないですよね。
925 :
860 :2008/01/07(月) 03:56:49
>>923 私もそういう要件だと理解しました。勉強なりました。
・filenameを変数に格納しておくんですね。
・openでfile handleを変数にしているのはどういったわけでしょう。
・my @lines = <$fh>;としてから処理するよりも直接一行ずつ読み込むほうが高速
ということになるんでしょうか。
・grep, splitの組み合わせは、コード見ればすぐ理解できるものの、思いつくかというと
ちょっと時間かかりそうです。
・やはりfile handle閉じたほうがいいんですかね。今のところ閉じたほうがいいような状況に
遭遇したことがないので、閉じないで済ませることが多いのですが。
926 :
860 :2008/01/07(月) 04:04:15
perlについての質問に全力で私がお答えします。
927 :
886 :2008/01/07(月) 04:27:36
>922-924 レス中のご質問は両方ともYESです。 所望の動作を確認しました。ありがとうございました。
俺も普通にレスしてるだけなのに 気付いたらレス番が赤くなってるタイプだわ 人気者は辛いなあ…あはは…
>>920 まぁLinux初心者は「VMware Player」をインスコして
「ubuntu Linux」のVMware用パッケージを落として
ubuntuなんたら.vmxをダブルクリックでもしとけ。
20:00時から早朝4時までご苦労さまです
まさに慇懃無礼
なんで860はこのスレにいるの? そろそろ空気読んで勉強に戻ったほうがいいんじゃね?
933 :
860 :2008/01/07(月) 10:11:28
今はリラックスタイムなので、勉強はしません。
祭りに乗り遅れたー
俺も乗り遅れた・・・
859だけ書いて消えた俺は先見の明があったようだ
対話的モードでふと思ったが Perl にPythonの対話モードやRubyのirbみたいなのってあったっけ
急にすいません、質問させてください。 for($i = 0; $i < "$#b"; $i++) { $aaa = $b[i] - $b[i+1]; if($aaa < 1 && $aaa > 1) { print "good"; } else { print "bud"; } } というプログラムを書いた時に、$b[0] - $b[1]が最初のif文に入ったらずっとif文を回り続けて、 $b[1] - $b[2]以降を読み取ってくれないのですが、どうすればいいでしょうか? $aaaは固定されてしまうのでしょうか?
>>938 > 最初のif文に入ったらずっとif文を回り続けて、$b[1] - $b[2]以降を読み取ってくれない
ということは、どうやって判断したの?
そのコード自体もいろんなところが適当すぎるだろう。
意味を考えて書いてるのか。
>>938 use strict;
use warnings;
を使い、後はエラーメッセージを頼りに修正するといい。
(数値である)$#bをわざわざ("$#b"で)文字列化してから( < 演算子で)数値評価してるのは何故?
>>939 わかりにくく書いてしまってすいません。
例えば、@bに1 1.5 3 5 5.5 と入れた場合、
最初の差が1以下なのでずっとgoodが出てきてしまいます。
good bud bud goodのように出力したいのですが。
>>940 すいません、
>>941 さんが言われてる通り最後の一行がよくわかりません。ごめんなさい。
use strict;やuse warnings;はプログラム内に書けばいいのでしょうか?
>>942 それなら、最初の差が1以上ならどうなるか試してみた?
ところで、"bud"の意味は「つぼみ」ね。
>>943 はい、試して見たところずっとbudが出てきました。
多分$aaaが固定されてるんだと思うんですが。
> "bud"の意味は「つぼみ」ね。
アホなミスをしていました。
すいませんでした。
>>941 >最後の一行を
>>938 が理解してるとは思えないんだがw
ちくしょー(perldocは無理でも和訳印刷製本済みの)らくだ本くらい通読しやがれ。
>>942 use strict 等についてはその通り。
後、938のコードが "good" を出力するには割と特殊な条件が必要。
手元のプログラムが "good" を出力するなら、938とは別物の可能性が高い。
>>945 > 手元のプログラムが "good" を出力するなら、938とは別物の可能性が高い。
わからない部分だけはしょったので、よくわからないプログラムになってしまってすいません。
つまり最初に$b[0] - $b[1]で最初のif文に入って、goodがでて、
次に$b[1] - $b[2]でelse文に入って、badが出て、
その後$b[2] - $b[3]はif文に入りgoodが出るのようなプログラムを作りたいのですが、
今のままだと$b[0] - $b[1]が最初のif文に入っちゃうと、ずっとgoodが出続けてしまいます。
書き方が酷くてホントすいませんでした。
$aaa < 1 && $aaa > 1 に突っ込む奴がいないのはなぜだ?
>>947 空気読めよ。
みんな本人が自分で気づくように遠まわしに指摘してるじゃないか。
>>947 すいません。
$aaa < 1 && $aaa > -1
でした、本当にすいません。
そのプログラムで >> ずっとgoodが出続けてしまいます。 の方が不思議だと思うのだが。
>>942 「最後の1行」の部分は、要するに、$#bをダブルクォートでくくっている(「"$#b"」と書いている)理由を聞いている。
(そう書かなければならない理由がわからないから)
use strict / use warnings の書き方は、
/usr/lib/perl5/5.8/File/Compare.pm (環境によってインストール先が違う。無かったら探せ)
あたりでも見とけ。
あと、もっとお手軽な方法としては、
perl -wc スクリプトファイル
という手がある。
オプションの意味は「perl --help」とか「perldoc perlrun」とかで出るメッセージを見ろ。
(ついでに、「perldoc perl」で標準添付のドキュメントにどんなのがあるかの一覧が出る)
みなさん、本当にありがとうございます。
>>951 さん、試して見ます。
for($i = 0; $i < 5; $i++)
{
$aaa = $b[i] - $b[i+1];
if($aaa < 1 && $aaa > -1)
{
print "good";
}
else
{
print "bad";
}
print "$aaa";}
してみたところ、常に同じ$aaaが出力されていました。
一周してfor文の最初に戻った時に、$aaaは書き換えられないのでしょうか?
C言語馬鹿は一度Perlのスカラー変数の表記方法を思い出してご覧なさい。 一行一行脳内コンパイルすればエラーに気づくだろ。
> $aaa = $b[i] - $b[i+1]; 単純に$のつけ忘れだろ。 まだmyも使えないようなレベルでいきなりuse strict使えというのは敷居が高いような 気もするが、せめてuse warningsだけでも使ってみれば、 Unquoted string "i" may clash with future reserved word at 〜 とか Argument "i" isn't numeric in array element at 〜 といった警告が出てきて見当ついたんだけどね。
955 :
953 :2008/01/07(月) 18:10:29
ごめん。普通にマジレスしちゃった。
>>952 試してみますじゃねえよ。馬鹿野郎、ちゃんと試せよ。
use strict;にusewarnings;しやがれ。
>>954 出来ました!
本当にありがとうございます!
レスくださった方々、本当にありがとうございます。
ここにいる皆様は本当にいい人ばかりで、涙がでそうです。
自分も人に教えられるくらいになるよう、勉強していきたいと思います。
最後に、本当にありがとうございました。
デバッグをした形跡がない
文字列の入った配列のソートについて質問です。 @arr = qw ( 10.4.31 10.40 5.2.3 5.3 ); 文字列と言っても、整数がピリオドで区切られていて、 "10.4.31" は、「第10章の第4節の31行目」とか、そんな感じの意味です。 これを昇順でソートするサブルーチン(−1か0か1を返すやつ)を書いたのですが、 なんか、美しくありませんし、正しいかどうかも自信ないです。 結果は、こういう順で出てきてほしいです。 5.2.3 5.3 10.4.31 10.40 とりあえずこのデータでは正しく動いているように見える、私が書いたやつ。 --------------------------------------------- @arr = qw ( 10.4.31 10.40 5.2.3 5.3 ); print join ' ', sort comparator @arr; sub comparator { @a = split /\./, $a; @b = split /\./, $b; do { $aa = shift @a; $bb = shift @b; return ($aa <=> $bb) if ( ($aa <=> $bb) != 0); } while (defined($aa) and defined($bb)); } --------------------------------------------- もっとスマートにならないでしょうか。
スマートじゃないけど、 sub comparator { $a<=>$b || pack('N*',split /\./,$a) cmp pack('N*',split /\./,$b) } なんてどう?
>>958 sub comparator {
pack('C*', split /\./, $a) cmp pack('C*', split /\./, $b);
}
use Sort::Versions; @arr = qw ( 10.4.31 10.40 5.2.3 5.3 ); print sort versioncmp @arr;
>937 Shell::Perlのpirl
963 :
質問 :2008/01/08(火) 01:10:21
指定した時間(5分or10分間隔)で走らせるプログラムを作りたいのですが、 cronを使わずにperlコマンドorモジュールorシェルコマンドで指定した時間で走らせる方法があったら教えてください。 プログラムの流れとしては、 CGIでプログラムの起動と停止をおこなう 起動ボタンが押されると、停止を押すまではたとえば5分間隔でプログラムを走らせる 停止ボタンを押すとプログラムを停止させる です。必要なときに起動・停止したいのと諸事情によりcronは使えません。
>>963 1) sleepで寝て、停止時にはシグナルぶちこんで叩き起こす。
2) alarmでタイマー仕掛けて、停止待ち状態で待って、アラームが鳴ったら仕事をする。
965 :
963 :2008/01/08(火) 01:25:41
>>964 ありがとうございます。
if文(停止ボタンが押されていない場合)とその中でsleepを使って試してみたいと思います。
ファイル処理についての質問です。 このようなファイルが任意の大きさであったとき、 人物ごとにハッシュか構造体でまとめたいです。 ------------------------ 名前:鈴木 性別:男 好きなアルファベット:A, B 名前:佐藤 性別:男 好きなアルファベット:C 名前:田中 性別:男 好きなアルファベット:D, E, F, G …… ------------------------ ファイルが終わるまでの任意の大きさでまとめる点と 好きなアルファベットは一つとは限らない点で困ってます。 どなたかご教授くださいませ。
967 :
デフォルトの名無しさん :2008/01/08(火) 01:38:04
[1] 授業単元:最終課題 [2] 問題文: 10×10(変えることができる)の迷路の脱出過程(どこをどのように通ったか)を表示するプログラムを作成せよ なお、Sはスタート地点・Gはゴール地点・Wは壁・Rは経路を示す また脱出者は迷路に関する情報は事前に持っていないこととし、 脱出過程の表示は、定期的に現在地を表示するものと、最終的な経路を表示するものを用意すること。 SWWWWRWWWW RWRRWRWWWW RWWRWRWWWW RRRRRRRRRR WWRWWRWWWW WWRWWRWWWW WWRWWRWWWW RRRRRRRRRR WWWWWWWWWR WWWWWWWWWG [3] 環境 [3.1] OS:Windows Vista [3.2] コンパイラ名とバージョン: [3.3] 言語:C++ [4] 期限:2008年1月9日 [5] その他の制限:関数を使って、なるべく簡単な方法でお願いしますm(_ _)m
968 :
デフォルトの名無しさん :2008/01/08(火) 01:39:15
967まちがえました・・・
ここはPerlスレですが・・・・
>>966 use strict;
use warnings;
# use Data::Dumper;
my %person;
my $name;
while (<>) {
chomp;
my ($key, $value) = split ':';
if ($key eq '名前') {
$name = $value;
}
elsif ($key eq '好きなアルファベット') {
$value = [ split m(,\s), $value ];
}
$person{$name}{$key} = $value;
}
# print Dumper(\%person);
exit;
>>970 は名前がユニークであること、デリミタが「:」であること、
「, 」がアルファベット以外に存在しないこと等々、色々制約あり
スパム対策として、日本語が3文字以上連続でなければエラーと考えています。 (英語の文字化け等があるので、1文字だとダメなんです) 調べると日本語の判定は if ($comment !~ /(\x82[\x9F-\xF2])|(\x83[\x40-\x96])/) とあるのですが、 もし($コメント 含まれていなければ / 3回繰り返す・日本語 /) にしたいのですが、 この「3回繰り返す」というのと、 (\x82[\x9F-\xF2])|(\x83[\x40-\x96]) をどう1まとめにするかが、わかりません。 ご教示ください。
973 :
966 :2008/01/08(火) 04:02:22
>>970 ありがとうございます。>966ではできました。
もう少しお付き合い頂きたいのですが
好きなアルファベットがこんなふうに並んでた場合はどうなんでしょうか?
------------------------
名前:鈴木
性別:男
好きなアルファベット:A
好きなアルファベット:B
名前:佐藤
性別:男
好きなアルファベット:C
名前:田中
性別:男
好きなアルファベット:D
好きなアルファベット:E
好きなアルファベット:F
好きなアルファベット:G
……
------------------------
>>973 > ありがとうございます。>966ではできました。
「できました」(笑)
つっこむところじゃないからw
>962 つまりあれか。俺がCPAN慣れてないから見つからなかったのな…。
978 :
デフォルトの名無しさん :2008/01/08(火) 18:04:05
Data::Dumper って巨大な配列とか扱わせると、Dump()がやたらに遅くなるね。。。 配列の中身は、オブジェクトだったり、相互の参照があったり。 線形検索をかけてるルーチンがあるかのような遅さだ(perlでそんなバカなことはしないだろうが)。 単にパーシステントにしたいだけなら、やっぱりStorable? あと、YAMLでオブジェクトの再構築はData::Dumperと全く同じでできるの?
>>978 > 単にパーシステントにしたいだけなら、やっぱりStorable?
そう
980 :
デフォルトの名無しさん :2008/01/08(火) 21:37:05
大学の課題なんですけど プログラムPGを作れ プログラムの機能の条件 1、INDATAというファイルの中身を読みこんで処理するものであること 2、少なくとも一個のif文を使っている 3、for,while,foreachなどの繰り返しを少なくとも一個は使っている 4、少なくとも一個の配列を使っている 5、少なくとも一個の引数を使っている 6、以下の様に実行することでOUTDATAに結果が出力される % KADAI3 <INDATA> OUTDATA 注:3は引数
いや作成していただきたいんです
スレ違い。
会社の仕事なんですけど プログラムPGを作れ プログラムの機能の条件 1、INDATAというファイルの中身を読みこんで処理するものであること 2、(ry
Perlの宿題スレってあったっけ
>>982 > いや作成していただきたいんです
そういう時は、金額も併記すると交渉が早くまとまるよ。
つ コンサr
988 :
970 :2008/01/08(火) 23:15:04
>>973 use strict;
use warnings;
# use Data::Dumper;
my %person;
my $name;
while (<>) {
chomp;
my ($key, $value) = split ':';
if ($key eq '名前') {
$name = $value;
}
elsif ($key eq '好きなアルファベット') {
$value = [ split m(,\s), $value ];
if (exists $person{$name}{$key}) {
push @{$person{$name}{$key}}, @$value;
next;
}
}
$person{$name}{$key} = $value;
}
# print Dumper(\%person);
exit;
例によって
>>988 は「好きなアルファベット」固定なので、
「嫌いなアルファベット」だとかはelsifの条件を||で繋いで書くとかね
やれデータ構造だと肩に力を入れなくても
push, pop, shift, unshift, keys, values, each, exists, defined
辺りを知っていれば、後は上記のようにif, elseの世界だよ ガムバレ
>>980 Perlでリクに答えるスクリプトを作るスレ
http://pc11.2ch.net/test/read.cgi/tech/1086143976/ っつうと味気ない? 向こうでも同じ流れになりそうだから以下駄文
1.は6.に含まれるでそ
3.はwhileを
>>970 で使っている
5.の引数がスクリプトの引数を意味しているなら6.に含まれる
6.はほんとにそんな課題?
% KADAI3 INDATA OUTDATA
ならば、引数0をファイルハンドルINとしてopenし、
引数1をファイルハンドルOUTとでもして、openし、
INをwhileに読ませてOUTにprintして、
while抜けたらINもOUTもcloseすれば(しなくても怒られはしないけど)終わり
引数自体が@ARGVっていう配列なので4.も充足(ずるいと言えばずるいが)
むしろ%KADAI3 <INDATA >OUTDATAじゃないの?
そうなら標準入力を
>>970 みたいに食って標準出力にprintすればいいのでもっと楽
4.が満たせない(<>はリストだが配列じゃない)ので@hoge = <>と無駄処理する
無駄処理はかなりずるい要件充足の仕方なので、配列でおもろい処理をしてもいい
2.は各行で「あ」が含まれる行だけを抽出するgrepを作ってみるとかね
真のときのみOUTにprintするとかさ
(本当はperlでもgrepっていう組み込み関数を使った方がいいんだけど)
プログラムPGっつうのは6.の通りKADAIってファイル名ってことなら
1行目に#!/usr/bin/local/perlとかなんとか処理系のパスを書けばいい
まずは書いてみなよ
スレ梅代わりに、分かったところまで書いたらここに貼りゃいいから
992 :
973 :2008/01/09(水) 01:02:11
>988-989 970様のおかげで書き方がわかりました。 重ね重ねありがとうございました。
>991がほとんど答えだったり