Perlについての質問箱 41箱目at TECH
Perlについての質問箱 41箱目 - 暇つぶし2ch304:デフォルトの名無しさん
09/09/08 10:19:36
>>288
ググるくらいできんのか。
URLリンク(ja.wikipedia.org)

>>290
それ欠点じゃなくてわざとだから。判定モジュールくらい簡単に作れる。上に判定方法も書いた。
型を区別するとPerlスクリプティングにダメージがあるためそんなモジュールは必要とされていないし使われていないだけ。

>>295
今ならMooseで
isa => 'Str',
isa=> 'Int',
でしょ。

>>296
同名関数の複数定義ができればいいんだが、Perlでは無理なので後者が賢明。

>>299
そりゃ同じ機能ならまとめたいだろうし、最近はそういう風潮にあると思うが。
foo({ a => 1,b => 2 })と、foo([ a => 1, b => 2])で挙動をスイッチするような実装とか最近よく見かけるぞ。

305:デフォルトの名無しさん
09/09/08 10:34:51
「本質的にスカラーは型を持たない」
  -- Larry Wall, プログラミングPerl, O'Reilly, 1997, p43

Perlは内部的にスカラーを数値や文字列で扱ってるだけで、「型が区別できない」わけではない。
「数値や文字列はあっても、数値型や文字列型なんかない」のである。そこんとこ間違えないように。

306:デフォルトの名無しさん
09/09/08 11:13:56
Validateする目的は、(JSONを媒体とした)データを受け取ったPerlのプログラムを正常に動作させるためですよね?
それなら、データがJSONレベルで数値だったか否かは全く問題にならないのでは?
JSON表現の "1" と 1、このどちらも、Perlレベルでは文字列としてでも整数値としてでも正常に扱えるんですから

どうしてもJSONレベルでのValidateを望むのであれば、
JSONデコーダから作るしかないのですね。Ruby等、データに型が備わっている言語であれば、
確かにJSONデコーダとJSONレベルのValidatorは完全に分離可能でしょう。
でも、Perlにはそれが出来ない。仕方のないことです

307:デフォルトの名無しさん
09/09/08 12:04:55
JSON表現では区別できるならどのように読み取ったかを
後から判別できるような情報を残しておくことは可能。
既存のパーサーが区別しないというだけの話で
言語のせいにしたところで問題が解決するわけではない。
数値と文字列の区別がある言語であってもパーサーが区別しなければ同じこと。

308:デフォルトの名無しさん
09/09/08 12:26:56
>>303
>書いてないってことはREADMEやChangesにはフォーマットなし。自由に書いてよし。ってことだ。読み取れないのか。

書かれてないから質問しているのに・・・
「書いてないってことはフォーマットなし」なんて読み取れるわけないでしょ。
書かれてないことは「不明」だと判断するのが普通じゃね?どういう頭の構造してるんだよ。

そのページはCPANパッケージの作り方についてすべてを網羅しているの?
もしそのページに書かれてないことは自由に判断していいなら、テストスクリプトのファイル名だって、
パッケージのファイル名だって、自由にしてもいいことになるだろ。でも実際にはそうじゃないじゃん。
書かれてないことは「不明」なんだから、分かっている人に聞いてみて意見をあおぐのが常識的な行動じゃないか?
「書いてないから何をやってもいい」というおまえみたいな考えこそ大迷惑。


しかしまー、あれだ、自分が紹介したページが見当はずれだったことはまるで反省せず、
「読み取れないのか」と言い放つなんて、なんという傲慢ぶり。まるでdank○gai。


309:デフォルトの名無しさん
09/09/08 12:39:35
>>308
流れ見てると全くもって君の言うとおりだと思うけど、最後に例えでその名前を出すのはダメだろうw

310:デフォルトの名無しさん
09/09/08 12:40:08
>>284
>1000桁の数値であってもJSONとしてはvalidなのだから、
>やはり文字列で判定すべきではないのか。
なんで1000桁の数値なら文字列にしないといけないの?
1000桁だろうと、数値は数値としてもっておけばいいじゃん。
C言語じゃあるまいし、スクリプト言語なら桁数の多い数値でもふつうに扱えるようになっていてもらわないと。


311:デフォルトの名無しさん
09/09/08 12:51:23
>299 >304
ありがとうございます。素直にスカラを取るようにします。

312:デフォルトの名無しさん
09/09/08 13:12:40
JSONでの型をバリデートする話とはちょっと違うんだけどずいぶん昔に
WebアプリケーションでASINをJSONで吐いてJSからあれこれするときに
{ASIN=>$asin} みたいなので、$asin =~ /^[0-9]+$/ だったりすると
{"ASIN":1234} みたいなJSONを吐き出しやがって閉口した覚えがある。
これだけならまだいいんだが $asin =~ /^0[0-7]+$/ だと
8進数に変換されてえらいことになった。

手元で試したら再現しなかったので最近のJSON.pmは大丈夫ぽいが。

313:デフォルトの名無しさん
09/09/08 15:55:55
perlは変数自体に型はないけど、データには型はあるがな。見分けられないわけもないだろよ。
まぁ、perlは非常に弱いLvで変数の型を決め付けてるぞ。
文字型と判断されるか数値型と判断されるかで、挙動が変わるビット演算子がある。唯一それだけ。
これは変数の経歴を記録してる。


関係ないけど、バイナリデータ扱ったら、ヌル文字だらけでとんでもない目に遭った。
もう文字列の0は真にしてくれよ。binmodeって書いたときだけでいいから。せめて'0000'は真だろ!
あと、明示的に指定せずにほっといたら'0000'を勝手に0にすんのもやめてくれ、って思った。

314:デフォルトの名無しさん
09/09/08 17:50:24
>>308
質問の内容が書いてあるとは一言もいっていないが?
テストのファイル名も分からない状態のあなたはまずこれを100回読めという意味だよ。
だから100回読んだあなたにちゃんと補足で答えてるだろ。

勝手に勘違いしてファビョって礼もなしにそれか。

315:デフォルトの名無しさん
09/09/08 17:59:14
スクレイピングするスクリプトを作るときのサポートライブラリで、
ページの構造をスクリプト作成に便利なようにてきとーに整形して表示するというのをけっこう前に見かけて、
あーこれ便利そうだなーと思ってそのままだったんです

今探そうと思ったらぜんぜん見つかりません
何か心当たりのある方いますか?

316:デフォルトの名無しさん
09/09/08 18:07:45
>>314
分不相応にプライドの高い間抜けな質問者のオーラを
事前に察知して華麗に無視できなかったお前が悪い。

317:デフォルトの名無しさん
09/09/08 18:12:44
>>310
> スクリプト言語なら桁数の多い数値でもふつうに扱えるようになっていてもらわないと。
use bignum;を使え。

> なんで1000桁の数値なら文字列にしないといけないの?
効率が悪すぎる。

>>313
変数をそのまま真偽値判定に突っ込むな。

318:デフォルトの名無しさん
09/09/08 19:06:41
ディレクトリの中にあるテキストファイルから、任意の文字列を発見した時に
その文字列が含まれるファイル名を出力したいんだけど
どうすればいいの
教えてエロい人!!

319:デフォルトの名無しさん
09/09/08 19:07:57
>>315
どっかで見たな

320:デフォルトの名無しさん
09/09/08 19:23:27
>>302
>必要でないからあえて削除されたんだよ。
ということは、以前は機能として存在したということか。どのバージョンで削除されたか教えてくれ。

>型にこだわることで起こる煩わしさのほうが多いから。
そんなわけない。だったらJSもRubyもPythonも煩わしいことになるけど、そうはなってない。

>それにバリデータなんてどっかで誰かがもう作ってるだろ。
>あえてパールで作り直すのは自由だけど、能力不足を棚にあげて言語のせいにされてもね。
上のほうで出たのはJSONのバリデータなんだけど、それはすでにPerlにあるの?
ぐぐったけど見つからんぞ。せっかくPerlにないものを作ろうとしてくれてる人がいるのに
なんでこんな反応ばっかりなんだろうね。

>ガタガタいうなら適切と思う言語を選べばいい。
>言語のせいにするやつは、言語を変えてもできないだろうから。
これに関しては言語を変えたら簡単にできるこだろ。
数値と文字列の判定なんて、PHPですら簡単にできることなのに。ガタガタ言い訳カッコワルイ。


321:デフォルトの名無しさん
09/09/08 19:36:58
>>318
ディレクトリをマウスで右クリック
「検索(E)」
ファイルに含まれる単語

322:デフォルトの名無しさん
09/09/08 19:44:52
>>321
すいません、windowsを使っていないので
それはできませんorz

323:デフォルトの名無しさん
09/09/08 19:50:03
>>314
>質問の内容が書いてあるとは一言もいっていないが?
すげー!質問したやつに関係ないURLを紹介しておいて、文句をいわれたら『答えが書いてあるとは誰もいってない』と逆切れ!
言い訳もここまでくるといっそすがすがしいな。

>勝手に勘違いしてファビョって礼もなしにそれか。
無関係なURLを紹介しておきながら「読み取れないのか」と言って相手のせいにするようなやつのくせして、礼だけは求めるのかよ。
相変わらずのdank○gai的傲慢さだな。論理がつながってないところもdank○gaiにそっくりだ。
あれか、Perl使うとみんなdanみたいなのになるのか?danが今のようなdanになったのはPerlのせいなのか?

324:デフォルトの名無しさん
09/09/08 19:56:32
>>323
> あれか、Perl使うとみんなdanみたいなのになるのか?danが今のようなdanになったのはPerlのせいなのか?

うん! その通りだよ!!
逃げて!! Perlから逃げて!! 手遅れにならないうちにPerlから逃げてぇ!!

325:デフォルトの名無しさん
09/09/08 19:56:35
>>320
シンタックスレベルのバリデータなら既にCPANに転がってるよ
URLリンク(search.cpan.org)

326:デフォルトの名無しさん
09/09/08 20:00:13
>>260, >>313の話から考えると、
Perlのある値は、(その時点で)文字列or/and数値としてメモリ上に表現されているって情報しか持ってなくて
その値の由来が文字列か数値かなんて情報は持ってないとか?

そうだとすると、型っていうより、Perlの値は文字列と数値の二つの側面があるってイメージで
型の判別が出来る・出来ない、というより、そもそも判別する対象(文字列型・数値型)がないのかな

これであってる?教えてくださいPerl上級者さん><

327:デフォルトの名無しさん
09/09/08 20:11:31
>>326
方向はだいたいあってるんだぜー。
もっと詳しく知りたければ Devel::Peek あたりで遊んでみることだぜー。

328:デフォルトの名無しさん
09/09/08 20:14:00
しらんけど C++には Variant型ってクラスで作られた型があるな

329:デフォルトの名無しさん
09/09/08 20:15:08
>>327
ありがとう
sv.hにスカラー値っぽいのが定義されてたけど、どうもそうみたいですね~
もうPerl使ってないけど、4間年も使ってたのに気付かなかったw 勉強になりました

330:デフォルトの名無しさん
09/09/08 22:12:10
>>323
何でそんなに興奮してるのか知らないけど、
続ければ続けるほど自分が皆から馬鹿にされるだけの書き込みを続けても
意味無いと思うよ。

331:デフォルトの名無しさん
09/09/08 22:45:32
>>318
grep -rh 検索文字列 ディレクトリ

332:デフォルトの名無しさん
09/09/08 22:48:13
>>320
ことか。どのバージョンで削除されたか教えてくれ。



> そんなわけない。だったらJSもRubyもPythonも煩わしいことになるけど、そうはなってない。

煩わしいよ。


> 上のほうで出たのはJSONのバリデータなんだけど、それはすでにPerlにあるの?


こまけーことイチイチ聞かなきゃ作れないひとには期待してない。

333:デフォルトの名無しさん
09/09/08 23:25:33
>>331
わかりました。ありがとうございます

334:デフォルトの名無しさん
09/09/08 23:30:58
数値と文字列の区別が煩わしいと思う人も居るし
文字列に数値のように振舞われるのが煩わしい人も居る

前者にとって、数字を足すのにいちいち変換するのは苦痛だし
後者にとって、"0"が偽なのは地雷でしかない

335:デフォルトの名無しさん
09/09/08 23:32:01
まだデュエルしてんのか。デュエリスト板でやれ

336:デフォルトの名無しさん
09/09/09 00:56:14
>>334
> 文字列に数値のように振舞われるのが煩わしい人も居る

プログラマが区別できてないなら何しても同じ。
シンタックスエラーかランタイムエラーかの違いすらない。

> 後者にとって、"0"が偽なのは地雷でしかない

イミフ。
歴史的にゼロを偽とするのが習慣。
シェルについては、これも歴史的理由でゼロを真とする習慣だが。

337:デフォルトの名無しさん
09/09/09 01:31:16
0でなく"0"な

338:デフォルトの名無しさん
09/09/09 02:39:02
>>284
ためしにJSON::Syckに1000桁の数字入れたら数値 : Infになりやがった。
JSON.pmは優れたことに文字列に変換して格納してくれてる。マニュアルにも
書いてあったがこれは立派な挙動。

>>313
どう考えても君が悪いと思う。ヌル文字は偽じゃないし、なにを勘違いしてるのか知らんが、
'0000'も真だ。'0'が真で'0x00'を偽にしたいんなら、アスキーコードで判定させればいいし
Perlはその手段を提供している。

> あと、明示的に指定せずにほっといたら'0000'を勝手に0にすんのもやめてくれ、って思った。

は。ソース出してみ。Perlはそんなにお行儀悪くない。

>>326
当然由来までは保存してない。だいたいその解釈であってる。

>>334
よく初心者が引っ掛かるところだが、仕様を理解すれば地雷を踏むことはなくなる。
ただし、テキストファイル末尾の改行文字なし'0'だけはどうすることもできない。

339:デフォルトの名無しさん
09/09/09 07:30:14
>>325
それはJSONが文法的に正しいかどうかをチェックするだけのチェッカーであってバリデータではない。
きみはスキーマバリデータが何かわかってないようだ。
文法をチェックするだけなら1と’1’の違いが問題になるわけがない。

340:デフォルトの名無しさん
09/09/09 08:06:39
>>339
自分が何を言ってるか、理解してる?

341:デフォルトの名無しさん
09/09/09 09:14:15
>>337
> 0でなく"0"な

文字としての比較なら
eqとかne
使えば?

比較演算子使わずに済ますのってZ80でXOR Aするような古くさいイメージ。

342:デフォルトの名無しさん
09/09/09 10:02:56
地雷ってのは思わぬところで踏むものだと思うよ

343:デフォルトの名無しさん
09/09/09 10:44:44
>"0"が偽なのは地雷でしかない

↑コイツ・・・最高にアホだな

344:デフォルトの名無しさん
09/09/09 10:46:15
$unko = undef ; print "\nundef is " , ($unko ? "TRUE" : "FALSE");
$unko = 'KUSO'; print "\n'KUSO' is " , ($unko ? "TRUE" : "FALSE");
$unko = '' ; print "\n'' is " , ($unko ? "TRUE" : "FALSE");
$unko = '1'; print "\n'1' is " , ($unko ? "TRUE" : "FALSE");
$unko = '0'; print "\n'0' is " , ($unko ? "TRUE" : "FALSE");
$unko = 1 ; print "\n 1 is " , ($unko ? "TRUE" : "FALSE");
$unko = 0 ; print "\n 0 is " , ($unko ? "TRUE" : "FALSE");

345:デフォルトの名無しさん
09/09/09 11:09:02
ひとりだけまともな人がいる!

>>306
>Validateする目的は、(JSONを媒体とした)データを受け取ったPerlのプログラムを正常に動作させるためですよね?

残念ながら違います。そういう場合もありますが、バリデータは単に
「入力となるJSONがスキーマ定義を見たしているかどうか(あるいは
どこが間違っているか)」を調べるのが目的です。
そのJSONをPerlで使うかどうかはまた別のことです。

>それなら、データがJSONレベルで数値だったか否かは全く問題にならないのでは?
>JSON表現の "1" と 1、このどちらも、Perlレベルでは文字列としてでも整数値としてでも正常に扱えるんですから

文字列としても整数値としても扱えることが問題なのではなく、
文字列か整数値かを判定できるかどうかが問題です。(違いはわかりますよね?)

>どうしてもJSONレベルでのValidateを望むのであれば、
>JSONデコーダから作るしかないのですね。Ruby等、データに型が備わっている言語であれば、
>確かにJSONデコーダとJSONレベルのValidatorは完全に分離可能でしょう。
>でも、Perlにはそれが出来ない。仕方のないことです

妥当な結論だと思います。
が、Perl信者に言わせると「そういうことをすること自体が間違い」らしいです。
別にどんな言語だって万能じゃないのだから、うまくできないことがあったら
「それはこの言語ではうまくできない」と素直に認めればいいだけなのに、
「そんなことをするほうが間違っている」とわめく痛い信者が多い今日この頃。




346:デフォルトの名無しさん
09/09/09 11:39:31
>>345
そのすぐ後の >307 をスルーしてるのはわざとか
どうしてもPerl自体の問題にすり替えたい様子だが

347:デフォルトの名無しさん
09/09/09 11:42:09
JSONバリデータなんぞ、再帰下降法使っても3時間ありゃ書けるだろうに。
出来ないという奴は、もう、そういうことにしとけ。

348:デフォルトの名無しさん
09/09/09 11:43:10
ほらまた、すぐそういうこと言う。3時間以内に書いて来いって言われるぞw

349:デフォルトの名無しさん
09/09/09 12:02:28
>>345
「自分にはできないから言語が悪い」のですね。
わかります。

350:デフォルトの名無しさん
09/09/09 12:16:20
CPANをユーザーディレクトリで利用するために本当に必要な記述ってなに?

351:デフォルトの名無しさん
09/09/09 12:26:16
>>350
CPANは管理者権限で利用するのが正統

352:デフォルトの名無しさん
09/09/09 13:13:10
>>348
いいんじゃない言われても。馬鹿は放置するだけ。

353:デフォルトの名無しさん
09/09/09 15:03:46
”0” は48(0x30)で真だろ?

354:デフォルトの名無しさん
09/09/09 15:11:09
>>351
わかりました
諦めます

355:デフォルトの名無しさん
09/09/09 15:36:48
>>350
use lib 'ディレクトリ';


のこと?
質問の意図がつかめない。

356:デフォルトの名無しさん
09/09/09 16:34:03
>>353
いったいどこの3流学校でそんな事を習ったんだ?

357:デフォルトの名無しさん
09/09/09 16:46:30
東村山第三小学校だけど

358:デフォルトの名無しさん
09/09/09 18:24:29
中州産業大学だけど

359:デフォルトの名無しさん
09/09/09 19:25:45
nullとの比較は$hoge == undefでおk?

360:デフォルトの名無しさん
09/09/09 19:31:17
えっ?

361:デフォルトの名無しさん
09/09/09 19:37:56
>>359
nullは無い。
defined($hoge)
で未定義をチェック。

362:デフォルトの名無しさん
09/09/09 19:38:34
>>361
ありがとう。
久しぶりにperlをやったから、完全に忘れてる

363:デフォルトの名無しさん
09/09/09 22:15:59
あと、 == は数値比較だから気をつけろ

364:デフォルトの名無しさん
09/09/09 22:18:43
> defined($hoge)

すぐカッコつけたがるよね、最近の若者は。

365:デフォルトの名無しさん
09/09/09 22:36:10
あー、おれもカッコつけたがる若者だわ。
カッコつける場合とつけない場合ってなに?

366:デフォルトの名無しさん
09/09/09 22:42:30
なんかjavaよりめちゃくちゃ速く感じた
本当に速いかわからないけど

367:デフォルトの名無しさん
09/09/10 00:19:45
>>365
優先順位をはっきりさせたいとき。
好み。

368:デフォルトの名無しさん
09/09/10 00:26:44
昔中途半端にカッコつけてたらドツボにハマった
それ以来できる限り自然体でいようと思った

print (1 + 2) * 3, "\n";

369:デフォルトの名無しさん
09/09/10 00:28:04
ifの括弧内に単品で書くなら省くかな
でも複数条件組み合わせるとか、後置ifの条件に入れるときは書きたい

まあ好みだな

370:デフォルトの名無しさん
09/09/10 02:13:48
if (defind $i) {ほげ}
if (defind($i)) {ほげ}
ほげ if defind $i;
ほげ if defind($i);

if (i instanceof Object) ほげ;
if (i instanceof(Object)) ほげ;

if ($i >= 1 && $i <= 10) {ほげ}
if (($i >= 1) && ($i <= 10)) {ほげ}

371:デフォルトの名無しさん
09/09/10 03:03:38
C使いからすると括弧の無いifは我慢ならん

372:デフォルトの名無しさん
09/09/10 03:30:32
JSONを知らないから、外れた事言ってるかもしれないが、
perlは文字と数値を区別しないんだから、区別したいケースが
あるとしたら、外部からのデータな訳だよね?それなら外部から
入力する時に文字をエスケープすれば良いだけじゃないの?
"123"→"%31%32%33",123→"123"とかして。


373:デフォルトの名無しさん
09/09/10 08:00:24
>>372
JSONは通常文字入力をエスケープする仕様にはなってないので、
そういう迂回はすべきでない。


ぎゃーぎゃー騒いでたひと、しまいには
Perlで使うわけではないのにPerlでバリデーション処理したいという
訳のわからないことをいいだした。
重箱のスミつついて意味のない優越感に浸りたかったのだろう。

ほら、あれだ。
「俺の出身小学校からオリンビック選手が出たんだぜ。(俺って)スゲーだろ?」「お前んとこはしょぼいお笑いタレントしかでてないよな?俺の勝ちだな。」
ってレベルな感じ。


374:デフォルトの名無しさん
09/09/10 11:28:58
>>371
かなり重症なC言語脳ですね。
視野が狭すぎますよ。
じぶんの殻に閉じこもりすぎです。
世間は広いんですよ。
もっと多くのものを見て聞いて学ぶべきですよ!

375:デフォルトの名無しさん
09/09/10 11:44:46
かっこを付けてPerlの世界から弾き出され、$を付けてCの世界からも弾き出され

376:デフォルトの名無しさん
09/09/10 11:53:36
かっこ付けない専売特許はRubyのほうが上でしょ?

377:デフォルトの名無しさん
09/09/10 12:06:15
>>376
ベタPerlを自認するRubyが?

378:デフォルトの名無しさん
09/09/10 12:07:49
>>374
そうです!
リスプはカッコの多い言語ですって坂村先生がいってました!

379:デフォルトの名無しさん
09/09/10 13:24:09
>>376
おいおい。それはもしかしてマジレスなのか?

380:デフォルトの名無しさん
09/09/10 14:38:13
>>376
やってみれば分かると思うが、文法的にはRubyのが省略できる条件は制限されるよ
逆に、出来る場面は省略する人が多いけど

381:デフォルトの名無しさん
09/09/10 15:07:30
>>374
えらく風呂敷広げたなw

382:デフォルトの名無しさん
09/09/10 16:13:15
if文のかっこなしはPerl 6からだね

383:デフォルトの名無しさん
09/09/10 16:29:23
>>382
おいおい。それはもしかしてマジレスなのか?

384:デフォルトの名無しさん
09/09/10 16:42:53
>>383
これ↓ができるのはPerl 6からでしょ?

if $x < 0 {
$y = 2;
$z = 3;
}

385:デフォルトの名無しさん
09/09/10 16:45:56
後置の話してたんだろ

386:デフォルトの名無しさん
09/09/10 17:09:11
$a = 1 if $b ne "";

こんなやつでしょ?
これはC++使いだけど特に気にならなかった。
要は三項演算みたいな感じだし

387:デフォルトの名無しさん
09/09/10 19:34:55
>>198 今更ながらありがとう。
 結局ループになってしまったけど……
 一応、該当があれば別のサブルーチンに飛んで、無い場合は最も近い配列の場所を見つけ出すようにしたつもり
 既に配列(@hai)を取り込んであって $in が入れたい内容。

$min = 0;
$mid = 0;
$max = $hairetu - 1; # $hai~は取得した配列の個数

if($max != 0 and $max != -1) {
while ($min <= $max) {
$mid = int(($min+$max)/2);
$space = $max - $min;

if($space == 2) {
last;
} elsif ($space == 3 ) {
if ($hai[$mid] >= $in) {
last;
} else {
$mid += 1;
last;
}

388:デフォルトの名無しさん
09/09/10 19:36:35
} else {
if ($hai[$mid] lt $in) {
$min = $mid - '1';
} elsif ($hai[$mid] gt $in){
$max = $mid + '1';
} elsif ($hai[$mid] eq $in){
&・・・・・       #サブルーチンへ
          last;
         }
       }
}
}

スペース消えてるけど、一応二分探索ループです……
>>198さんのような再帰はうまくつかえなかった……

389:デフォルトの名無しさん
09/09/10 23:35:57
久しぶりにCを書いたら、
@array = (0, 1, 2);
に相当するようなことの書き方すら判らなくなってた

390:デフォルトの名無しさん
09/09/11 00:03:44
perl でソースを複数のモジュールに分けて書いた場合
配布する時は汎用モジュールと同じ様に
個人的なモジュールも CPAN に登録するの?

そのプログラムを使うユーザは
プログラムの入ったディレクトリ・ツリーごと扱って
$HOME/bin とかに入れたりするの?

コンパイルすれば単体の実行ファイルになって扱い易くなるだろうけど
ソースのまま配布したいんだけど……。


391:デフォルトの名無しさん
09/09/11 00:06:53
つ perldoc FindBin
つ perldoc lib


392:デフォルトの名無しさん
09/09/11 02:50:22
use FindBin;
use lib "$FindBin::Bin/lib";
とするか
use FindBin::libs;
でいけるんですね。

取っ掛かりが出来たので OOP だとどうなるのかとか
標準的なディレクトリ構成とかを調べて見ようと思います。
ありがとう。


393:デフォルトの名無しさん
09/09/11 07:50:59
>>390
今CPANはネームスペースがアレなことになっているので、それだけはやめれ。手段ががいしゅつだから省く。
モジュール登録する時も、IRCなどで名前空間の妥当性とCPANに登録する必要性を審議しらもらってからにした方がいい。

394:デフォルトの名無しさん
09/09/11 07:53:17
>>387

ファインチューニングしてないけど、こんな感じ?


sub bsearch($$;$$){
my ($a,$t,$s,$e)=@_;
$s=$[  if !defined $s;
$e=$#$a if !defined $e;
&subroutine if $$a[$s] == $t;
return $s if $s>=$e;

$m=floor(($s+$e)/2);
$x=bsearch($a,$t,$s,$m);
$y=bsearch($a,$t,$m+1,$e);

return ($a[$x]-$t < $a[$y]-$t) ? $x : $y;
}


395:デフォルトの名無しさん
09/09/11 09:06:50
>>394自己レス。

> &subroutine if $$a[$s
これは削除して呼び出し側でチェックしないとだめだわ。
でないと何度も呼ばれてしまう。

396:デフォルトの名無しさん
09/09/11 16:51:05
数値の 0 を参照させたい時はどうしたらいいのでしょう?

397:396
09/09/11 17:02:32
自己解決しました


398:デフォルトの名無しさん
09/09/12 11:10:10
ファイル名を取得するとき、opendirとglobどっちを使うべきなのでしょうか?

399:デフォルトの名無しさん
09/09/12 11:47:16
File::Slurpのread_dirオススメ



400:デフォルトの名無しさん
09/09/12 16:42:48
ファイルグロブなんか使ったらいかんと誰かがブログで書いてたよ

401:デフォルトの名無しさん
09/09/12 17:41:16
>>400
それって結局「いかん根拠なんてないじゃん」という話じゃなかったか?

402:デフォルトの名無しさん
09/09/12 20:35:07
.と..をいちいち除外しなくていい

403:デフォルトの名無しさん
09/09/12 22:42:15
古いperlは、ファイルグロブはシステムに依存してた。
(「ファイル名が長過ぎます」エラー等のperlの外の問題を切り離す事が出来ない。)
つー事で古くからの人間は「グロブなんざ使うんじゃねえ。」と言いがち。
で、それら諸先輩に影響を受けた人々が、本来の根拠と別に理由をこじつけ
「だからグロブは使いません!」って言ってる(人もいる)。

今となってはどっちでも良いんでねえの?10年以上前の常識だし、
俺はグロブ使わんけど。


404:デフォルトの名無しさん
09/09/12 23:31:36
>>398
opendirはファイル名のみとりたいときに便利。

globはパスごととりたいとき便利。

405:デフォルトの名無しさん
09/09/13 00:38:38
あー
パスは自前で管理してファイル名とくっつけて開くのが当然だと思ってたけど、
別にそんなことしなくてもいいか

406:デフォルトの名無しさん
09/09/13 01:48:50
> "There's more than one way to do it" ということで、


407:デフォルトの名無しさん
09/09/13 03:34:06
Perl界の重鎮、子飼弾氏は以下のように述べております。

404 Blog Not Found:perl - glob,readdir, and regexp
URLリンク(blog.livedoor.jp)

408:400
09/09/13 08:39:41
今更ただのシャレだったなんていい出しづらい雰囲気だな

409:デフォルトの名無しさん
09/09/13 11:02:01
えっ・・・みんな気づいてなかったのか?

410:デフォルトの名無しさん
09/09/13 11:58:28
はいはい、>>407は気がついていた。偉い偉い。

411:デフォルトの名無しさん
09/09/13 12:55:27
関数名を動的に指定して実行することはできますか。
sub f1 { print "f1()¥n"; }
sub f2 { print "f2()¥n"; }
...
とあるときに、
my $func = "f2";
$func();
のように実行したいんですけど、できないでしょうか。
ちなみに $func() はシンタックスエラーになり、&$func() は use strict しているとエラーになりました。

412:デフォルトの名無しさん
09/09/13 13:15:31
>>411
my $func = \&f2;
&$func();

もしunix環境があるなら man perlref を見るといいよ。
サブルーチンへの参照の扱いがいろいろ書いてあるから。

413:デフォルトの名無しさん
09/09/13 13:16:47
>>411
その関数に限れば、

main->$func;

で呼べますが。

414:デフォルトの名無しさん
09/09/13 13:19:49
eval "&$func()"とかも使えるね

415:デフォルトの名無しさん
09/09/13 14:08:14
どうもありがとうございます。

>>412
関数名は変数で指定したいので、残念ながらその方法は使えないようです。

>>413
パッケージ名を指定すると呼び出せるのですか。なるほど。
パッケージ名が長いと面倒ですけど、この方法でやってみます。


416:デフォルトの名無しさん
09/09/13 14:34:00
>>415
クラスメソッドとして呼び出してるから第一引数が
自動的に追加されるが、それでもいいのか?

#!/usr/bin/perl -w
use strict;

sub f1 { "f1()\n" }
sub f2 { 'f2(', join(',', map "'$_'", @_), ")\n" }

my %dt = (
  f1 => \&f1,
  f2 => \&f2,
  default => sub { 'anonymous(', join(',', map "'$_'", @_), ")\n" },
);

my($func, @arg) = @ARGV;

print main->$func(@arg);
print $dt{ exists $dt{$func} ? $func : 'default' }->(@arg);
__END__

417:デフォルトの名無しさん
09/09/13 14:56:26
スコープを絞って、no strict 'refs'するのが正攻法?

{
no strict 'refs';
$func->();
}

418:デフォルトの名無しさん
09/09/13 17:17:12
>>411
これでよければ簡単。


$func{f1}= sub { print "f1() n"; };
$func{f2}= sub { print "f2() n"; }

my $func = "f2";
$func{$func}();


419:デフォルトの名無しさん
09/09/13 18:25:33
Text::MicroTemplate でキャッシュを使うにはどうしたらいいでしょうか。
ドキュメントを見るかぎりにおいては、

use Text::MicroTemplate::File;
my $mt = Text::MicroTemplate::File->new(use_cache=>1);
$mt->render_file("example.mt", $arg1, $arg2);

のように、new() に use_cache=>1 を渡すだけでいいと思うのですが、
キャッシュファイルが作成されません。
またベンチマーク結果も、Template-Toolkitよりだいぶ遅いです。
Text::MicroTemplate の使い方を知っている人がいれば教えてください。


420:デフォルトの名無しさん
09/09/13 22:39:43
>>411
AUTOROAD じゃダメなの?

421:デフォルトの名無しさん
09/09/13 23:48:59
windowsXP+ActivePerl5での質問です。
windows media encoderで映像をライブ中継したいのですが
ライブ中継中だけ、ブラウザにメディアプレイヤーが表示されるようにしたいです。
サーバ側のwindows media encoderが起動されていることがPerlで確認できれば
そのようなことが可能だとおもったのですが、そのような関数はありますか?

また、もっといい方法あったら教えていただきたいです。

422:デフォルトの名無しさん
09/09/14 00:54:50
Windowsのコマンドプロンプトから
>scraper URLリンク(www.google.co.jp)

としてscraperを立ち上げられるのですが

>chcp 65001
でコマンドプロンプトの文字コードを変更すると、

>scraper URLリンク(www.google.co.jp)

を入力してもscraperが起動しません。
どうすればいいでしょうか?


Linuxのほうにもscraperを入れてみたのですがシェルから
$ scraper URLリンク(www.google.co.jp)
と入力してもscraperは起動しませんでした

CPANは
perl -MCPAN -e shell
で起動するので

perl -MScraper -e shell
でやってみたのですが駄目でした

どなたかいいやりかた教えてください。

423:デフォルトの名無しさん
09/09/14 00:57:46
>>422 はWeb::Scraperの話です

424:デフォルトの名無しさん
09/09/14 01:28:19
エラーメッセージ隠蔽者


425:デフォルトの名無しさん
09/09/14 07:30:15
>>422
URLリンク(www.google.co.jp)

426:デフォルトの名無しさん
09/09/14 09:19:05
>>425
ありがとうございます

Linuxはフォルダに移動してからscraper URIで起動できました。
>cd /usr/local/bin
>scraper URLリンク(www.google.co.jp)


Windowsは
C:\Perl\bin\scraper.bat
を実行すればscraperは起動します

>chcp 65001
とした時点で
>cd C:\Perl\bin\
>scraper.bat URI

結果(エラーメッセージなし)
>

となってスルーされてしまいます。
Linuxで実行できるので、Windows側はもういいかなという感じです。文字化けが厄介なので。






427:デフォルトの名無しさん
09/09/14 11:03:49
……

428:デフォルトの名無しさん
09/09/14 14:20:02
どのパッケージからでもパッケージ名を付けずに呼べるようなサブルーチンを定義できますか?
もちろん、名前空間的に危ういことは百も承知で。
用途としては、個人用のスクリプトでよく使う処理を纏めておきたいって感じです。

429:デフォルトの名無しさん
09/09/14 15:48:12
普通に(package宣言せずに)関数を別ファイルに定義してuseなりrequireなりすればよくね?

430:デフォルトの名無しさん
09/09/14 16:10:04
package宣言してもimportしちゃえば問題無いと思われ。

431:デフォルトの名無しさん
09/09/14 16:41:51
ま、そのうち後悔するからモジュールにしてuseするようにしとけ。
Exporter使えばそんなに難しくないし。

432:デフォルトの名無しさん
09/09/15 02:50:59
overloadプラグマをuseしたときに使える関数一覧はありませんか?
overload::StrValとかが何する関数か知りたいです

433:デフォルトの名無しさん
09/09/15 03:08:13
>>432
URLリンク(perldoc.perl.org)
URLリンク(perldoc.jp)

434:デフォルトの名無しさん
09/09/15 04:10:08
マニュアルを読まなくなった次の時代には、マニュアルという概念自体が失われる。

435:デフォルトの名無しさん
09/09/15 09:29:23
>>429-430
use、require、importと色々試しましたが最初の1回しか効かないような…?
とりあえず>>431に出ているExporterを覚えてみます。ありがとうございました。

…というか、色々探してたら
欲しい処理は既にCPANにあったと言うオチ…お騒がせしました。

436:デフォルトの名無しさん
09/09/15 14:35:00
>>435
凝った事しない限り大抵そのオチだから気にしなくても。


437:デフォルトの名無しさん
09/09/16 08:50:40
>>436
変なスレが上がってる

438:デフォルトの名無しさん
09/09/16 09:54:55
はじめまして、こんにちは。 Perl 4 や Perl 5.005 の時代からやってきました。
私のような古代人が最近の Perl 5.10 くらいのモダンな Perl のコードを
書けるようになるのにおすすめの書籍やドキュメントがあれば教えてください。

439:デフォルトの名無しさん
09/09/16 11:31:39
>>438
今風
URLリンク(perl-users.jp)


440:439
09/09/16 11:34:07
>>438
間違えたこっちだった
URLリンク(perl-users.jp)


441:デフォルトの名無しさん
09/09/16 14:56:23
>>438
本はモダンPerl入門かな。
ジュンク堂で一回りしてみたが、モダンPerlメインの書籍っつったら
これくらいしかなかった。良書とはいえないが悪書でもない。
5.005の国からやってきたのならお勧めする。

昨今のモダンPerl事情をすっげー主観入れて簡単にまとめると、
・とりあえずモダンPerlと言えばまずMooseありき。
・中規模以上のWebAppならMVCモデルWAF(Catalyst等)へ移行。
・DBICとかO/Rマッパ知っとけ(Schema::Loaderとか超楽)。最低限プレースホルダは使え。絶対使え。
・スケーラビリティ。AnyEvent, Coro, *::Async辺り押さえとけ。
・そろそろPerl6の準備を。Mooseの経験が生きる。来年1期にParrotが、2期にPerl6リリース予定(Dan Kogai)
・んでとにかくテスト書け。絶対書け。死んでも書け(Shawn Moore)。

442:デフォルトの名無しさん
09/09/16 19:29:52
すっかりJavaみたいになっちゃって

443:デフォルトの名無しさん
09/09/16 19:51:10
HTML::Templateがold styleでTemplate Toolkitがmodern扱いなのは遺憾に思う。

444:デフォルトの名無しさん
09/09/16 20:00:47
あほなSmarty野郎どもがHTMLをSmartyコードで大量汚染している現状を見ると、HTML::Template(またはHTML::Template::Pro)くらいが丁度いいよな。
機能が絞られているとはいえ不自由した事全然無いし。

445:デフォルトの名無しさん
09/09/16 23:17:12
>>442
ねー。まあ完全にOOへ移行したんだから仕方ないと思う。5のはやっつけなんちゃってOOだし。
bless実装だけでOO移行するとかLarryの頭の中はどーなってんだか。

>>443
誰かがそれ書いてたけどTTは重くて最近は評判悪いよ。
下手に高機能だからモデルとビューの分離に失敗しやすいし。
テンプレート重いのは致命的だし。
ClearSilverくらいがちょうどいい。

HTML::Templateは<>で囲っちゃいかんだろ。何文書かわからん。
TTは逆に意味不明な文字列扱いになってしまう。まあロジックだから
それでいいと考えることもできる。
CSは<?cs ... ?>で囲ってあるので一応お行儀が良い。

446:デフォルトの名無しさん
09/09/16 23:56:58
俺はPerl5のOOは好きだけどね
いつの間にかC++やJavaの、クラスを作るあれがオブジェクト指向って
ことになってるけど、本来はオブジェクトを作れればオブジェクト指向
だったわけで、その辺りを垣間見れるのがいい

447:デフォルトの名無しさん
09/09/17 00:12:30
>445
別にTTは[% ... %]でなくてもいいってこと、たまには思い出してあげてください…

use Template;

my $tt = Template->new({ START_TAG => '<\?(?i:tt)', END_TAG => '\?>' });

$tt->process(\*DATA, { hello => 'Hello, Template Toolkit!' });

__DATA__
<html>
<head><title>TT Sample</title></head>
<body>
<p><?tt hello ?></p>
</body>
</html>


448:デフォルトの名無しさん
09/09/17 00:48:23
とあるリストを返す関数があり、その中から私が欲しいのは2番目の要素だけなのですが
これをfuncA()[1]と書くとエラーになり、funcA()->[1]と書くと想定した値は返って来ません。
my @ary = funcA(); $ary[1];だと想定通りの値を得ることができました。
関数が返すのがリストで、その一部のみが欲しい場合、一旦配列に格納するしか無いのでしょうか?

449:デフォルトの名無しさん
09/09/17 00:51:04
…「一部」って紛らわしいかも知れない。
欲しいのはその1要素のみです。スカラーコンテキストを仮定してます。

450:デフォルトの名無しさん
09/09/17 02:20:21
(funcA())[1]

451:デフォルトの名無しさん
09/09/17 03:44:00
カッコエエ!

452:デフォルトの名無しさん
09/09/17 08:12:42
>>450
一部ならこんなのもオケ。
> (funcA())[1,3,5]


spliceも使えるかも。

453:デフォルトの名無しさん
09/09/17 09:50:46
>>450
行けました。ありがとうございます、こんな書き方が出来るなんて…

>>452
カッコエエw

454:デフォルトの名無しさん
09/09/17 09:54:55
>>447
それがオプション1つで切り替えられるなら納得いくんだがな。

>>448
> (funcA())[1]

なぜ括弧が必要か?これは曖昧さ回避のために必要な構文。曖昧さとは、例えば

funcA (1,2,3)[1];

とした場合、(1,2,3)[1]が先にパースされて

funcA 2; -> funcA(2); # そんなつもりでは・・・。

とも解釈できる点。こういった経緯からパーサはfuncA()[1]のような構文を見つけるとエラーを返す。
なので明示的に関数呼び出しを括弧で囲って、funcA()の戻り値を配列として扱うことを示す必要がある。

(funcA(), funcB())[2, 4, 6, 8]

みたいなことも可能。どうしても括弧が嫌ならリファレンスを使う。

sub funcA{ [1, 2, 3] } のようにfuncAを変更すれば、

funcA()->[1];

みたいに出来る。これは文法に曖昧さがないため括弧は不要。

455:デフォルトの名無しさん
09/09/17 11:37:03
>>454
解説ありがとうございます。別に括弧がイヤとかではないです。
自作関数では無いので、できれば関数の中身は変更したくなかったのです。

456:デフォルトの名無しさん
09/09/17 22:24:46
ある配列に 25-001-2009 の形の 日-月-年データがあって、その配列を比較してその結果で置換したいんだ
この場合24-001-2009か26-001-2009のような連続した日と比較する場合、
24~25-001-2009、25~26-001-2009に置き換えたい

また、それ以外の日はは25-001-2009,27-001-2009のように値をコンマを付けて後ろに付けたい。

Splice(@list,n,1,$tikan);として、
配列から取り出して置換して元あった場所に戻したいんだけど、
ループさせるとうまく出来ない……どなたか何か教えていただけないでしょうか

なおnはループを回すごとに値が変わります。

457:デフォルトの名無しさん
09/09/17 23:10:48
>>456
配列をスキャンしながら、その配列自体を変更するのは、
とくにその結果で要素が増減する場合は、たいてい面倒くさい処理が必要になる。

おれはそういうときは別の作業用配列にデータを作っていって、
最後にもとの配列に書き戻すようにする。

458:デフォルトの名無しさん
09/09/18 00:14:07
>>456
日本語でオケ

459:デフォルトの名無しさん
09/09/18 02:06:39
>>456
ちょっと簡略化したけどこういう感じ?ようわからんけど

my @month = qw(11-2009 12-2009 01-2010);
my $cmp = '10-2009';
my( $m1, $y1) = split '-', $cmp;

foreach(@month){
my( $m2, $y2) = split '-', $_;
if( $m2 - $m1 == 1 and $y2 == $y1){
$_ = "$m1~$m2-". $y1;
}
elsif( $m2 - $m1 == -1 and $y2 == $y1){
$_ = "$m2~$m1-". $y1;
}
else{
$_ = "$_, $cmp";
}
}

年とか違うけど1日違いだよってのには対応しなくていいんだよな?

460:デフォルトの名無しさん
09/09/18 12:37:10
こんなんなった。複数日は対応したが月またぎは知らんぞ。_で区切ってevalさせてるとこがミソだ。

#!/usr/bin/perl
my @date = qw( 23-001-2009 25-001-2009 26-001-2009 27-001-2009 29-001-2009 30-001-2009 01-002-2009 03-002-2009 30-002-2009 31-002-2009 );
my (@copy, @stack, $mark) = @date;

foreach(@copy){ $_ = join("_", reverse split('-')) }
@copy = sort @copy;

while(1){
  my ($cur, $nex) = splice @copy, 0, 2;

  print @stack ? span(@stack) : $cur and last unless($nex);

  if(eval($nex) - eval($cur) == 1 ){
    @stack = @stack ? ($stack[0], $nex) : ($cur, $nex);
  }else{
    if(@stack){print span(@stack); @stack = (); $mark = 1}
    print "$cur, " unless $mark;
    $mark = 0;
  }
  unshift(@copy, $nex);
}
sub span{
  my @stack = @_;
  join('-', substr($stack[0], -2) . '~' . substr($stack[1], -2), (split('_', $stack[0]))[1, 0]) . ", ";
}


461:デフォルトの名無しさん
09/09/18 12:41:26
結果:
2009_001_23, 25~27-001-2009, 29~30-001-2009, 2009_002_01, 2009_002_03, 30~31-002-2009,

あー!何もせずにprint $curしてるとこが何箇所かあるからフォーマットがまちまちになっちまった。
まあsplitしてreverseしてjoinするだけだからそこんとこはなんとかしてくれ。

462:デフォルトの名無しさん
09/09/18 12:53:44
ソート済み前提版
#!/usr/bin/perl
my @date = qw( 23-001-2009 25-001-2009 26-001-2009 28-001-2009 29-001-2009 30-001-2009 01-002-2009 03-002-2009 30-002-2009 31-002-2009 );

my (@copy, @stack, $mark) = @date;

sub day{substr($_[0], 0, 2)}
sub span{join('-', day($_[0]).'~'.day($_[1]), (substr($_[0], 4))) . ", "}

while(1){
  my ($cur, $nex) = splice @copy, 0, 2;

  print @stack ? span(@stack) : $cur and last unless($nex);

  if(day($nex) - day($cur) == 1 ){
    @stack = @stack ? ($stack[0], $nex) : ($cur, $nex);
  }else{
    if(@stack){
      print span(@stack);
      @stack = (); $mark = 1;
    }
    print "$cur, " unless $mark;
    $mark = 0;
  }
  unshift(@copy, $nex);
}


463:デフォルトの名無しさん
09/09/18 14:12:39
DateTimeで処理する方がいいんじゃないかな?
@dts作る時にmap使いたかったんだけど、あり得ない日付の時のこと考えるとundef入っちゃうからできなかった
use strict; use warnings;
use utf8;
use DateTime;
use DateTime::Format::Strptime;

my @date = qw( 23-001-2009 25-001-2009 26-001-2009 28-001-2009 29-001-2009 30-001-2009 01-002-2009 03-002-2010 30-002-2010 31-002-2010 );
my $pattern = '%d-0%m-%Y';
my $fmt = DateTime::Format::Strptime->new( pattern => $pattern, time_zone => 'Asia/Tokyo', );
my @dts;
for (@date) {
  my $dt = $fmt->parse_datetime($_);
  push @dts, $dt if $dt;
}
my @res_dts;
my $pre_dt;
for my $i (0 .. $#dts) {
  my $dt = $dts[$i];

  if ($i != 0) {
    my $duration = $dt - $pre_dt;
    if ( ($duration->delta_days == 1) && ($duration->delta_months == 0) ) {
      push @res_dts, $pre_dt->day . "~" . $dt->strftime($pattern);
    }
    else {
      push @res_dts, $pre_dt->strftime($pattern) . "," . $dt->strftime($pattern);
    }
  }
  $pre_dt = $dt;
}
warn join "\n", @res_dts;

464:デフォルトの名無しさん
09/09/18 14:29:00
456だけど条件一部抜けてた……折角書いて頂いたのに申し訳ないです

~で繋ぐのは年月同じ、日1日ずれのみ、他は全部,で繋いで、年月日全部同じは置換しない
20~23のような時に、21や22と比較する場合は置換しない

置換する方の配列で置換される要素はループ1回につき1つだけです
どれとどれが比較されるかはループ1回ごとに別に作成した条件式で決定されています




ここの処理で一週間詰まってるんです……どうかお願い致します

465:デフォルトの名無しさん
09/09/18 15:35:47
>>464
お前、もうこっち来い

Perlでリクに答えるスクリプトを作るスレ
スレリンク(tech板)

で、日本語がよくわからないから
入力:ほげほげ
出力:ほげほげ
って感じで具体例のパターン書いて

466:デフォルトの名無しさん
09/09/18 17:42:31
>>456
こうか?


ある配列に 25-001-2009 の形の 日-月-年データがある。
その配列データに対して以下の処理をし、結果をもとの配列にいれたい。
データが24-001-2009、25-001-2009のように2連続の日の場合は、
24~25-001-2009に置き換えたい。
それ以外は、25-001-2009,27-001-2009のように月毎にまとめ、値をコンマを付けて後ろに付けたい。


あと2,3条件があるだろ?
すくなくともデータが

24-001-2009
25-001-2009
26-001-2009
28-001-2009

という場合はどうしたいかとか決まらないと実装できない。


467:デフォルトの名無しさん
09/09/18 22:19:15
perlでcronみたいなスケジューリングを実現するモジュールってありますか?

468: ◆TWARamEjuA
09/09/18 23:16:55 BE:1742382-BRZ(10101)
crontab につらつらとファイル名を描けばよいのではないかと思うのであります。

469:デフォルトの名無しさん
09/09/19 00:34:39
>>468
バッチジョブを管理したいのですが、
ジョブが結構増えてきてcrontabをこれ以上汚したくないなと。
YAMLとかでジョブ管理出来たら綺麗かなーと思ったのです…。

470:デフォルトの名無しさん
09/09/19 04:55:47
Schedule::Cron

471:デフォルトの名無しさん
09/09/19 05:45:05
>>464
25-001-2009 26-001-2009 27-001-2009 28-001-2009 29-001-2009 30-001-2009 01-002-2009
ときた場合どうなる?値は配列にだけ入ってるんだよな。ソートはされてるのか?

> 置換する方の配列で置換される要素はループ1回につき1つだけです
> どれとどれが比較されるかはループ1回ごとに別に作成した条件式で決定されています

ここ日本語に翻訳してくれ。それかソース晒してくれ。
俺かなり頑張ったんだが違いますごめんなさいだとかなり凹む。

472:デフォルトの名無しさん
09/09/19 05:50:54
>>463
こんなんなるぞ。
23-001-2009,25-001-2009
25~26-001-2009
26-001-2009,28-001-2009
28~29-001-2009
29~30-001-2009

俺がunshiftしたりごにょごにょしてるのはこれ防ぐため。

473:デフォルトの名無しさん
09/09/19 07:01:20
早起きニートでエスパーな俺が説明してみる。

例えば以下のような書式の日付を集めた配列があるとする。

@dates = qw(
24-001-2009
25-001-2009
26-001-2009
28-001-2009
);

ある条件によって、追加する要素と追加される要素が1つずつ選ばれる。
例えば、

追加する要素:$dates[1] #=>25-001-2009
追加される要素:$dates[2] #=>26-001-2009

とすると、この場合、日付が1日違いなので、追加される要素は、

$dates[2] = 25~26-001-2009

のように置換する。置換をするのは追加される要素だけである。
この結果、元の配列を以下となる。

@dates = qw(
24-001-2009
25-001-2009
25~26-001-2009
28-001-2009
);

474:デフォルトの名無しさん
09/09/19 07:02:20
この状態から、また追加する要素と追加される要素が1つずつ選ばれる。
例えば、

追加する要素:$dates[0] #=>24-001-2009
追加される要素:$dates[3] #=>28-001-2009

が選ばれたとすると、日付が1日違いでないので、「,」でくっつけたので置換する。
単純に「28-001-2009,24-001-2009」と後ろにくっつけるのか、それとも、昇順にして
「24-001-2009,28-001-2009」とするのかは定かでないが、多分、昇順にするのであろう。

結果、元の配列は以下となる。

@dates = qw(
24-001-2009
25-001-2009
25~26-001-2009
24-001-2009,28-001-2009
);

次は、

追加する要素:$dates[1] #=>25-001-2009
追加される要素:$dates[3] #=>24-001-2009,28-001-2009

結果、

@dates = qw(
24-001-2009
25-001-2009
25~26-001-2009
24~25-001-2009,28-001-2009
);

475:デフォルトの名無しさん
09/09/19 07:03:01
次は、

追加する要素:$dates[0] #=>24-001-2009
追加される要素:$dates[3] #=>24~25-001-2009,28-001-2009

この場合、「$dates[3] #=>24~25-001-2009,28-001-2009」に「$dates[0] #=>24-001-2009」
が含まれているので何もしない。

476:デフォルトの名無しさん
09/09/19 08:00:05
質問。
use Test::Simple tests => 3;
のように、「use パッケージ名」のあとに引数を指定できるようにしたいのですが、
useで指定した引数ってどうやって参照すればいいのでしょか。
(@_や@ARGVを試してみましたが、違うようです。)
よろしくお願いします。

477:デフォルトの名無しさん
09/09/19 08:05:51
BEGIN { require Test::Simple; import Test::Simple tests => 3; }

とだいたい同じこと


478:デフォルトの名無しさん
09/09/19 08:31:50
>>477
仕組みを聞いているんじゃなくて、方法を聞いているんですけど。

じゃあ質問を変えます。importの引数はどうやって参照できますか。
たとえば「import Test::Simple tests=>3」のようにあったとして、Test::Simpleパッケージから「tests=>3」を参照する方法を教えてください。

ググったところ、「importの引数は@EXPORTや@EXPORT_OKに指定したものでインポートしたいものを指定する役割をもつ」と
いうような説明があったのですが、この説明ではimportの引数を参照する方法がわかりませんでした。

479:デフォルトの名無しさん
09/09/19 08:50:27
ふくしの大学?に通ってるんですけど!
package Unko;
sub import {
for(;;) { print @_; }
}
return 1;

use Unko unko => "unko";

480:デフォルトの名無しさん
09/09/19 09:27:17
>>478
import呼ばれるんだからimport定義すればいいだけだろ。頭悪いの?

481:デフォルトの名無しさん
09/09/19 09:37:11
Test::Simple->import('tests', 3);
イメージではこっちが分かりやすいかも。

482:デフォルトの名無しさん
09/09/19 11:01:35
>>475
24~25-001-2009,28-001-2009に
27-001-2009が来たら、
24~25-001-2009,27~28-001-2009になるのか?メンドクサイなあ。同じく
23-001-2009が来たら、
23~25-001-2009,28-001-2009になるの?
26-001-2009,28-001-2009に
27-001-2009がきたらどーすんのよ。
ルールが複雑すぎて正規化できないし、
ちょっとここでどうにかするproblemじゃない気がするんだが。
どっかに発注した方が早い気がする。って受注してるから困ってるんだよなww

>>478
> 仕組みを聞いているんじゃなくて、方法を聞いているんですけど。

普通の人ならこの一言で一発で教えてやる気なくなるわな。
なんで誰もちゃんと教えてくれないかわかってないんだろ。
1つ勉強になったな。

関数の引数を参照する方法が分からないレベルなら、
Exporterはもうちょっと勉強してからいじった方がいいと思うな。

483:デフォルトの名無しさん
09/09/19 11:23:55
>>470
ありがとう。試してみます。

484:デフォルトの名無しさん
09/09/19 11:31:16
>>478

Test/Simple.pmにimport関数を作る。

-- Test/Simple.pm --
sub import {
print @_;
goto &{Test::Builder::Module::import}; #=>本来呼ばれるべきimport関数に飛ばす
}

@_の第1引数にパッケージ名(Test::Simple)が入っており、それ以降に use で指定した引数
が入っている。

485:デフォルトの名無しさん
09/09/19 12:12:54
>>484
CPANモジュールの中いじっちゃダメだろw


486:デフォルトの名無しさん
09/09/19 12:34:31
>>485
そうだね。
ごめん、ごめん。

>>484でなく、以下を追加する。

BEGIN {
package Test::Simple;
sub import {
print "@_";
goto &{Test::Builder::Module::import};

}
}

487:デフォルトの名無しさん
09/09/19 12:53:08
>>479
ありがとうございます!
import って関数なんですか?Perlの予約語だと思ってました。
477で
>import Test::Simple tests => 3
のような書き方をしているんですけど、Test::Simpleのあとにコンマがない呼び出し方って、
予約語じゃなくてもできるんですか。Perlすごい。
あと、importを自分で定義すると use Exporter 'import' とバッティングしてしまうようなんですけど、
これは仕方ないことでしょうか。

>>480
頭は悪いです。すみません。
importは予約語だと思ってたので、再定義するという発想はありませんでした。
Perlは特殊変数が多いから、useの引数もきっと特別な変数かなんかで参照できるのだろうと思ってました。
やっぱりPerlは頭がいい人のための言語ですね。低能には難しすぎる。

488:デフォルトの名無しさん
09/09/19 13:08:52
>>486
数字のとこだけなら、1行で取り出せるよ。
ずっとソース読んでたw

>>487
> あとにコンマがない呼び出し方って、 予約語じゃなくてもできるんですか。
sub hello{print @_} hello 'a';
最初から何もしなくても出来るよ。

>バッティング
それをオーバーライドという。オブジェクト志向における正しい挙動。
仕方ないんじゃなくてそれで合ってる。

> useの引数もきっと特別な変数かなんかで参照できるのだろうと思ってました。
なかなかいい勘をしていらっしゃる。必ず参照できるとは限らないけどね。この場合なら数字んとこは取れるよ。

489:デフォルトの名無しさん
09/09/19 13:09:34
指向な。

490:デフォルトの名無しさん
09/09/19 13:25:29
オブジェクト歯垢

491:デフォルトの名無しさん
09/09/19 13:26:05
>>488
数字はどこかのパッケージ変数に入ってるの?

492:デフォルトの名無しさん
09/09/19 13:55:57
ハッシュのリファレンスがあるとき、
そのハッシュの浅いコピーのリファレンスを得る良い方法があれば教えてください。

my $foo = {};
my $bar = {%{$foo}};

とかいうのは思い付いたんですが、
もっとシンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法が
あればお願いします。

493:デフォルトの名無しさん
09/09/19 16:45:47
>>491
ourな変数(オブジェクト)に入ってる。ソース読めば分かる。

>>492
日本語がよくわかんないです。

494:492
09/09/19 17:24:49
>>493
すみません、 >>492 の後半は、
「ほかにもっとマシな、あるいは俺ならこうする、という方法があれば教えてください」
ということで、ひとつよろしくお願いします。

495:デフォルトの名無しさん
09/09/19 20:11:31
>>494
いや、だから何をしたいのか分からないよその文章じゃ。
例もデリファレンスしてまたリファレンス作ってるだけだし
なにがやりたいんだか不明。

496:デフォルトの名無しさん
09/09/19 21:45:09
>ハッシュの浅いコピーのリファレンス
意味不明

497:デフォルトの名無しさん
09/09/19 21:55:00
>>464
>>460-462さんのを参考に、>>473-475さんの仕様をもとに作成した。

use Data::Dumper;

my @dates = qw( 24-001-2009 25-001-2009 26-001-2009 28-001-2009 );

print Dumper \@dates;

for (0..10) {
my ($index_add, $index_added) = (int rand @dates, int rand @dates);
my ($date_add, $date_added) = ($dates[$index_add], $dates[$index_added]);

print "\n[$index_add:$date_add] => [$index_added:$date_added]\n";
splice @dates, $index_added, 1, form_date( breakup_date($date_add), breakup_date($date_added) );
print Dumper \@dates;
}

sub breakup_date {
my @dates;

for my $date ( split /,/, $_[0] ) {
if ( $date =~ /^(\d+)~(\d+)(.*)/ ) {
push @dates, map{ $_ . $3 } $1..$2;
} else {
push @dates, $date;
}
}

@dates;
}

498:デフォルトの名無しさん
09/09/19 21:55:44
>>497の続き

sub form_date {
my (@formatted_dates, @stack);
my @sorted_dates = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_, join '-', reverse split /-/] } @_;

for my $i (0..$#sorted_dates) {
my ($cur, $next) = ($sorted_dates[$i], $sorted_dates[$i+1]);
next if $next and $cur eq $next;

if ( $next and eval "($next) - ($cur)" == 1 ) {
@stack = @stack ? ($stack[0], $next) : ($cur, $next);
} else {
if (@stack) {
$stack[0] =~ s/(?<=^\d{2})/'~' . substr($stack[1], 0, 2)/e;
push @formatted_dates, $stack[0];
@stack = ();
} else {
push @formatted_dates, $cur;
}
}
}

join ',', @formatted_dates;
}

499:デフォルトの名無しさん
09/09/19 22:06:09
>>484,486
ありがとうございます!import関数を定義して、その中でgotoを使えばいいんですね。
gotoとか知らなかったので、import関数を定義しただけでは立ち往生してしまうところでした。

>>488
>sub hello{print @_} hello 'a';
>最初から何もしなくても出来るよ。
関数名と最初の引数との間のコンマは省略できるのは知っています。
そうじゃなくて、import test::Simple tests=>3 のような書き方だと、第1引数と第2引数の間の
コンマも省略されていて、これは「何もしなくても出来る」ことはないからimportは予約語だと思ってました。

> それをオーバーライドという。オブジェクト志向における正しい挙動。
この場合はオーバーライドはまったく関係ないと思います。理由は継承関係を設定してないからです。
use Exporter 'import'; としただけでは継承関係は設定されませんよね?だからオブジェクト指向でいうオーバーライドとは関係ないんじゃないでしょうか。

>>482
>普通の人ならこの一言で一発で教えてやる気なくなるわな。
>なんで誰もちゃんと教えてくれないかわかってないんだろ。
>1つ勉強になったな。
ちゃんと教えてくれる親切な人は他にいたので助かりました。
あとimportが予約語じゃないというのはひとつ勉強になりました。


500:デフォルトの名無しさん
09/09/19 22:20:44
スタックのような動作をする(もちろんそれ以外にも色々と機能がある)オブジェクトを作ろうとして
標準の関数にならい、pushとpopを定義しました。
その中で標準のpushとpopを使うために、main::pushやmain::popと書いたのですが
Undefined method &main::push などと言われてしまいます。
どのように書けば良いのでしょうか?

501:デフォルトの名無しさん
09/09/19 22:30:41
>>499
これを実行すればわかるんじゃないかな?

package foo;
sub func { print "@_\n" }

func foo 1, 2;
foo->func(1, 2);

502:デフォルトの名無しさん
09/09/19 22:41:31
>>499
こうすれば引数の内容をmainでも参照できるようになるよ。

use strict;
use warnings;

BEGIN {
package Test::Simple;
sub import {
{
no strict 'refs';
@{caller().'::test_args'} = @_[1..$#_];
}
goto &{Test::Builder::Module::import};
}
}

use Test::Simple tests => 3;

our @test_args;
print "args = @test_args\n";

503:デフォルトの名無しさん
09/09/19 23:23:31
>500
(ユーザ定義でない)組み込み関数を使うならCORE::popとかCORE::pushとか。

504:492
09/09/20 00:20:11
>>495
うーん、コピーしたハッシュのデータのリファレンスを得たいのです。

> 例もデリファレンスしてまたリファレンス作ってるだけだし
いや、そうはなってないと思うんですが。

my $foo = {};
printf "%s %s %s\n", $foo, \%{$foo}, {%{$foo}};
# => HASH(0x8103a48) HASH(0x8103a48) HASH(0x81038e0)

$foo をデリファレンスしてまたリファレンス作った \%{$foo} は $foo と同一オブジェクトですが、
{%{$foo}} の方は $foo とは異なるオブジェクトになっていると思います。
後者のように、値がコピーされた別のオブジェクトを得たいです。

>>496
浅いコピー (shallow copy) って普通に言わないですかね?

505:デフォルトの名無しさん
09/09/20 01:23:54
> my $foo = {};
> my $bar = {%{$foo}};
> もっとシンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法が

いや、それで十分「シンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法」なんだが。
敢えて添削するなら括弧を1組み省略できる。

my $bar = {%{$foo}};
 ↓
my $bar = {%$foo};

この辺りのリファレンス/デリファレンス、複合データ構造に関しては、オライリーの「プログラミングPerl」を読めば最低限の基礎情報は書いている。
さらに深く知りたければ「実用Perlプログラミング第1版」を読めばいいよ・・・と言いたいが、日本のお馬鹿な書店は「第1版」とは別物の「第2版」(第1版の追補版であって、改訂版ではない)しか置いてないから残念でした。
まー図書館とかを探してくれ。

506:デフォルトの名無しさん
09/09/20 06:24:05
>>499
import Test::Simple test => 3 は print FH 'hoge' と同じ構文
ちなみに new Hoge::Huga 'foo' と書けるけど、newはただの関数名だったりするのと同じ

それから別に @ISA にパッケージ名をぶちこむのだけが継承でないし、new するだけがオブジェクト指向ではない
もっと概念的なものだ

あと一言いわせてもらうと余計な一言が多い

507:デフォルトの名無しさん
09/09/20 09:30:28
>>499
いや、そのスキルでgotoとか覚えるなよ。
一回脳から消せ。ろくなことがない。

> これは「何もしなくても出来る」ことはないから
package Bob;
sub run{print "Bob ran $_[1].\n"}
package main;
run Bob 'away'; # ここ
--
Bob ran away.

どこが?

> ちゃんと教えてくれる親切な人は他にいたので助かりました。
CPANモジュールの名前空間いじっていじるのが「ちゃんと」なのかw
正直君のレベルでああいうハックを覚えるとろくなことがない。忘れろ。
もちっとマシな解答は別にあるし誰も答えてくれてないようだな。

> この場合はオーバーライドはまったく関係ないと思います。理由は継承関係を設定してないからです。
えっと、何のこと?ほんと一言多い人だな。
--- Test::Simple --
use Test::Builder::Module;
our @ISA = qw(Test::Builder::Module);
---Test::Builder::Module;
require Exporter;
our @ISA = qw(Exporter);

>>502
おまいらいい加減素人にgoto教えるの止めろ。

508:デフォルトの名無しさん
09/09/20 09:36:50
goto LABEL ならともかく goto &SUB; くらい許してやれよ


509:デフォルトの名無しさん
09/09/20 09:38:30
>>503
出来ました。COREというパッケージがデフォルトで読まれているのですね。
手元のラクダをよく読んだらCORE擬似パッケージと書いてありました…読み込みが足りなかったようです。
精進します、ありがとうございました。

510:デフォルトの名無しさん
09/09/20 09:39:41
>>502
ああ、同じ人か。普通のことのように書くなよ。素人相手にCPANモジュールの名前空間汚す
ようなdirtyなハック教えて「できるようになるよ。 」じゃねーだろ。どんだけ無邪気だよ。
大規模開発の末端プログラマだったらどうすんだ?相手のレベルみて話しろ。他が迷惑するだろ。
Test::Simpleの挙動が変 -> Test::Simpleを再インストール -> 状況変わらず の不条理ループ開始。

511:デフォルトの名無しさん
09/09/20 09:40:12
たしかに 初期段階でgotoに触れてしまうと、全部そっちに逃げる思考になりがちだかんな

512:デフォルトの名無しさん
09/09/20 09:42:49
>>508
極力避けるべき方法だし、この人はsubとgotoの違いほとんど分かってないだろ。
そんな人に教えちゃダメだ。多分ここがなぜsubじゃなくgotoか説明できないと思われ。

513:デフォルトの名無しさん
09/09/20 09:56:19
>>511
だろ?俺はこの15年でgotoなんかプロダクトに使ったことなんかないぞ。
汚いことするからgotoが出てくる。その辺は分かるだろ?
例えばCatalystは61ファイル中1回もgoto使ってないぞ。
CPANを見渡すと、スピードがネックになるようなものや、コアな部分に触れるようなモジュールにgotoが多い。
でもYAMLで1回、Mooseで8回だ。素人が使うもんじゃないことくらいわかるはず。

>>478
> たとえば「import Test::Simple tests=>3」のようにあったとして、Test::Simpleパッケージから「tests=>3」を参照する方法を教えてください。

この時点で「普通はできません」と答えなかった住人の責任でもあるな。俺も含め。

514:デフォルトの名無しさん
09/09/20 10:21:29
open(NEWFILE, ">shinki.html") ;

で自動的にshinki.htmlを作ってに書き込むようにしてるんだけど
下に自動的にフォルダも作って test/shinki.html
に書き込むようにするにはどう書けばいいですか?

515:デフォルトの名無しさん
09/09/20 10:40:54
CPANモジュールの名前空間を汚さないエレガントな方法が知りたい

516:デフォルトの名無しさん
09/09/20 11:06:39
>>515
名前空間は汚さないが残念ながらエレガントな方法はない。また素人が真似するといかんので、
ヒントはTest::Builderが大事なものをourしちゃってるとこだ。ソース見れば一発で分かる。

正直相手が素人だと分かりきってるのに>>502のような方法を提示する人の気が知れん。
○○に刃物って言葉があるだろ。この素人さん、今後もつまらんことで他人のモジュール
の内臓いじくりまわすに100ペリカ。困ったらgotoもすぐ発動するだろうな。

517:デフォルトの名無しさん
09/09/20 11:09:18
立派な正義感(笑)がいるときいて

518:デフォルトの名無しさん
09/09/20 11:17:58
>>517
正解が出ないからって拗ねるな。

519:デフォルトの名無しさん
09/09/20 11:51:51
しつもん: 所持金0ですけど、新幹線で東京から博多まで行けますか?

かいとう: 改札口を突破して猛ダッシュしろ

まいらのやってることは、こんなレベル

520:デフォルトの名無しさん
09/09/20 12:02:03
>>505
バカなのはオライリーだろ。
中身が全然違う本を同じ題名で出す意味がない。

521:デフォルトの名無しさん
09/09/20 12:09:28
>>514
おれはそういうとき自力でフォルダを作ってるけど。他に方法あるのかな

my $filepath = "test/shinki.html";
use File::Path;
use File::Basename;
File::Path::make_path( File::Basename::dirname($filepath) );
open(NEWFILE, ">$filepath");

522:デフォルトの名無しさん
09/09/20 12:28:34
Activeperl5.10.1,PAR-0.994,PAR-Packer-0.991を使用して
exeファイルを作成した際
元のスクリプトにuse Encode;を使用していると
exeファイル実行時に

プロシージャエントリポイントPerl_croak_xs_usageがダイナミックリンクライブラリperl510.dl
から見つかりませんでした

とerrorが出るのですが解決方法(エラー文自体理解できてませんが)はありますでしょうか?

523:デフォルトの名無しさん
09/09/20 13:12:38
>>519
はげどー。

>>521
それが模範回答じゃないかなぁ。まあ他にモジュールがあるかも知れんが。
それか
$filepath ~= s#([^/]+)$##;
$filename = $1;
system("mkdir -p $filepath");

って良い子は真似すんなよ。

524:デフォルトの名無しさん
09/09/20 20:17:07
あとはPath::Class使う手もあるか

use Path::Class::Dir;
my $d = Path::Class::Dir->new('test', 'foo', 'bar');
$d->mkpath;
my $f = $d->file('shinki.html');
my $fh = $f->openw;


525:デフォルトの名無しさん
09/09/21 06:32:33
>>4を見て思ったのですが、

use utf8;
use open IO => "encoding(cp932)";
use open ":std";
use Encode;

でもいいんですかね?

526:デフォルトの名無しさん
09/09/21 07:45:26
>>523
> それか
> system("mkdir -p $filepath");


mkdir $filepath;


527:デフォルトの名無しさん
09/09/21 10:49:54
>526
それだと深いディレクトリ作れないだろ。./test/が存在しないときに./test/test2/test3/とか作れない。

528:デフォルトの名無しさん
09/09/21 11:48:00
なんのためにpオプション付けてると思ってんだよ

529:528
09/09/21 11:48:41
とても恥ずかしい

530:デフォルトの名無しさん
09/09/21 11:56:45
>>525
一箇所コロンが抜けてる……けど、無くても動くっぽい?
use open IO => ":encoding(cp932)";

ファイルのエンコーディング設定も入るから、そこは注意。

531:デフォルトの名無しさん
09/09/21 13:49:14
system関数を使うのと、system関数の引数をWindowsコマンドプロンプトで直接実行したものの比較

system('mkdir -p a/b/c/d'); #Active Perl o / コマンドプロンプト x
system('mkdir -p a\z\x\y'); #Active Perl o / コマンドプロンプト o
system('mkdir b/b/c/d'); #Active Perl x / コマンドプロンプト x
system('mkdir b\z\x\y'); #Active Perl x / コマンドプロンプト o

x -- エラー
o -- 成功

sysytem 関数とコマンドプロンプトでは、若干の違いがあるんだね。

532:デフォルトの名無しさん
09/09/21 14:16:06
>>531
Windowsでmkdirに-pオプション付けると
"-p"って名前のフォルダが作られない?
うちでは作られた

533:デフォルトの名無しさん
09/09/21 15:15:24
>>530
コロンが抜けていたのは自分のタイポですね。
すみません。

open.pmを見てみると、

$layer =~ s/^://;

と、コロンを消してから処理をしているように見えます。
結局、コロンはあってもなくてもいいのかな?

534:デフォルトの名無しさん
09/09/21 18:02:29
>>533
付いてなくても動くかも知れないけど、PODでは付けることになってるし、
明文化されてない部分だから、付けといた方がいいと思う。

535:デフォルトの名無しさん
09/09/21 20:50:57
>>527-529
> >526
> それだと深いディレクトリ作れないだろ。./test/が存在しないときに./test/test2/test3/とか作れない。

> $filepath ~= s#([^/]+)$##;
> $filename = $1;
> system("mkdir -p $filepath");


どーなんだろー?

536:デフォルトの名無しさん
09/09/21 22:11:09
>>>535
言う前にやってみろよw
UN*X標準のmkdirはデフォルトでは1つのディレクトリしか作れないから。

537:デフォルトの名無しさん
09/09/22 00:02:13
Windows 2000 や XP だと中間ディレクトリが作られるね。
外部コマンドを利用する場合は特に、利用している OS などの環境を明確にしないと、
延々と話が噛み合わないで平行線を辿ると思う。

しかし、 >>531 を見ると、まあ言われてみれば納得できる挙動ではあるんだけど、
ActivePerl にはかなり黒魔術が入ってそうだねえ。

てか、折角 Perl はそういう OS の差異を吸収する層たり得るソフトウェアなんだから、
Perl でできることは極力 Perl でやるべきかと。

538:デフォルトの名無しさん
09/09/22 09:08:48
>>534
そうですね

539:デフォルトの名無しさん
09/09/22 13:08:17
Perl TkのTextウィジェットを使って
文字列の入出力をする方法はどのようにするのでしょうか?
Entryウィジェットを使ったサンプルはWeb上から見つけたのですが、
Textウィジェットを用いたものはないもので。。。




540:デフォルトの名無しさん
09/09/22 16:51:57
>>539
$text->delete('1.0', 'end'); # テキスト全て削除
$text->insert('end', $string); # 終わりから文字挿入
$string = $text->get('1.0', 'end'); # テキスト全て取得

URLリンク(www.shido.info)
URLリンク(search.cpan.org)
Indexは #INDICES 辺りを参照で。

541:デフォルトの名無しさん
09/09/22 21:06:14
すごい昔のレスを掘り返して何なんですが、以下レスの回答がありませんでした。
スマートな書き方ってないんですかね?


Perlについての質問箱 12箱目
スレリンク(tech板:941番)

941 名前:デフォルトの名無しさん[] 投稿日:04/10/14 18:57:50
条件によって、関数に渡す引数の数が違う場合
たとえば

my $obj;
if (/condition/) {
  $obj = Class->new(ARG_0 => "a", ARG_1 => "b", ARG_2 => "c",);
}
else {
  $obj = Class->new(ARG_0 => "a", ARG_1 => "b",);
}
という具合の書き方をいつもしているのですが
なんだか重複した記述が多いし、もうちょっとスマートな書き方がないものかと
いつもうんざりしています。
こういう場合の定石パターンってなにかあるのでしょうか。
皆さんどうコーディングされてます?

542:デフォルトの名無しさん
09/09/22 21:27:52
my %args = (ARG_0 => 'a', ARG_1 => 'b');
$args{ARG_2} = 'c' if CONDITION;
my $obj = Klass->new(%args);


543: ◆TWARamEjuA
09/09/22 21:47:01
my $obj = Class->new(ARG_0 => "a", ARG_1 => "b", /condition/ ? ARG_2 => "c" : undef => undef);
って通るのかしら?

544:デフォルトの名無しさん
09/09/22 22:03:42
>>541
重複しないことが必ずしもスマートとは限らない。
現状のままの方が読みやすい気がする。

545:デフォルトの名無しさん
09/09/22 22:19:16
>>542
若造がいきがってムチャしてる、って感じがするな。
後々のことを考えてるのかな。
その場かぎりの使い捨てコードならソレでもいいかもしれないけど。

546:デフォルトの名無しさん
09/09/22 22:48:50
my @params = ( ARG_0 => "a", ARG_1 => "b", ARG_2 => "c" );
my $obj = Class->new( /condition/ ? @params[0..3] : @params[0..5] );

547:デフォルトの名無しさん
09/09/22 23:09:07
>>546
もういいからやめろ

548:デフォルトの名無しさん
09/09/22 23:32:46
>>541
本当にARG_2がoption的な要素なら、
my %opt = (
 ARG_2 => 'c'
) if /condition/;
my $obj = Class->new(
 ARG_0 => "a",
 ARG_1 => "b",
 %opt,
);
って書き方するかなぁ。
そうじゃないなら>>544の言う通り、そのままの方がメンテしやすい

549:デフォルトの名無しさん
09/09/23 00:57:59
まじキチ…ユダヤが人工地震を起こすぞ

【緊急情報カクサンよろしく】

ついに来ました。

大きい動きです。250nT超えてきました。ほぼ間違いありません。もう一度言います。

友人、知人、親類縁者、あらゆるつながりを駆使して巨大地震がくることを教えて下さい。

四川地震より大きいのが来る可能性があります。
URLリンク(g)<)★253494015/
【大気イオン】e-PISCO Part11【また延長】
スレリンク(eq板)★252991726/

本当に地震が来たら、犯人は特権階級全員だということ2


550: ◆TWARamEjuA
09/09/23 01:28:09
1200件もhitするのか。。。
ひとまずRock54してくるです。。。

551:デフォルトの名無しさん
09/09/23 07:56:28
コードゴルフ用の問題みたいだね

552:デフォルトの名無しさん
09/09/23 13:49:46
>>541
もし毎回同じパラメータ渡してるなら、サブルーチンの受け取るパラメータを直す。
それが難しければ、ラッパーをかます。
ベタウチはバグの元。
プログラム書法にも書かれてる。
「汚れ仕事は機械にやらせよう」

ただし、同書は冒頭で戒めてるので注意。
「わかりやすく書こう。うますぎるプログラムはいけない」
根拠は可読性とメンテナンス性。

553:デフォルトの名無しさん
09/09/23 17:32:22
こっち↓

my $data = do{local $/; <$fh>};

と、こっち↓

read $fh, my $data, -s $fh;

では、どちらを使うのがいいのでしょうか?

554:デフォルトの名無しさん
09/09/23 17:48:49
>>553
どっちもだめ。
【理由】意図不明



555:デフォルトの名無しさん
09/09/23 17:52:10
どっちでもいいんじゃね
効率はやや上のほうがよさそうだけど。下はファイルサイズ調べに行かなきゃならんわけだし

556:デフォルトの名無しさん
09/09/23 18:24:04
>>554
これを意図不明って、絶望的にPerlのスキルが足りないんじゃね?

557:デフォルトの名無しさん
09/09/23 19:58:27
URLリンク(www1.axfc.net)
ネットの勉強がてらに作ったモノです
友人に見せたら汚いコードだと言われました
どこあたりがおかしいのでしょうか

558:デフォルトの名無しさん
09/09/23 21:09:19
>>555
ベンチマークを取ってみた。
Windows XP SP2、ActivePerl 5.8.8
_______________________________________________________________

use Benchmark qw(:all);

my $file = 'jcode.pl'; # 21,876bytes、785行

my $r = timethese( 10000,
{
'local $/' => sub {
open my $fh, $file or die $!;
my $data = do { local $/; <$fh> };
},
'read' => sub {
open my $fh, $file or die $!;
read $fh, my $data, -s $fh;
}
});

cmpthese $r;
____________________________________________________________________________

Benchmark: timing 10000 iterations of local $/, read...
  local $/: 4 wallclock secs ( 2.81 usr + 1.09 sys = 3.91 CPU) @ 2559.51/s (n=10000)
    read: 3 wallclock secs ( 1.77 usr + 1.06 sys = 2.83 CPU) @ 3534.82/s (n=10000)

      Rate   local $/  read
local $/  2560/s    --   -28%
read    3535/s    38%     --


559:デフォルトの名無しさん
09/09/23 21:12:42
>>557
こんなもんじゃないの。
少なくとも昔の2chのコードより100倍まし。

560:デフォルトの名無しさん
09/09/23 21:12:51
へぇー。 -s & readの方がはやかったか~
まぁ、言われてみれば
読み込む量があらかじめわかってりゃそりゃバッファの確保も楽(っていうか一発?)だしそりゃ速いわな

561:デフォルトの名無しさん
09/09/23 21:31:51
ついでに、sysreadもベンチを取ってみた。
条件は、>>558と同じ。

Benchmark: timing 10000 iterations of local $/, read, sysread...
  local $/: 4 wallclock secs ( 2.66 usr + 1.14 sys = 3.80 CPU) @ 2633.66/s (n=10000)
    read: 3 wallclock secs ( 1.75 usr + 1.06 sys = 2.81 CPU) @ 3556.19/s (n=10000)
  sysread: 1 wallclock secs ( 0.33 usr + 0.91 sys = 1.23 CPU) @ 8103.73/s (n=10000)

       Rate  local$/  read sysread
local $/ 2634/s     --  -26%   -68%
read   3556/s    35%   --   -56%
sysread 8104/s.   208% . 128%    --

562:デフォルトの名無しさん
09/09/23 21:33:02
activeperl のverで
5.8.9.826 と 5.10.1.1006 での差違って
主に何です? ご存じの方いませんか

563:デフォルトの名無しさん
09/09/23 21:41:54
>562
URLリンク(www.activestate.com)
のActivePerl 5.10 Highlightsは見たの?

564:デフォルトの名無しさん
09/09/23 22:15:20
binmode $fh; をかましてバイナリ読み込みにすると、差が縮まった。

Benchmark: timing 50000 iterations of local $/, read, sysread...
  local $/: 9 wallclock secs ( 2.64 usr + 5.34 sys = 7.98 CPU) @ 6262.53/s (n=50000)
    read: 8 wallclock secs ( 2.03 usr + 5.47 sys = 7.50 CPU) @ 6666.67/s (n=50000)
  sysread: 6 wallclock secs ( 1.72 usr + 4.61 sys = 6.33 CPU) @ 7900.14/s (n=50000)

       Rate  local$/  read sysread
local $/ 6263/s     --   -6%   -21%
read   6667/s    6%    --   -16%
sysread 7900/s.   26%   19%    --


ただ、読み込むファイル容量を大きくする(以下)と差が出る。

my $file = 'kakikomi.txt'; # 6,863,205bytes(≒6.5Mbytes)、271,365行

Benchmark: timing 300 iterations of local $/, read, sysread...
  local $/: 6 wallclock secs ( 4.45 usr + 2.08 sys = 6.53 CPU) @ 45.93/s (n=300)
    read: 4 wallclock secs ( 2.02 usr + 2.06 sys = 4.08 CPU) @ 73.58/s (n=300)
  sysread: 4 wallclock secs ( 0.08 usr + 3.11 sys = 3.19 CPU) @ 94.13/s (n=300)

       Rate  local$/  read sysread
local $/  45.9/s     --  -38%   -51%
read    73.6/s    60%   --   -22%
sysread  94.1/s.   105%   28%    --

565:デフォルトの名無しさん
09/09/23 23:23:06
この方が分かりやすい。

my $data=`cat $file`;

566:デフォルトの名無しさん
09/09/23 23:53:34
どうでもいいんだが、

#=>

こいつがちんぽに見えてしょうがない
どうにかならんか

567:デフォルトの名無しさん
09/09/24 00:36:07
毛を剃れば=>になる

568:デフォルトの名無しさん
09/09/24 02:08:46
perlでwmvの再生時間を取得したくて、調べていて
Image::ExifToolというモジュールで出来るようだということがわかりました。
具体的なソースコードがないので、どのようにwmvの再生時間を取得すればいいのか悩んでいます。
よろしければ再生時間の取得方法が載っているサイトなど教えていただけたらと思います。

569:デフォルトの名無しさん
09/09/24 02:40:20
ソースコードが無いってなんで?
これでしょ?
URLリンク(search.cpan.org)

570:デフォルトの名無しさん
09/09/24 10:29:03
cpan をユーザーディレクトリで運用したいです
書かなければならないとする設定が説明サイトによってまちまちなんですが、
最新版ではどう記述するのが本当なんですか?

571:デフォルトの名無しさん
09/09/24 13:33:50
以下の2つの結果が違うのですが、

print join(',', (1,'','','',2)), "\n";
print join(',', (1,,,,2)), "\n";

perlでは,,,というのはどういう解釈がなされるのでしょうか?

--------
JavaScriptみたいな結果を期待していたのですが・・。
alert([1,,,,2].join(',')); // -> 1,,,,2


572:デフォルトの名無しさん
09/09/24 14:09:42
>>571
URLリンク(perldoc.jp) より:

空リストは () で表わされます。リスト中で空リストを展開しても何も起こりません。
つまり、 ((),(),()) は () と等価です。同様に、要素のない配列を展開することは、
その場所に何も展開しなかったのと同じことになります。

この展開は、開きかっこと閉じかっこは(優先順位のための必要性がなければ) 省略
可能であるということと、リスト中に複数のカンマがあっても文法的に有効なので、
リストの最後に追加のカンマをつけられるということを組み合わせたものです。
リスト 1,,3 は 2 つのリスト 1, と 3 の結合であり、 1 つ目のリストはオプションのカンマ
で終わっています。 1,,3 は (1,),(3) で 1,3 です (そして同様に 1,,,3 は (1,),(,),3 で
1,3 です。以下同様。) この暗黒面を使うよう勧めているわけではありません。

573:デフォルトの名無しさん
09/09/24 15:09:05
>>572
ありがとう御座います。ズバリです!
納得いきました。

574:デフォルトの名無しさん
09/09/24 16:07:02
>>564
バイナリリードにすると差がなくなるのは、<$fh>方式では、バイナリリードだと確保するバッファーが
大きくなるからでしょうか?

575:デフォルトの名無しさん
09/09/24 16:34:29
多重定義されたメソッド(関数)で、2つ上のメソッドを呼び出すにはどうすればいいのでしょうか?

package Super;
sub foo { print "This is Super\n" }

package Sub;
use base Super;
sub foo { print "This is Sub\n" }

package SubSub;
use base Sub;
sub foo { print "this is SubSub" }
sub call_super_foo { shift->SUPER::SUPER::foo) } #=> エラー

package main;
SubSub->call_super_foo; #=> This is Superを期待

576:デフォルトの名無しさん
09/09/24 17:36:56
shift->Super::foo とか Super::foo(shift) じゃだめ?絶対的な指定になっちゃうけど。
二つ上っていう相対的な呼び出し方はわかんね
っていうか、そういうことがやりたいケースなんてあるかな?ちょっと興味あるアル

577:デフォルトの名無しさん
09/09/24 18:11:57
ディスパッチャーを自作すればいけるかー。evalでもいいけど

package UNIVERSAL;
sub dispatch_ancestor_method
{
  my ($self, $name, @args) = @_;
  no strict "refs";
  for my $super (@{(ref($self) || $self) ."\::ISA"}) {
    for my $ancestor (@{"$super\::ISA"})
      { return &{"$ancestor\::$name"}($self, @args) if defined &{"$ancestor\::$name"}; }
  }
  die "Undefined method `$name'";
}

package SubSub;
sub call_super_foo { shift->dispatch_ancestor_method("foo") }

578:デフォルトの名無しさん
09/09/24 18:22:06
>>576-577
ありがとうございます。

単に勉強中の者でして、任意の上の階層のメソッドを呼び出す命令があるのかなーと
思ったしだいです。

579:デフォルトの名無しさん
09/09/24 19:28:52
>>578
そういう使い方では継承の意味がないのでは?

580:デフォルトの名無しさん
09/09/24 23:02:56
>>579
深く突っ込まれても、まだ勉強の途中なのでよくわからんです。
SUPER::の項目を見てて、そういう命令があるのかなーと思っただけなんで。

581:デフォルトの名無しさん
09/09/25 01:37:51
ちょっと聞きたい事があるんだ

配列のm番目にあるデータに、ループを回すごとに値を~でくっつけて追加したいんだ
ex) m番目の値がabcで、cdeを追加したい場合 abc~cde のように。

追加される値が$aの場合
$list[m] .= $list[m] . "~" . $a; (※ 
として配列m番目の値を変えようと思ってやったんだけどうまくいかない。
mはずっと固定。

ループ1週目で$a・2週目で$b、3週目で$c・・・・・と後ろに繋げる場合
$list[m]~$a~$b~$c~ となっていくようにしたいんだけど
上の※式を実行すると
$list[m]
しか出力されなく困ってます。どなたか知恵を御貸しください……

582:デフォルトの名無しさん
09/09/25 02:07:37
>>581
$list[m] .= "~" . $a; (※ 



$list[m] = $list[m] . "~" . $a; (※ 


583:デフォルトの名無しさん
09/09/25 09:06:19
念のために確認しておくが

× $list[m]
○ $list[$m]

というオチじゃないだろうな?

584:570
09/09/25 09:11:01
あら、みんなシステムワイドで使ってるん?
ユーザーディレクトリで運用してる人は稀?

585:デフォルトの名無しさん
09/09/25 09:28:16
>>584
ローカルにtar.gzからlocal::libをインストールして、あとはその設定使ったcpanでインストールしてるけどそういう意味?

586:デフォルトの名無しさん
09/09/25 11:55:47
変数名を動的に指定して、その変数の値をとってくることはできますか。
PHPでは
$x = 10;
$var = 'x';
echo $$var; // 10 が表示される
ということができるんですけど、Perlで同じことをするにはどうしたらいいですか。

587:デフォルトの名無しさん
09/09/25 11:56:24
ユーザー権限でcpan shell使えば、ユーザーディレクトリにインストールされない?

588:デフォルトの名無しさん
09/09/25 11:59:10
>>587
されるんだったらこのへんのブログ記事はみんな仕込みだな
URLリンク(www.google.com)

589:デフォルトの名無しさん
09/09/25 12:10:38
>>586
同じく$$varでいいけど、そういうプログラムは行儀悪いからやめとけ。

590:デフォルトの名無しさん
09/09/25 12:19:44
sage

591:デフォルトの名無しさん
09/09/25 12:24:12
>>583 あー確かに$list[$m]になってましたね、申し訳ないです
$mは別の所で既に求めてあり、変わることのない定数ですが……

printで挿入動作のすぐ後で確認してみた時はうまく挿入されているのですが
次のループの時にはまた初期状態に戻ってしまっているようです……

592:デフォルトの名無しさん
09/09/25 12:25:21
>>591
だったらループを晒さないと。

593:587
09/09/25 12:28:05
>>588
うーん、一度
cpan> o conf init
で再設定してみては?

594:デフォルトの名無しさん
09/09/25 14:21:52
>>592 すいません、ループ自体は他の動作も混ざってるので200行近くあるんです……

595:デフォルトの名無しさん
09/09/25 14:27:53
>>594
ここに貼り付ければおk
URLリンク(codepad.org)

596:デフォルトの名無しさん
09/09/25 14:34:03
>>591
だったら一行一行チェックしないと

597:デフォルトの名無しさん
09/09/25 15:31:30
>>594
「他の動作」を削っていって、不具合の再現する最小ケースのコードを作ってみ。

598:デフォルトの名無しさん
09/09/25 16:19:27
> printで挿入動作のすぐ後で確認してみた時はうまく挿入されているのですが
> 次のループの時にはまた初期状態に戻ってしまっているようです……

この人に足りないのは、「デバッグする」ということ。
いちおうすぐ後に print文を入れてみたのはエライが
その後で行き詰っているな。
もっと print を入れろ。たくさん入れろ。しつこいくらい入れろ。
print でコードがイッパイ埋め尽くされるまで入れろ!
そうすればどこで変になったか特定できるはずだろ。

599:デフォルトの名無しさん
09/09/25 16:25:19
print でコードがオッパイ埋め尽くされるまで入れろ!だと!?

ってレスされることを狙ったよな?よな?

600:デフォルトの名無しさん
09/09/25 18:32:10
>>589
行儀よく

${$var}


あれリファレンスと同じだ

601:デフォルトの名無しさん
09/09/25 18:35:37
>>581
ループごとに変数初期化してる気配

602:デフォルトの名無しさん
09/09/25 19:32:41
>>594
perl以前にそもそもな違和感を覚える。

200行ものループがあるのは、明らかにおかしい。
一関数でも200行はおかしい部類に入るのに、
それがループともなると、さらに話もデバッグも難しくなる。


603:デフォルトの名無しさん
09/09/26 02:12:34
perl ならループの中身が200行くらいあっても不思議じゃないだろ

604:デフォルトの名無しさん
09/09/26 02:29:33
絶対にbetter wayが存在するだろ

605:デフォルトの名無しさん
09/09/26 03:03:05
>>603
不思議じゃないが、おかしい。
「perlなら」とか言い訳してる場合じゃなくおかしいものはおかしい。直すべき。

606:デフォルトの名無しさん
09/09/26 11:33:59
プログラミングする目的は綺麗なコードを書く事じゃないし
行儀のいいコードを書く必要性は場合よる

LLであるPerlならそういうケースに見回れる可能性は低いから
むしろ「おかしい」って突っ込みの方が自分本位で正当性に欠ける気がするんだよ!


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch