[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 04/04 01:09 / Filesize : 256 KB / Number-of Response : 807
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Perlについての質問箱 41箱目



1 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 03:03:00 ]
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: pc11.2ch.net/php/)

CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

www.perl.org/get.html
● 2009/08/07 現在の最新版: 5.10.0

▼ 前スレ
Perlについての質問箱 40箱目
pc12.2ch.net/test/read.cgi/tech/1243631674/

リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-6 あたり

232 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 21:30:07 ]
>>320
画像->画像表示を示すURI、WWW::Scraper -> Web::Scraperの間違いだな。
訂正サンクス。

>>231
「単品で迷うなら素直にランチにしなよ」とか普通に使う用途なんだが、
こんな簡単な日本語取り違えるとはゆとりのなせる業か。
>オツムが弱そう。バカっぽいな。

233 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 21:40:07 ]
>>225
空文字列じゃなく "\x00" x 文字列長 になるんじゃないかな

print length 'foo' ^ 'foo', '/', unpack 'H6', 'foo' ^ 'foo'; # 3/000000

>>214
内部的にどう扱われているかでなく、数値コンテキストに置いた時に
解釈可能な文字列かどうかを判定したいなら Scalar::Util::looks_like_number()

cpansearch.perl.org/src/GBARR/Scalar-List-Utils-1.21/lib/Scalar/Util/PP.pm

234 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 21:47:31 ]
>>233
そのようだな。補足サンクス。Cと混同していたようだ。

235 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 21:53:24 ]
>>232
で?
その”普通に使う用途”が載ってるのは、韓国の辞書?北朝鮮の辞書?

236 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:01:59 ]
>>235
引くに引けないのはわかるけど、負け戦で頑張っても意味無いよ。
黙って日本語を勉強しなおすといい。

237 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:03:40 ]
>>235
日本の辞書の例:
dic.yahoo.co.jp/dsearch?enc=UTF-8&p=%E7%B4%A0%E7%9B%B4&dtype=0&dname=0na&stype=0&pagenum=1&index=11591609974300
>>226は第2義しか頭にないらしい。
日本人なら文脈からして4義が5義と考えるのが普通。

238 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:04:56 ]
つーか大陸のレッテル貼れば何とかなるとか思ってある辺りがもうね。

239 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:07:36 ]
変なタイミングで中韓出してくる子は、大抵日本のお荷物。

240 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:49:12 ]
>>237
やっぱりチョンの会社の辞書を出したか。今は日本に帰化してるが。



241 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:55:57 ]
>>211をコピペして実行してみたけど、正常に実行できる。
問題点は他にあったんじゃ?

242 名前:デフォルトの名無しさん [2009/09/06(日) 23:32:31 ]
>>241
レスありがと
211だけど、仰るとおりperlのプロセスがループしてた
正常な状態だったら問題なく動いたわ
かなり時間を費やしてしまった……

基本的に引数は参照渡しでいいんだよね?


243 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 23:34:02 ]
>基本的に引数は参照渡しでいいんだよね?
どこでそんなの習ったんだ?

244 名前:デフォルトの名無しさん [2009/09/06(日) 23:36:47 ]
>どこでそんなの習ったんだ?

どこかのサイトに書いてあった記憶がある
片っ端から初心者向けサイト回ってたからどことは言えないけど
オレが勘違いしてるのかな

245 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 23:59:09 ]
たぶん、値のコピーを作らないように参照渡しにする、って書いてあったんだろうけど
Perlの関数呼び出しは値渡しじゃなくて変数渡しだから、わざわざリファレンスにする必要はないよ。
@_には引数がコピーされて入っているのではなく、引数そのものの別名になっている。

246 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 00:02:33 ]
配列やハッシュを渡すときは必要だけど。

247 名前:デフォルトの名無しさん [2009/09/07(月) 00:17:22 ]
レスありがとん

変数を渡すときはそのままでも値がコピーされなくて
配列とかハッシュはコピーされちゃうからメモリが勿体無いと

勉強になったわ

248 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 03:17:01 ]
>>247
サブルーチンの引数として配列やハッシュを複数渡すと、単一のフラットなリストとして @_ に展開されますが、エイリアスとしての動作は変わらないため値のコピーは発生しません。
>246 が言う必要性とは、「単一のフラットなリスト」にされては困る場合、すなわち引数を渡された関数内で個々の配列を峻別して処理しなければいけない場合に、参照渡しが必須になるという意味です。
ちなみにハッシュのキーに限り、キーそれ自体は変数ではないため、エイリアスの内容を変更しても元のハッシュのキーは変化しません。


249 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 04:52:06 ]
>>233
>空文字列じゃなく "¥x00" x 文字列長 になるんじゃないかな

じゃあ、結局データが文字列か数値かを知りたいときはどうするのがいいんでしょうか。
今まさに1と"1"を別に扱いたい場面に直面しています。

250 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 05:25:56 ]
>>249
データ構造を作り直して回避する。



251 名前:233 mailto:sage [2009/09/07(月) 05:56:07 ]
>>249
いや俺に訊かれても。その二つを区別しなきゃいけない状況に陥った事なんて無いし。

sub is_num { ($_[0] ^ $_[0]) !~ /^\x00/ }
print is_num($_) ? 'num' : 'str', "\n" for 0, '0', '+1e3', +1e3;

…とでもしときゃいいんじゃない。すっごくアホ臭いけど。

252 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 06:35:52 ]
はじめてCPANパッケージを作ろうとしている最中です。
質問があります。

(1) READMEの推奨される書き方やフォーマットはありますか。
(2) Changesの推奨される書き方やフォーマットはありますか。
(3) テストファイルが t/*.t のようですけど、test/*.pl にするのはよくないですか。
(4) パッケージのファイル名と、ライブラリ名が異なっていてもいいでしょうか。
 たとえば Foo というライブラリを提供するパッケージとして、
  Foo-entry-1.0.0.tar.gz  # 機能限定版
  Foo-full-1.0.0.tar.gz   # 機能強化版
 のように用途別・目的別に別々のパッケージを用意しようとしているんですが
 こういうのはまずいでしょうか。何か問題があれば教えてください。

253 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 07:32:29 ]
>>249
だから$foo ^ $fooの結果。0と0x00 x nは違うから。

正直、正規のプログラミングで1と"1"を区別したってろくなことないよ。
コアな部分をいじるようなスクリプトでない限り(Dumperみたいにね)、
Perlでそんな場面に遭遇するってことはあなたの設計がおかしい。

>>251
$foo ^ $foo eq '0' ? '数値' : '文字列'でおk。

>>252
とりあえずお前はこれは読んどけ。10回くらい読め。
perldoc.perl.org/perlnewmod.html

質問の内容からしてPAUSE使うのは100年早い気がする。
いちAuthorより。

254 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 07:38:21 ]
つーかここまで言って数値と文字列の見分け方が分からないってことは
ズブの素人だろうから、「基本的にPerlにそんなことはできない」と言い切った方が良かったかな。

1と'1'を区別したい理由かコードか何か晒してみ?多分瑕疵があるから。

255 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 07:41:49 ]
>>240
小学館ってチョンの会社だったの?

256 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 07:47:09 ]
俺も長年Perl使ってるが、'1'と1を明確に区別する必要性に駆られた記憶がないな。
参考に、どういうケースなのか教えて欲しい。

257 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 07:51:52 ]
>>256
>>249ではないが、友人が自作フレームワーク作ってて、引数の型によって
挙動を変えたいっつー場面で数値と文字列の比較の話を出してきた。
当然止めとけと言っておいた。

ドキュメント化されてない部分だからいつ仕様が変わってもおかしくないしな。

258 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 08:55:52 ]
データ型を検証するようなプログラムなら、1と'1'が区別できないと困る。
たとえばPerlでJSONのバリデータを作ろうとしたけど、1と'1'が区別できなくてまじ困る。
たとえば「name は文字列である」というスキーマを定義したとして、
{ "name": "1" } # これはvalid
{ "name": 1 } # これはだめ
としないといけない。
でもPerlでは1と'1'の区別をどうすればいいのかわからないから、正しい検証ができない。

#自分が使わないからといって、他の人も同じだとは思わないでください。お願いします。


259 名前:デフォルトの名無しさん [2009/09/07(月) 09:43:18 ]
>>258
設計が悪い。



260 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 09:51:43 ]
>>258
search.cpan.org/~makamaka/JSON-2.15/lib/JSON.pm
読んでみ。数値も文字列で格納することがあることが分かる。

どうしても必要ならJSONを自分でパースしてチェックすればいい。
JSONのレイヤーの問題なんだからPerlのレイヤーに落としてチェック
しようとする発想が間違っている。



261 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 10:10:20 ]
テストコード書いてみたよ
use JSON::Syck;
use Perl6::Say;

$foo = JSON::Syck::LoadFile('test.json');
say $foo->{foo} ^ $foo->{foo} eq '0' ? '数値' : '文字列';

--test.json--
{ foo : 1 }
--結果--
数値

--test.json--
{ foo : 0.5 }
--結果--
文字列

やっぱり発想自体が間違ってたね。
ちなみに0.5はともかくPerl/PHPやCも含む大抵の処理系では0.1は文字列にする方が正確。
↓こんなことになるからね。それがなぜか分かれば君も一歩大人。

for($i = 0; $i < 1; $i += 0.1){say "$i"}

262 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 11:32:39 ]
このスレが賑わう時はいきなりレベルが上がるから勉強になるわ

263 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 11:43:21 ]
> #自分が使わないからといって、他の人も同じだとは思わないでください。お願いします。

これには同意するが、スクリプト言語で文字の1と数値の1を見分けたい、ってのは
やっぱ何かが間違ってる

264 名前:デフォルトの名無しさん [2009/09/07(月) 12:09:03 ]
>>263
> これには同意するが、スクリプト言語で文字の1と数値の1を見分けたい、ってのは
> やっぱ何かが間違ってる


間違ってるのはそこじゃなくてアプローチ。
東京から熱海にいくのに「飛行機でいきたいので簡単な方法を教えてください」というようなもんだ。

そりゃ羽田-静岡富士山経由してもいけるが
新幹線を使おうよ。小田急+JRでもいい。


って話。

265 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 12:47:25 ]
↓ここでD51プレート持った鉄男登場

266 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 12:53:15 ]
>>263
>スクリプト言語で文字の1と数値の1を見分けたい、ってのは
>やっぱ何かが間違ってる

えーなんで?
*Perlでは*間違っているということなら同意するけど、スクリプト言語一般に広げないでほしい。
つーか、integerとstringの見分けがつかない言語が存在するなんて初めてしったわ。
PHPですらis_string()とかあるのに。

267 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 14:17:09 ]
Rubyだと逆に厳格だよね

268 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 15:08:15 ]
>>266
> つーか、integerとstringの見分けがつかない言語が存在するなんて初めてしったわ。

見分けがつかないんじゃなくて、区別されてないんだろ。


269 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 15:16:31 ]
つ シェルスクリプト
Perlの出自を考えれば文字列と数値を区別しないのも当然といえば当然。

270 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 15:27:31 ]
JSONも良いですが、symbolとstringをも区別するS式が最強ですね



271 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 16:04:06 ]
Perl/Tk を使って縦書き形式のテキストビューワーを作ろうとしているのですが、
括弧や句読点、長音記号等を 90度横倒しにして表示する良い方法が無いでしょうか?


272 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 16:09:10 ]
句読点は横倒しでおkじゃないぞ。


273 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 16:20:56 ]
>>271
単に縦書き用フォントを使えばいい。

何でも横倒しにすりゃいいってもんじゃないぞ。句読点もそうだが、
波ダッシュ字形問題が、縦書き用フォントを横にするだけでおkと思った
馬鹿外人のせいで起こってしまったことを忘れるな。

274 名前:271 mailto:sage [2009/09/07(月) 16:28:52 ]
>>272>>273
ご指摘、ご教示ありがとうございます
読み込んだ横書きテキストデータ中の文字を
横書きで問題が出る字形だけ
縦書き字形に変換するという方法で
なんとかやってみようと思います


275 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 16:41:07 ]
>>274
だから全部縦書き字形にしろって。お前なら絶対見落とすから。影響受けるのは記号だけじゃねーぞ。わかるか?
こういうのは意固地にならずに安直に安全側に転ぶように設計するのが鉄則。

何度も書くが、波ダッシュ問題は問題が出ない字形だと思ってそのまま横倒しにして起きた事故なんだから。

276 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 17:08:47 ]
>>261に欠陥発見。
×say $foo->{foo} ^ $foo->{foo} eq '0' ? '数値' : '文字列';
○say +($foo->{foo} ^ $foo->{foo} eq '0') ? '数値' : '文字列';

0.1は数値と扱われるようですね。'0.1'で文字列でした。失礼しました。

277 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 17:10:10 ]
また間違えた
○say +($foo->{foo} ^ $foo->{foo}) eq '0' ? '数値' : '文字列';

278 名前:274 mailto:sage [2009/09/07(月) 18:04:21 ]
>>275
フォント情報の中に入ってる横書き字形/縦書き字形変換テーブルにバグがあるとしたらもう私にはどうしようもありません。

279 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 18:21:16 ]
>>278
じゃUTF-8変換とか恐ろしくて使えないな。今後もShift_JISとかEUC-JPで頑張ってください。
多分バグが出る可能性よりも君がミスる可能性の方が高い。

280 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 19:51:04 ]
>>260
>数値も文字列で格納することがあることが分かる。
なんでこんなことするの?

>どうしても必要ならJSONを自分でパースしてチェックすればいい。
「すればいい」じゃなくて、Perlでは「自分でパースしてチェックするしかない」だよね。

>JSONのレイヤーの問題なんだからPerlのレイヤーに落としてチェック
>しようとする発想が間違っている。
えー、数値と文字列が区別できるような言語なら何の問題もないのに。
Perlではそれができないのを、「発想が間違い」とかいってごまかさないでほしい。




281 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 20:06:21 ]
>>280
> なんでこんなことするの?

魔法を使うため

282 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 20:21:59 ]
JSONのバリデータの、どこで内部構造の判定が必要なのかが分からない。
果たしてそれはバリデータなのか、物体Xではないのか。

283 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 20:40:28 ]
{"PI": 3.14, "unko":[1,1,2,3,5]}
といったデータを、json_validate($json_obj, {"/PI" => "float", "/unko/*" => "int"});
みたいにチェックする場合じゃないの

284 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 21:18:42 ]
>>283
その処理系は知らないから分からないが、Cライクな型を調べるものとして、
1000桁の数値であってもJSONとしてはvalidなのだから、
やはり文字列で判定すべきではないのか。

285 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 21:35:51 ]
>>253
>とりあえずお前はこれは読んどけ。10回くらい読め。
>perldoc.perl.org/perlnewmod.html

どうもです。でもそれには知りたい内容は一切かかれてませんでした。
(1)READMEを書きなさいとはありましたが、フォーマットについては言及なし。
(2)Changesについては一切言及なし。
(3)テストを書きなさい、Test::SimpleとTest::Moreがおすすめ、とはあるが、推奨するファイル名については言及なし。
(4)パッケージのファイル名についても言及なし。

10回読めと言うくらいなら、もうちょっと関連するものを紹介してくれてもいいような。

で、他のCPANパッケージをいくつかダウンロードしてみたところ、
(1)READMEファイルの書き方はバラバラ。好きな書き方でいいみたい。
(2)Changesはそれ以上にバラバラ。
(3)テストスクリプトはどのパッケージも t/*.t だった。これに従ったほうがいいみたい。
(4)パッケージ名とライブラリは厳密に一致している(みたいだけど確証はなし)。

あとバージョン名の付け方が、X.X.X ではなく X.X という形式のが非常に多いんですけど、
Perlでは「5.8.6」よりも「5.86」という形式のほうが好まれるんでしょうか。




286 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 21:50:23 ]
で、module-starterは試してみたの?

287 名前:デフォルトの名無しさん [2009/09/07(月) 22:05:09 ]
>>268
> 見分けがつかないんじゃなくて、区別されてないんだろ。


区別せずに都合よく使えるようにしてあるんだよ。
厳格に区別するほうがよほど簡単なのに。

288 名前:デフォルトの名無しさん [2009/09/07(月) 22:07:11 ]
>>273
> 波ダッシュ字形問題

ってなんですか?
涙っしゅ??

289 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 22:38:38 ]
双方噛み合って無いやりとりもこのスレの華


290 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 22:45:58 ]
>>287
>区別せずに都合よく使えるようにしてあるんだよ。
区別せずに使えるのは利点だとしても、区別できない(見分けがつかない)のは欠点だよな。




291 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 22:54:32 ]
>>290
変数アクセス履歴を残しておけばいいわけだな

292 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 23:14:53 ]
>>286
module-starterをインストールすると、READMEのフォーマットがわかるの?
わかってないのに無理して回答するのやめようぜ。初心者が混乱するだけだから。
もしわかっててその回答なら、あまりにとんちんかんすぎる。

293 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 00:11:14 ]
>>286
プラグインModule-Starter-PBP入れてね。

294 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 01:02:28 ]
>>285
(3)の理由はこれだ。
search.cpan.org/dist/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm#make_test

295 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 01:07:39 ]
どうしても型の区別がしたいなら、静的型付けをエミュレートした変数を作り、そこに格納しておくという手段も用意されています。
今回の議論で望まれている動作とは異なるかもしれませんが、運が良ければ CPAN の Variable::Strongly::Typed が参考になるでしょう。


296 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 01:58:57 ]
ひとつのサブルーチンで、スカラ、リスト、ハッシュを渡すと
それぞれ別の挙動をとるようには出来ますか?

それとも、単にスカラだけ引数に取るようにして
リストやハッシュは呼出側で参照にしてから
渡してもらうほうが賢明なのでしょうか?

297 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 02:11:28 ]
URI モジュールのように
スカラー変数をブレスされたリファレンスのように扱えるオブジェクトは
どういう仕組みでできているのでしょうか
ソース読んだけど意味不明。。。

298 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 03:51:48 ]
>>297
やっぱ use overload でいろんな演算子とかを独自に定義するんでないか

299 名前:デフォルトの名無しさん [2009/09/08(火) 08:37:44 ]
>>296
> それとも、単にスカラだけ引数に取るようにして
> リストやハッシュは呼出側で参照にしてから
> 渡してもらうほうが賢明なのでしょうか?


その方が確実かなあ。
もっと確実なのはサブルーチンを分けることなんだけど、なんでひとつにまとめたいのさ?

300 名前:デフォルトの名無しさん [2009/09/08(火) 09:12:42 ]
>>298
ありがとうございます
調べてみます



301 名前:デフォルトの名無しさん [2009/09/08(火) 09:44:37 ]
>>297
sub X(\$) {...}

302 名前:デフォルトの名無しさん [2009/09/08(火) 09:51:43 ]
>>290
必要でないからあえて削除されたんだよ。
型にこだわることで起こる煩わしさのほうが多いから。

それにバリデータなんてどっかで誰かがもう作ってるだろ。
あえてパールで作り直すのは自由だけど、能力不足を棚にあげて言語のせいにされてもね。
ガタガタいうなら適切と思う言語を選べばいい。
言語のせいにするやつは、言語を変えてもできないだろうから。

303 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 10:00:09 ]
>>280
> えー、数値と文字列が区別できるような言語なら何の問題もないのに。

区別できないところに大きなメリットがある。

例えばPHPはPerlと同じく自動型変換を可能としたが、型は残したままにしたために
大変な混乱を大量のバグを生んだ。

で、区別ができないとどう困るのか具体的な返事がまだないのだが?俺は15年くらいPerl書いてるけど
困ったことなぞ一度もないぞ。

>>285
読んだんなら続きは責任もって答えてやる。
書いてないってことはREADMEやChangesにはフォーマットなし。自由に書いてよし。ってことだ。読み取れないのか。

パッケージとファイル名は基本的に一致すべしと考えておけ。で、名前空間の汚染は非常に嫌われるからなるべく少なく。
この辺はIRCでソース晒して相談するといい。あまり糞なパッケージに普遍的な名前をつけられると他が迷惑する。

バージョンのつけ方は好きに汁。5.10.1みたいのでもいいし、5.00503みたいのでもいい。後者の書き方をすると
普通バージョン番号とパッチ番号(005/03)とみなされる。最初は謙虚に0.0.1とか0.00001にしとけ。


304 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 10:19:36 ]
>>288
ググるくらいできんのか。
ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5#Unicode.E3.81.AB.E9.96.A2.E9.80.A3.E3.81.99.E3.82.8B.E5.95.8F.E9.A1.8C

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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




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

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


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

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

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

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

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

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

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

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

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

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

319 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 19:07:57 ]
>>315
どっかで見たな

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

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

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

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




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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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



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

煩わしいよ。


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


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

333 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 23:25:33 ]
>>331
わかりました。ありがとうございます

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

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

335 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 23:32:01 ]
まだデュエルしてんのか。デュエリスト板でやれ

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

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

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

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

337 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 01:31:16 ]
0でなく"0"な

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

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

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

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

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

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

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

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



341 名前:デフォルトの名無しさん [2009/09/09(水) 09:14:15 ]
>>337
> 0でなく"0"な

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

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

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

343 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 10:44:44 ]
>"0"が偽なのは地雷でしかない

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

344 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 11:39:31 ]
>>345
そのすぐ後の >307 をスルーしてるのはわざとか
どうしてもPerl自体の問題にすり替えたい様子だが

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

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

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

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



351 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 12:26:16 ]
>>350
CPANは管理者権限で利用するのが正統

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

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

354 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 15:11:09 ]
>>351
わかりました
諦めます

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


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

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

357 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 16:46:30 ]
東村山第三小学校だけど

358 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 18:24:29 ]
中州産業大学だけど

359 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 19:25:45 ]
nullとの比較は$hoge == undefでおk?

360 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 19:31:17 ]
えっ?



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

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

363 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 22:15:59 ]
あと、 == は数値比較だから気をつけろ

364 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 22:18:43 ]
> defined($hoge)

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

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

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

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

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

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

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

まあ好みだな

370 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 03:03:38 ]
C使いからすると括弧の無いifは我慢ならん

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


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


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

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


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

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

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

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

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

379 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 13:24:09 ]
>>376
おいおい。それはもしかしてマジレスなのか?

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



381 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 15:07:30 ]
>>374
えらく風呂敷広げたなw

382 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 16:13:15 ]
if文のかっこなしはPerl 6からだね

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

384 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 16:42:53 ]
>>383
これ↓ができるのはPerl 6からでしょ?

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

385 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 16:45:56 ]
後置の話してたんだろ

386 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 17:09:11 ]
$a = 1 if $b ne "";

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

387 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 23:35:57 ]
久しぶりにCを書いたら、
@array = (0, 1, 2);
に相当するようなことの書き方すら判らなくなってた

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

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

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




391 名前:デフォルトの名無しさん mailto:sage [2009/09/11(金) 00:06:53 ]
つ perldoc FindBin
つ perldoc lib


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

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


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

394 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん [2009/09/11(金) 09:06:50 ]
>>394自己レス。

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

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

397 名前:396 mailto:sage [2009/09/11(金) 17:02:32 ]
自己解決しました


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

399 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 11:47:16 ]
File::Slurpのread_dirオススメ



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



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

402 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 20:35:07 ]
.と..をいちいち除外しなくていい

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

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


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

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

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

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


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

404 Blog Not Found:perl - glob,readdir, and regexp
blog.livedoor.jp/dankogai/archives/51058540.html

408 名前:400 mailto:sage [2009/09/13(日) 08:39:41 ]
今更ただのシャレだったなんていい出しづらい雰囲気だな

409 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 11:02:01 ]
えっ・・・みんな気づいてなかったのか?

410 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 11:58:28 ]
はいはい、>>407は気がついていた。偉い偉い。



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

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

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

413 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 13:16:47 ]
>>411
その関数に限れば、

main->$func;

で呼べますが。

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

415 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 14:08:14 ]
どうもありがとうございます。

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

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


416 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 14:56:26 ]
スコープを絞って、no strict 'refs'するのが正攻法?

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

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


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

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


419 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 22:39:43 ]
>>411
AUTOROAD じゃダメなの?



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

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

422 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 00:54:50 ]
Windowsのコマンドプロンプトから
>scraper www.google.co.jp/webhp?hl=ja

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

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

>scraper www.google.co.jp/webhp?hl=ja

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


Linuxのほうにもscraperを入れてみたのですがシェルから
$ scraper www.google.co.jp/webhp?hl=ja
と入力してもscraperは起動しませんでした

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

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

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

423 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 00:57:46 ]
>>422 はWeb::Scraperの話です

424 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 01:28:19 ]
エラーメッセージ隠蔽者


425 名前:デフォルトの名無しさん [2009/09/14(月) 07:30:15 ]
>>422
ttp://www.google.co.jp/gwt/x?q=scraper&ct=res&oi=blended&sa=X&ei=HXCtSuCkE4b46wOr_pToAQ&cd=1&resnum=1&output=xhtml1_0&hl=ja&source=m&rd=1&guid=on&u=http%3A%2F%2Fe8y.net%2Fmag%2F013-web-scraper%2F

426 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 09:19:05 ]
>>425
ありがとうございます

Linuxはフォルダに移動してからscraper URIで起動できました。
>cd /usr/local/bin
>scraper www.google.co.jp/webhp?sourceid=navclient-ff


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

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

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

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






427 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 11:03:49 ]
……

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

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

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



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

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

433 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 03:08:13 ]
>>432
perldoc.perl.org/overload.html#Public-functions
perldoc.jp/docs/modules/overload-1.06/overload.pod

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

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

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

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


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

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

439 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 11:31:39 ]
>>438
今風
ttp://perl-users.jp/modern_introduction_perl/


440 名前:439 mailto:sage [2009/09/16(水) 11:34:07 ]
>>438
間違えたこっちだった
ttp://perl-users.jp/nowpast.html




441 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 19:29:52 ]
すっかりJavaみたいになっちゃって

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

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

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

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

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

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

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

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

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



451 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 03:44:00 ]
カッコエエ!

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


spliceも使えるかも。

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

>>452
カッコエエw

454 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 11:37:03 ]
>>454
解説ありがとうございます。別に括弧がイヤとかではないです。
自作関数では無いので、できれば関数の中身は変更したくなかったのです。

456 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 23:10:48 ]
>>456
配列をスキャンしながら、その配列自体を変更するのは、
とくにその結果で要素が増減する場合は、たいてい面倒くさい処理が必要になる。

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

458 名前:デフォルトの名無しさん [2009/09/18(金) 00:14:07 ]
>>456
日本語でオケ

459 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 14:29:00 ]
456だけど条件一部抜けてた……折角書いて頂いたのに申し訳ないです

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

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




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

465 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 15:35:47 ]
>>464
お前、もうこっち来い

Perlでリクに答えるスクリプトを作るスレ
pc12.2ch.net/test/read.cgi/tech/1086143976/

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

466 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 22:19:15 ]
perlでcronみたいなスケジューリングを実現するモジュールってありますか?

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

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

470 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 04:55:47 ]
Schedule::Cron



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

477 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 08:05:51 ]
BEGIN { require Test::Simple; import Test::Simple tests => 3; }

とだいたい同じこと


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

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

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

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

use Unko unko => "unko";

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



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

482 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 11:23:55 ]
>>470
ありがとう。試してみます。

484 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 12:12:54 ]
>>484
CPANモジュールの中いじっちゃダメだろw


486 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 12:34:31 ]
>>485
そうだね。
ごめん、ごめん。

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

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

}
}

487 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 13:08:52 ]
>>486
数字のとこだけなら、1行で取り出せるよ。
ずっとソース読んでたw

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

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

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

489 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 13:09:34 ]
指向な。

490 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 13:25:29 ]
オブジェクト歯垢



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

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

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

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

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

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

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

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

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

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



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

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

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

502 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 23:23:31 ]
>500
(ユーザ定義でない)組み込み関数を使うならCORE::popとかCORE::pushとか。

504 名前:492 mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/09/20(日) 01:23:54 ]
> my $foo = {};
> my $bar = {%{$foo}};
> もっとシンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法が

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

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

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

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

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

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

507 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 09:36:50 ]
goto LABEL ならともかく goto &SUB; くらい許してやれよ


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

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



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

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

513 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 10:21:29 ]
open(NEWFILE, ">shinki.html") ;

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

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

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

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

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

518 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 11:17:58 ]
>>517
正解が出ないからって拗ねるな。

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

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

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

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



521 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 13:12:38 ]
>>519
はげどー。

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

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

524 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 06:32:33 ]
>>4を見て思ったのですが、

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

でもいいんですかね?

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


mkdir $filepath;


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

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

529 名前:528 mailto:sage [2009/09/21(月) 11:48:41 ]
とても恥ずかしい

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

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



531 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 14:16:06 ]
>>531
Windowsでmkdirに-pオプション付けると
"-p"って名前のフォルダが作られない?
うちでは作られた

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

open.pmを見てみると、

$layer =~ s/^://;

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

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

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

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


どーなんだろー?

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

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

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

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

538 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 09:08:48 ]
>>534
そうですね

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




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

ttp://www.shido.info/py/tkinter12.html
search.cpan.org/~srezic/Tk-804.028/pod/Text.pod
Indexは #INDICES 辺りを参照で。



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


Perlについての質問箱 12箱目
pc5.2ch.net/test/read.cgi/tech/1094579428/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 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/09/22(火) 21:47:01 ]
my $obj = Class->new(ARG_0 => "a", ARG_1 => "b", /condition/ ? ARG_2 => "c" : undef => undef);
って通るのかしら?

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

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

546 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 23:09:07 ]
>>546
もういいからやめろ

548 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん [2009/09/23(水) 00:57:59 ]
まじキチ…ユダヤが人工地震を起こすぞ

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

ついに来ました。

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

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

四川地震より大きいのが来る可能性があります。
g★olde★ntam★atama.b★lo★g84.fc2.c★om/

★★★★★危険度MAX★★★★★
★★★★★★★★★★★★★★★★

★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★

★★★★★★★★★★★★★★★★
★★★★★危険度MAX★★★★★

警告!連休中の21、22、23日が危ない!かも2
live24.2ch.net/test/read.cgi/eq/1★253494015/
【大気イオン】e-PISCO Part11【また延長】
live24.2ch.net/test/read.cgi/eq/1★252991726/

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


550 名前: ◆TWARamEjuA mailto:sage [2009/09/23(水) 01:28:09 ]
1200件もhitするのか。。。
ひとまずRock54してくるです。。。



551 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 07:56:28 ]
コードゴルフ用の問題みたいだね

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

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

553 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 17:32:22 ]
こっち↓

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

と、こっち↓

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

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

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



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

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

557 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 19:58:27 ]
tp://www1.axfc.net/uploader/Sc/so/28995.zip&key=vip
ネットの勉強がてらに作ったモノです
友人に見せたら汚いコードだと言われました
どこあたりがおかしいのでしょうか

558 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 21:12:42 ]
>>557
こんなもんじゃないの。
少なくとも昔の2chのコードより100倍まし。

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



561 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 21:33:02 ]
activeperl のverで
5.8.9.826 と 5.10.1.1006 での差違って
主に何です? ご存じの方いませんか

563 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 21:41:54 ]
>562
www.activestate.com/activeperl/features/
のActivePerl 5.10 Highlightsは見たの?

564 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/09/23(水) 23:23:06 ]
この方が分かりやすい。

my $data=`cat $file`;

566 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 23:53:34 ]
どうでもいいんだが、

#=>

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

567 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 00:36:07 ]
毛を剃れば=>になる

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

569 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 02:40:20 ]
ソースコードが無いってなんで?
これでしょ?
search.cpan.org/~exiftool/Image-ExifTool-7.89/lib/Image/ExifTool.pod

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



571 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 14:09:42 ]
>>571
perldoc.jp/docs/perl/5.10.0/perldata.pod より:

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

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

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

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

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

577 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 18:22:06 ]
>>576-577
ありがとうございます。

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

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

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



581 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/09/25(金) 02:07:37 ]
>>581
$list[m] .= "〜" . $a; (※ 



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


583 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 09:06:19 ]
念のために確認しておくが

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

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

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

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

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

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

588 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 11:59:10 ]
>>587
されるんだったらこのへんのブログ記事はみんな仕込みだな
ttp://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=makepl_arg&num=50

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

590 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 12:19:44 ]
sage



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

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

592 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 12:25:21 ]
>>591
だったらループを晒さないと。

593 名前:587 mailto:sage [2009/09/25(金) 12:28:05 ]
>>588
うーん、一度
cpan> o conf init
で再設定してみては?

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

595 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 14:27:53 ]
>>594
ここに貼り付ければおk
codepad.org/

596 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 14:34:03 ]
>>591
だったら一行一行チェックしないと

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

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

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

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

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

600 名前:デフォルトの名無しさん [2009/09/25(金) 18:32:10 ]
>>589
行儀よく

${$var}


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



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

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

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


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

604 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 02:29:33 ]
絶対にbetter wayが存在するだろ

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

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

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

607 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 12:11:35 ]
プログラムは本来動けばいい物でしょ

そこに、保守性、生産性という需要があれば可読性のあるソースを
速度やコンパクトさを求めるなら、可読性や保守性は両立できない

だからそもそもソースの書き方に正しいとか間違いなんて言うのは野暮

608 名前:デフォルトの名無しさん [2009/09/26(土) 12:37:30 ]
>>607
些細なバグを直しやすくするアドバイスが
そんなに気に入らないか?

下手くそな書き方で無駄な時間潰すより
素直に耳を傾けたほうがよほどいいと思うが?

609 名前:デフォルトの名無しさん [2009/09/26(土) 12:47:48 ]
「速くする前に、まず正しくしよう」

「だめなプログラムを修正するのはやめて、全部書き直そう」

610 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 12:48:08 ]
>>607
Damian Conwayを真っ向から否定ですね、わかります



611 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 12:48:12 ]
>>606 >>607
はぁ?
そんなの綺麗で可読性のあるコードを書かない言い訳になんかならんよ。
実際「動けば良い」じゃ済まないから現に >>581 みたいな質問が出てるんじゃんよ。
「おかしい」ったら「おかしい」んだよ。

612 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 12:59:02 ]
>>606-607
思考が若いねぇ。いったい何処で習った手法なのかなー? 趣味のプログラム書き殴りだけで、
それなりの規模の保守運用を伴う実務経験無さそうだねぇ

613 名前:デフォルトの名無しさん [2009/09/26(土) 13:00:50 ]
プログラミングの鉄則


1 動くこと
2 正しく動くこと
3 上記を満たすためにわかりやすく書くこと



614 名前:607 mailto:sage [2009/09/26(土) 13:06:36 ]
一応SEだからソース管理するスタンスで言えば
綺麗で可読性のあるコードを書くのは反対しないよ

だがここはあくまで書き方の自由度の高いPerlのスレであり
大規模プロジェクトで生産性、保守性を目的にしたソースを第一とするとはどこにも書いていないと言いたいだけ

615 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 13:10:05 ]
そうかそうか

616 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 13:10:39 ]
>>607 の理論は正しくないと思うけど
>>608
この問題に対する、「分割や抽象化されてない巨大なコードはバグりやすいよ」ってアドバイスならいいけど、
>200行ものループがあるのは、明らかにおかしい
みたいに、プログラミング一般に適用可能な意見とするのは違うなーと思った
こういう考えをむやみに初心者に植え付けるのは、コーディングオナニーの原因にもなるしね
常に必要なことではない、ってことを理解してもらうために発言したんだよ

617 名前:607 mailto:sage [2009/09/26(土) 13:12:57 ]
>>612
習うと言われても
私の若い頃は工業高校なんかでBASICかFORTRAN、アセンブラしか教えられていなかったから
実務経験で培った知識しか無い
これ以上はスレ違いだし606を擁護するのはやめとく

618 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 13:35:06 ]
> みたいに、プログラミング一般に適用可能な意見とするのは違うなーと思った
> こういう考えをむやみに初心者に植え付けるのは、コーディングオナニーの原因にもなるしね
いいや、プログラミング一般に適用可能だし、むやみに初心者に植え付けるべき考えだよ。
ところで「コーディングオナニー」って何?

特に >>581 の場合なんかは、どうせスコープを見誤ってバグってるんだろうから、
効率とか云々は一旦棚に上げて、 use strict; use warnings; した上で、
200行のコードをどんどん関数に分割していけば、まずいところはすぐ見つかると思う。

619 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 13:45:27 ]
保守性も、動くこと優先も、両方考慮すべきことだよ

多人数開発だったり、サポート期間の長いソフトだと前者の重要性が
高くなるだけで、別にそれが全てじゃない。

Perl の場合、たいてい動けばよいの方の比重が高くなると思うな
まあ、どうでもいいけど

620 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 13:49:02 ]
200行のループしかないプログラムだったり



621 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 14:11:14 ]
>>618
>コーディングオナニー
ああ、リアルで使っても結構通じちゃうから、同じ気持ちで使ってたよ。気付かなくてごめんね

意味だけど、本来の目的や本質は疎かにして、自分が正しいと信じてることを機械的に行うことだよ
病的なまでにコードを整理したり、やたらリファクタリングに時間をかける人がいるんだよ。文脈におけるメリットも考慮せずに
(実を言うと、昔は自分もそうだったしね)

コードを整理することが保守性やメンテナンス性を高めることに繋がるという事に異議は無いよ
ただ、そういうことが常に求められているわけではないので、
その手段である「綺麗なコードを書くこと」は、プログラミング一般に適用出来ない。そういうこと

>>619
同意

622 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 14:13:57 ]
s/機械的/盲目的/

623 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 15:08:40 ]
200行もあるコードにおかしさを嗅ぎつけるってのは
プログラマにとって身に付けるべき重要な嗅覚だろ。
そんな嗅覚の未発達な初心者に対しては、
ちゃんとこれはおかしいと諭してあげるべきじゃないのか。

200行もあるが故に見通しが悪く自力で問題解決できなくなり、
200行もあるが故にコード片を晒すこともできずこれ以上の助言ももらえない、
そんなにっちもさっちもいかなくなった質問者に対して、
200行のコードでも動けば問題ない、ってのがアドバイスになるのか?おかしいだろ。

624 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 15:13:44 ]
やってればセンスある奴は早い時期に勝手に気づくさ。
気づかないのはセンスナッシングで他のことにも気づかないってことで

625 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 15:50:33 ]
よそでやれ

626 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 15:57:03 ]
いや、ここでやる(`・ω・´)

627 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 15:58:19 ]
ハゲ・ズラ板でやれ

628 名前: ◆TWARamEjuA mailto:sage [2009/09/26(土) 16:18:45 BE:1634235-BRZ(10101)]
つ 夢・独り言@2ch掲示板 changi.2ch.net/yume/

629 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 16:24:52 ]
>>628
行ってらっしゃーい

630 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 18:08:27 ]
> 綺麗で可読性のあるコード

これを言い出すとモメる原因になる。
いったい<誰>にとって綺麗で可読性のあるコードであるか。
おまえか?おれか?
主観を押し付けるなよ。



631 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 18:26:43 ]
>>630
そんな中二病丸出しの発言する奴は無視するだけでしょ。

632 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 19:49:32 ]
「綺麗さ」に関して標準の測定法が無いから、主観の問題になる。
というか、ズルや政治的意図で歪められたりする。

perltidyなどのフォーマッタを通したコードが綺麗で良いとすると、
複雑さなどは計算に入れないのか、などなど。
一度は通っておくといい道。

633 名前:デフォルトの名無しさん [2009/09/26(土) 21:16:08 ]
mecabについての質問です。

文字列をmecabに入れる際にeuc-jpにエンコードし、名詞だけを抽出し
デコードしてブラウザに出力させようとすると、大半は通常通りに取得できますが、一部の単語が文字化けします。
調べてみたら漢字に限らず、ひらがな・カナ文字でも文字化けしています。

考えられる原因はなんでしょうか?OSはfedora9です。

634 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 21:49:44 ]
ここでやる(`・ω・´)

(´;ω;`)ブワッ

635 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 22:12:43 ]
(´;ω;`;:..

(´;ω;;:;:::...

(´;;:;::;..

636 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 22:14:07 ]
(´;;:;::;..

(´ ∀;;:;:::...

(´ ∀`)

637 名前:デフォルトの名無しさん [2009/09/27(日) 00:08:32 ]
PERLでのImage Magickの使い方について教えてください

画像ファイルを読み込んだあと、画像のプロパティ(タイトル、標題、コメントなど)を
セットしてから出力することはできるでしょうか。

638 名前:デフォルトの名無しさん [2009/09/27(日) 01:43:41 ]
>>637
もちろんです。

man Imagemagick

639 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 05:53:38 ]
(´・ω・`) 。。゚o。○

(´・ω 。o。゚。o○

。。o。o゚O゚。o゚o○。o゚

640 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 08:07:26 ]
2chにコードを貼り付けるとき、インデントを全角スペースにしたりしますよね。
みなさんはそれをどのように変換してますか?

エディタの機能でうまくできるものなのでしょうか?



641 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 09:25:39 ]
s/\t/  /g;

642 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 09:57:50 ]
>>641
それじゃダメだろ

643 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 11:16:51 ]
>>640
Perlで「各行の先頭から続く複数の空白を、同じ数の&amp;nbsp;に変換して出力する」コードを書けば良いじゃない


644 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 11:18:24 ]
あれ?表示が変だな
あんど、えぬ、びー、えす、ぴー、せみころんね

645 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 11:29:21 ]
&nbsp;

646 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 11:41:45 ]
すべてのスペースを&nbsp;に変換すっと、今度は文字数制限にひっかかっかるやもやがな
s/(?<=^|\G)[ \t]/&nbsp;/mgx

647 名前:デフォルトの名無しさん [2009/09/27(日) 11:49:50 ]
どうでもいい議論が続いてるな。エディタで置換すればいいだろ
>>641でいいと思うけど。
いつも半角スペース2個を全角1個にしてるからvimなら%s/ / /gcで置換できる

648 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 12:19:15 ]
641じゃデコボコになるだろ・・

649 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 12:28:43 ]
>>641
今どきハードタブ使ってるひとはあまりいないんじゃない?

650 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 13:04:24 ]
Damian Conway先生に怒られるしね



651 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 13:11:40 ]
>>649
あなた、井の中の蛙さん?

652 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 13:49:34 ]
そうだけど何か? ゜_゜

653 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 16:07:09 ]
かわいそうに

654 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 17:07:39 ]
>>653なんか、ダッシュ村のため池の蛙なんだぜ。



655 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:30:25 ]
来月にリャマ本の日本語第5版くるんだね
中身結構かわってるかなあ

656 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 22:27:04 ]
>>646
コード載せた場合、先に引っかかるのは
大概行数制限のほうだと思う

657 名前:デフォルトの名無しさん [2009/09/28(月) 21:50:38 ]
さがってる

658 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 23:07:51 ]
下がってても落ちないよ

659 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 00:14:06 ]
s!>(back|return)<!>戻る<!si;

これやるとエラーダイアログが出るんです。

問題が発生したため、Perl Command Line Interpreter を終了します。 ご不便を
おかけして申し訳ありません。
この問題を Microsoft に報告してください。
(以下省略)
          [エラーを報告する(S)] [送信しない(D)]

いろいろ試したらこのような結果でした。
o Active Perl 5.8.8
o Active Perl 5.8.9
o Active Perl 5.10.0
x Active Perl 5.10.1

こんなふうに ( | ) を使わなければOKなんですが、ちょっと困ります。
s!>back<!>戻る<!si;
s!>return<!>戻る<!si;

perl 5.10.1 はウンコですか?

660 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 12:42:56 ]
>>659
デリミタは#とか括弧類にしてくれ。

あとPerlのせいにすんな。

FreeBSDやLinuxの5.10.1ではそのコードは普通に動くから、
5.10.1がウンコなんじゃなくてActivePerlが正規表現モジュールか何かの
Winへの移植に失敗してるんだろ。
5.10.1リリース後一ヶ月以内のスピード移植版に文句言うとか何様かと。
修正リリースが出るだろうからバグ報告でもして座って待ってろ。



661 名前:デフォルトの名無しさん [2009/09/30(水) 13:48:36 ]
=~で全角数字だけの文字列だったらを取り除くにはどうすれば良いのでしょうか?
ttp://ash.jp/code/unitbl21.htmを参考にしようと思ったのですが、どう書けばよいか分かりません。
お願いします。

662 名前:661 mailto:sage [2009/09/30(水) 13:50:08 ]
使用している文字コードはutf-8です。

663 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 13:58:29 ]
s/[0123456789]//g
みたいな?

664 名前:デフォルトの名無しさん [2009/09/30(水) 15:40:47 ]
>>661
s/^[0-9]+$//


665 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 17:38:18 ]
>>659
んー、WindowsXPで普通に動く。

666 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 19:58:03 ]
XSを勉強中です。
長さを指定して文字列を作成し、あとから文字を詰め込みたいのですが、やり方がわかりません。
自分で試したのはこんなコードです。

SV *
hoge()
CODE:
SV *string = newSV(5);
char *s = SvPVX(string);
//int len;
//char *s = SvPV_force(string, len);
int i;
for (i = 0; i < 5; i++) {
s[i] = 'x';
}
s[i] = '¥0';
RETVAL = string;
OUTPUT:
RETVAL

これを呼び出してみると、長さが0の文字列が返されるだけでした。
おしえてえらいひと。


667 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 19:59:37 ]
失敗した。インデントを全角空白にしました。

SV *
hoge()
  CODE:
    SV *string = newSV(5);
    char *s = SvPVX(string);
//int len;
    //char *s = SvPV_force(string, len);
    int i;
    for (i = 0; i < 5; i++) {
      s[i] = 'x';
    }
    s[i] = '¥0';
    RETVAL = string;
  OUTPUT:
    RETVAL

よろしくお願いします。

668 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 20:03:39 ]
なんかC++みたいだな


669 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 07:53:07 ]
>>668
XSが何か分かってないだろ。
ちゃんとPerlの質問だ。

質問にも答えたいが朝食を作らないと。

670 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:24:05 ]
>>667
SvPOK_onlyかSvPOK_only_UTF8が必要なんじゃね?



671 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:26:25 ]
>>666
あーちなみに文字列の突っ込み方は合ってるし、
そっち方面の質問がメインならC/C++のスレに行きな。ちなみに勘だが、

SV *
hoge()

ここがおかしいんじゃないか?SV *返すことってできたっけ?
インクルードファイルやMODULE行がないのは端折ってるだけだよな?

672 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:32:21 ]
5バイトしか取ってないのにNULLを6バイト目に入れてるけどいいの?

673 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:32:52 ]
あ、いいのか。

674 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:33:11 ]
>>672
6バイト取ってるでしょ。マニュアル嫁

675 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:34:07 ]
先越されるとは思わんかった。>>673>>671へだ。SV *自体問題ない。

676 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:46:21 ]
newSVpvと文字列コピーするところ以外は
やりたいことは一緒なんだから比べてみ。

677 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 10:10:11 ]
SVの実体が何か明示する前に文字列と決め付けてるからまずいんじゃないか。
いきなりnewSVみたいな低レベルの関数使うと怪我をするよ。
SV *string = newSVpv(" ", 5);としたらどうなる?

678 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 12:52:54 ]
スペースは5個な。まあ6バイトallocしてくれてるはずだから、
初期化するまで値が不定になるだけで実害はないと思うが

679 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 23:23:46 ]
>>668
たしかにコードはC++チックですね。コメントが // だったり、変数宣言が先頭になかったり。

>>669
668さんはXSが何かわかったうえでの発言だと思いますよ?

>>670
RETVALUE = string;
の行の前に
SvPOK_only_UTF8(string);
を追加してみましたけど、状況は変わらずでした。

>>677
newSVpvn(" ", 5) ですよね。それだとうまくいくんですが、これだとコピー元の文字列を
あらかじめ用意してないといけないので、今回の目的には適合しませんでした。

で、いろいろ調べて、New() と Safefree() と newSVpvn() を使うことにしました。
でもこれだと New() でバッファを用意して、文字列を埋めて、newSVpvn() でコピーして、・・・と
しなきゃいけないから、newSVpvn() でコピーするのが無駄かなあとは思うんですけど、
これしかうまくいかないので、そうします。
アドバイスいただいたみなさん、ありがとうございました。




680 名前:uy50% ◆e6.oHu1j.o mailto:sage [2009/10/02(金) 23:15:29 ]
ラリーウォールさんの書いたperlのソースってどこかで見れませんか?
どんなものでもいいです



681 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 23:26:04 ]
www.wall.org/~larry/

682 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 01:34:21 ]
Mail to larry@wall.org

このメアドがまたすげー

683 名前:uy50% ◆e6.oHu1j.o mailto:sage [2009/10/03(土) 02:33:27 ]
>>681
見つからないんですが、どこのページに?

684 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 04:31:47 ]
mapのような書き方をするメソッドを実装したいんですが、
もしかして第一引数に勝手にインスタンスが入るのでsubが省略できなかったりしますか?

685 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 04:32:13 ]
あ?

686 名前:デフォルトの名無しさん [2009/10/03(土) 05:06:10 ]
>>679
どうせnewSVpvn使うならこれでどうだ?。ナルストリングで文句があるならもう知らん。
newSVpvは初期化文字列が空でもちゃんと6バイト確保してくれるところがミソだ。

普通ならまず(char *)sを作ってnewSVpv(s, 5)すりゃ何の問題もないんだが、それだと
困るんだよな?

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"

MODULE = Foo PACKAGE = Foo

SV *
hoge()
 CODE:
  int i = 0;
  char c = (char)0;
  SV *string = newSVpv((char *)&c, 5);
  char *s = SvPVX(string);

  for (i = 0; i < 5; i++) s[i] = 'x';
  s[i] = (char)0;

  RETVAL = string;
 OUTPUT:
  RETVAL


687 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 05:13:25 ]
>>686
あなたには答えてほしくありません。

688 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 05:20:57 ]
>>684
日本語がよくわからんが....。map { some_code } @foo;のようなことがしたいなら、

my_map(&@){ ... }
:
my@bar = my_map { some_code } @foo;

で出来る。
map BLOCK LIST
map EXPR, LIST
の2つの書式を満たす方法は知らん。

689 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 05:23:18 ]
>>687
回答者を選ぶなら質問するな。
そもそも俺が何番の人か分かってるのかなこの人。勘違いだと思うんだが。
何番かアンカー晒してみ。

690 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 05:24:10 ]
あー>>687が質問者じゃなくて単なる煽りの可能性もあるな。だったらすまん>>687



691 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 05:47:31 ]
普通に考えてそうだろ.

692 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 07:03:49 ]
 CODE:
  int i = 0;
  SV *string = newSV(0);
  char *s = (char *)malloc(6);

  for (i = 0; i < 5; i++) s[i] = 'x';
  s[i] = (char)0;

  sv_setpv(string, s);
  free(s);

  RETVAL = string;


693 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 13:40:30 ]
>>688
すみません、サブルーチンの場合にそう書けるのは知ってます
クラスをオブジェクトとして作ったときに、$hoge->map({ $_ =~ /hoge/} @huga) というmapメソッドを書く方法はないのか知りたかったのです
しかしこのとき実装側では sub map($&@){… としなければいけないため、呼び出し側のsubが省略できないじゃないですか
なので、これをなんとかできないものかと思いまして…

694 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 14:08:52 ]
メソッドの呼び出しはプロトタイプ効かないから無理くさくね?

695 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 14:13:13 ]
やはりそうですか…
ありがとうございました

696 名前:デフォルトの名無しさん [2009/10/03(土) 14:26:36 ]
ttp://deepneko.dyndns.org/kokotech/2009/06/mecabwikipedia.html
このサイトに書いてあるようにしたのですが、rubyで書かれています。これ(下のプログラム)をperlで書き換えたいのですが、分かる方が居たらお願いします。

#!/usr/bin/ruby

open($*[0]).each do |line|
title = line.strip

next if title =~ /^\./
next if title =~ /[0-9]{4}/
next if title =~ /^[-.0-9]+$/

score = [-36000.0 ,-400 *(title.size**1.5)].max.to_i
print "#{title},0,0,#{score},名詞,一般,*,*,*,*,#{title},*,*,wikipedia_keyword,\n" if title.size > 9
end

697 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 15:17:11 ]
>>696
これなら初心者の自分でも書き直せるYO
エレガントな回答は上級者にまかすけど。

#!/usr/bin/perl

use List::Util qw(max);

open my $fh, $ARGV[0] or die $!;
while ( my $line = <$fh> ) {
my $title = $line;
$title =~ s/^\s*(.*?)\s*$/$1/;

next if $title =~ /^\./;
next if $title =~ /[0-9]{4}/;
next if $title =~ /^[-.0-9]+$/;

my $score = int max(-36000.0 ,-400 *((length $title)**1.5));
print "$title,0,0,$score,名詞,一般,*,*,*,*,$title,*,*,wikipedia_keyword,\n" if length $title > 9;
}
close $fh;


698 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 15:49:41 ]
>>693
map $hoge (....)とは書けるんだがな。
メソッド呼び出しはリストしか受けないから無理でしょ。

699 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 22:35:23 ]
WWW::SourceforgeJP ver.0.0.1 リリース
acapulco.dyndns.org/blog/2009/10/03/wwwsourceforgejp

700 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 23:25:10 ]
正規表現でマッチした文字列そのものを取得したいです

例えば
"hoge huga" =~ /(\s|\d)/
という正規表現があったとき、
' 'ではなく'\s'を取得したいです

可能でしょうか



701 名前: ◆TWARamEjuA mailto:sage [2009/10/03(土) 23:30:31 BE:1307243-BRZ(10101)]
可能でしょうねぇ。。。

702 名前:デフォルトの名無しさん [2009/10/03(土) 23:36:15 ]
700じゃないけど、どうすればできるか知りたい。
役に立つ気はしないけど。

703 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 23:46:01 ]
(?{})とか(??{})を駆使すればいけるかもしれないけど
デフォでそんなインターフェイスは用意されてないっしょ

704 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 00:03:31 ]
>>703
??{}ですか
参考になりました、調べてみますね
ありがとうございました

705 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 00:03:35 ]
おれも知りたい。

706 名前:700 mailto:sage [2009/10/04(日) 01:55:44 ]
こういう感じで元の文字列を取ることができました
ありがとうございます

perl -e '
use re "eval";
$hoge = q/ho..(?{$str="ho.."})|hu..(?{$str="hu.."})/;
"huga" =~ /$hoge/;
print "1:$str\n";
"hoge" =~ /$hoge/;
print "2:$str\n";
'
1:hu..
2:ho..

やりたかったのは
%hash = (
   '\s+' => 'space',
   '\d+' => 'number',
   '\w+' => 'word',
);

という感じのハッシュのキーを合成して、一番最初にマッチしたものの名前を返す関数の作成だったので、
これでいけそうです


707 名前:700 mailto:sage [2009/10/04(日) 03:45:43 ]
なんか変にハマったのでもう一度質問させてください。。。
下のような関数を作りました

sub match($@){
   use strict;
   use re "eval";
   my $str = shift;
   my @member = @_;

   my $regex = join("|", map{ "$_(?{\$ret = q{$_}})"} @member);
   my $ret;
   $str =~ /$regex/;
   return $ret;
}

以下の呼び出しを行うと、

print match("hoge 123", qw(\d \w \s)), $/; #=> \w
print match(" 123hoge", qw(\d \w \s)), $/; #=>
print match("123 hoge", qw(\d \w \s)), $/; #=>

となり、思った結果を返してくれませんでした
ですが、match関数に渡す配列の順番を変えたところ、

print match("hoge 123", qw(\d \w \s)), $/; #=> \w
print match(" 123hoge", qw(\w \d \s)), $/; #=> \s
print match("123 hoge", qw(\d \w \s)), $/; #=> \d

と、期待通りの結果を返してくれました
これは一回通った正規表現に対してはサブパターンは呼び出されないということなんでしょうか。。。

708 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 04:32:58 ]
レキサ作ってんのか。。。

709 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 10:06:58 ]
>>707
>>706のレス見たときに、関数化してハマるんだろうなーと思ったらマジでハマっててワロタ

my $regex → local our $regex
my $ret → local our $ret
これでどうかな?
昔、そういうプロギラムを書いていたときには、こいつで回避出来たよ

多分、正規表現リテラルは初回の正規表現コンパイル時に、クロージャのようにローカル環境をキャプチャするけど
再度、同じ正規表現を与えてリテラルのパスを通ってもキャプチャが発生しない
なので、正規表現の中ではmy変数は使わず、グローバル変数を使えばOKと

710 名前:700 mailto:sage [2009/10/04(日) 14:05:04 ]
>>709
おお!いけました!
ありがとうございます

use strictすることでこんな罠が生まれていたとは思いもしませんでした
正規周りは魔物が住んでますね…



711 名前:デフォルトの名無しさん [2009/10/04(日) 16:12:52 ]
utf8で書かれた文章をeuc-jpで新しく保存しようとすると開けなくなります
何が原因でしょうか。また解決するにはどうすれば良いでしょうか?

712 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 17:21:40 ]
777

713 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 17:25:40 ]
>>711
use utf8とかその辺りが原因の気が。

714 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 20:45:37 ]
>>713
csvファイルなのですがutf8のtext.csvを
nkf -e test.csv > test2.csv
で変換すると、開けなくなります。

715 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 21:42:37 ]
おいおい、言ってることがめちゃくちゃだな。
何をしようとして、何をしたら、どうなって欲しいのに、どうなったか、具体的にキチンと書いてみ。

716 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 22:00:58 ]
Web::Scraperでデータの抽出しているのですが
XpathをFirebugで取得してWeb::Scraperに処理させると、Xpathがずれてしまいます。
Firefoxのレンダリングでタグが追加変更されているのが原因みたいです。

PerlからFirefoxでレンダリング済みのタグを取得することはできないのでしょうか?
よろしくお願いします。

717 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 00:34:57 ]
ttable を除去すればいけるけど…
そういうことじゃなくて?

718 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 00:42:14 ]
>>717
tbody以外にもページによって
tr[2]をtr[3]に変えたりとか
/table/tbody/tr/tdが追加されてたりとか
center/div/div/fontが追加されたりとか

単純なパターンで取れない感じがするので、いっそのことFirefoxでレンダリング済みのソースを
perlから取れないかな?と思ったのです。


719 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 16:57:25 ]
卒業研究でperlを使うことになったんですが、
linux環境でMeCab.pmのperlモジュールを使用するにはどうしたらいいのでしょうか?
linuxはvine3.2です。

720 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 18:33:11 ]
フロストバイトエンジンがPC版でどのくらい綺麗になるのか見てみたい



721 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 18:35:36 ]
>>720
ごめん、ごばった

722 名前: ◆TWARamEjuA mailto:sage [2009/10/05(月) 18:36:03 BE:1742382-BRZ(10101)]
>>719
ググればすぐに出てくるんですけれども。。。
ttp://www.alwaysfine.jp/2008/03/spamassassin_32wo.html

いわゆる犬学生なんでしょうね。。。

723 名前:デフォルトの名無しさん [2009/10/06(火) 10:51:28 ]
. 1. HTML    で検索した結果 1〜10件目 / 約5,040,000,000件
. 2. PHP      で検索した結果 1〜10件目 / 約2,970,000,000件
. 3. Java......   で検索した結果 1〜10件目 / 約 835,000,000件
. 4. Forth.    で検索した結果 1〜10件目 / 約 323,000,000件
. 5. Ruby..    で検索した結果 1〜10件目 / 約 275,000,000件
. 6. perl.....    で検索した結果 1〜10件目 / 約 245,000,000件
. 7. Python...   で検索した結果 1〜10件目 / 約 204,000,000件
. 8. pascal...   で検索した結果 1〜10件目 / 約 170,000,000件
. 9. Delphi    で検索した結果 1〜10件目 / 約 127,000,000件
10. VisualBasic...で検索した結果 1〜10件目 / 約 121,000,000件
11. lisp...      で検索した結果 1〜10件目 / 約.  26,700,000件
12. fortran     で検索した結果 1〜10件目 / 約.  21,300,000件
13. COBOL    で検索した結果 1〜10件目 / 約.  18,500,000件
14. HSP      で検索した結果 1〜10件目 / 約.  12,300,000件
15. FreeBasic.. で検索した結果 1〜10件目 / 約   6,320,000件
16. Tcl/Tk.     で検索した結果 1〜10件目 / 約   4,940,000件
17. QBasic     で検索した結果 1〜10件目 / 約   4,190,000件
18. VisualC....  で検索した結果 1〜10件目 / 約   1,360,000件
19. DarkBASIC. で検索した結果 1〜10件目 / 約   1,320,000件
20. BasicStudio で検索した結果 1〜10件目 / 約    304,000件
21. N88basic.   で検索した結果 1〜10件目 / 約    215,000件
22. f-basic     で検索した結果 1〜10件目 / 約    109,000件
23. ActiveBasic で検索した結果 1〜10件目 / 約.     89,800件
24. 99BASIC.... で検索した結果 1〜10件目 / 約.     11,500件

3Dprogramming で検索した結果 1〜10件目 / 約794,000件
2Dprogramming で検索した結果 1〜10件目 / 約. 57,400件

intel で検索した結果 1〜10件目 / 約729,000,000件
amd で検索した結果 1〜10件目 / 約355,000,000件

724 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 11:01:41 ]
>>715
保存でeuc-jp指定とnkfで-eとは違うのですか?
無知ですみません。

725 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 11:37:51 ]
>>724
出力はeucって指定してるけど、入力の指定は?
もとのファイルがUTF8だということをnkfに教えてやらなければダメなのかもね。
nkfの説明書をよく読んでみてよ。

726 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 12:06:40 ]
ある2種類の要素数が同じ配列データがあって
片方は末尾までデータが入っているのですが
もう片方は末尾に半角スペース1個だけが入っています

この配列をファイルに書き出す際、前者は全て書き出し、後者は最後の配列のみ書き出さないようにしたいのですが、うまくいきません

ループ中に配列aの最後n番目が半角スペースなら書き出さない場合、
if($a[$n] eq " "){
last;
}
では駄目なのでしょうか
携帯からなので読みにくいですがよろしくお願いします

727 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 12:40:35 ]
デバッグという概念が失われて久しい……

728 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 13:18:59 ]
改行が入ってんだろ

729 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 14:04:23 ]
>>726
デバッグしろ。

if($a[$n] eq " ") がヒットしているか調べろ。$a[$n]の中身を調べろ。

730 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 16:09:48 ]
perl のデバッガって何がおすすめですか。



731 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 16:17:19 ]
Data::Dumperでデータの中身見てDevel::Peekでutf8フラグ見るくらいしかやったことないな

732 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 18:55:01 ]
ifの前ぐらいに
print "!!! HELLO !!! $n='$a[$n]'\n";
って書いておくといいよ。

733 名前:デフォルトの名無しさん [2009/10/07(水) 01:31:47 ]
>>726
if($a[-1] eq " "){
output @a[0..$#a-1];
}else{
output @a;
}

734 名前:デフォルトの名無しさん [2009/10/07(水) 01:35:46 ]
>>733
pop @a if $a[-1] eq " ";
output @a;


735 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 02:18:49 ]
2行の文字列があって、
1行目の文字列を2行目の文字列の任意の場所に挿入
その後1行目を改行ごと削除
という作業はどう書けばいいでしょうか?

736 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 03:34:48 ]
>>735
splitで切って2つの文字列に分けて、substrで1行目を2行目に入れればいい。

737 名前:デフォルトの名無しさん [2009/10/07(水) 07:10:08 ]
>>735
日本語が妖しいので確認


入力> 2行一組の文字列
出力> それぞれの組を1行にまとめた文字列
処理> 改行を削除した1行目を2行目の任意の場所に挿入




738 名前:デフォルトの名無しさん [2009/10/07(水) 07:46:29 ]
>>736
chomp(@d=<>);
for ($i=0;$i<@d-1;$i+=2){
 $len=length $d[$i+1];
 substr($d[$i+1],rand($len),0)=$d[$i];
 print $d[$i+1]."\n";
}



代入型のsubstrって戻り値は代入後の文字列だっけ?
ググっても見つからなかった。

739 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 10:47:16 ]
> ググっても見つからなかった。

最近の Perl を良く知らないのですが perldoc などのオフィシャルなドキュメントは存在しないのでしょうか?

740 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 11:07:25 ]
>>738
どっちかというとperlop(1)のAssignment Operatorsの方をよく読んだ方が
いいんじゃない?

C と違って、スカラ代入演算子は有効な左辺値を作り出します。代入を修正することは、代入を行なってから、その代入された変数を修正するのと同じことになります。これは、以下のように何かのコピーを変更したいときに便利です:

($tmp = $global) =~ tr [A-Z] [a-z];

(perldoc.jp/docs/perl/5.10.0/perlop.pod)

てことなので、

$tmp = "ABCDEF";
$global = "XYZ";
(substr($tmp, 2, 2) = $global) =~ tr [A-Z] [a-z];

とか試してみれば理解できると思います。



741 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 11:12:40 ]
>>739
あるよ
perldoc -f substr
で調べられる

742 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 13:06:10 ]
正規表現で、abもしくはxyもしくは12を含むは、

/ab|xy|12/

と書きますが、ab、xy、12の全て含むはどう書くのでしょうか?

743 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 13:30:17 ]
>>742
ab,xy,12をすべての順列で並べて

ab.*xy.*12|ab.*12.*xy|...

と書けばいい。

無理に正規表現だけでやらずに

/ab/ && /xy/ && /12/

とした方が楽だと思うけどね。

744 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 13:43:19 ]
>>743
d

745 名前:デフォルトの名無しさん mailto:sega [2009/10/07(水) 14:04:22 ]
ファイルテスト演算子 -T って、
どうやってテキストファイルだと見破ってるの?
その原理とか注意事項ってある?

746 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 14:19:45 ]
>>745
とりあえずperlfunc読め。

ファイルテスト -T と -B の動作原理は、次のようになっています。ファイルの最初の数ブロックを調べて、
変わった制御コードや上位ビットがセットされているような、通常のテキストには現れない文字を探します。
そのような文字が、たくさん (>30%) 見つかるようであれば、そのファイルは -B ファイルであると判断され
ます; さもなければ -T ファイルとなります。最初のブロックにヌル文字が含まれるファイルも、バイナリ
ファイルとみなされます。 -T や -B をファイルハンドルに対して用いると、最初のブロックを調べる代わり
に、IO バッファを調べます。調べたファイルの中身が何もないときや、ファイルハンドルを調べたときに
EOF に達していたときには、-T も -B も「真」を返します。

「通常のテキストには現れない文字ってなんだよ!!」とか言いたくなったら、ソース読むしかないかな。
(pp_sys.cのpp_fttext)

でも結局30%だからあんまりアテにすると痛い目を見そうなんで俺は使わないね〜。

747 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 14:31:29 ]
マニュアル提示サービスはここですか?

748 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 14:36:29 ]
ちがいます

749 名前:デフォルトの名無しさん [2009/10/07(水) 15:16:53 ]
>>747
そうです。
ここは、疑問を書けば、マニュアルの該当部分を張ってくれるスレです。


750 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 15:18:04 ]
ここは質問スレだよ(´・ω・`)



751 名前:デフォルトの名無しさん [2009/10/07(水) 15:22:25 ]
そうです 質問スレです…

752 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 15:35:33 ]
そもそも、マニュアルに書いてあることが質問される時点で異常な状態だということを見失うなかれ。

753 名前:デフォルトの名無しさん [2009/10/07(水) 15:40:44 ]
>>739
オフィシャルなドキュメントには記載が見つからなかったのです

754 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:17:48 ]
>>752
googleで-Tを検索したら何も出てこなかったんだよきっと

755 名前:デフォルトの名無しさん [2009/10/07(水) 22:03:27 ]
>>752
じゃあ、substrに代入したときの返り値を調べてみてよ。


756 名前:741 [2009/10/07(水) 23:02:37 ]
>>755
あぁ、ごめん。741だけど
> 代入型のsubstr
この部分に全く目がいってなかったわ
my $result = (substr($d[$i+1],rand($len),0)=$d[$i]);
この$resultがどうなるかって意味だよね?それなら載ってないかも。俺が普段この書き方しないから空目した

自分で>>735を書くとしたら下のような感じかなぁ
my $str =<< "STR";
abcdef\n123456\nghijklmn\n78910223
STR
warn $str;
my @res;
my @lines = split /\n/, $str;
while (@lines) {
  my $line1 = shift @lines;
  my $line2 = shift @lines;

  print "num?: ";
  my $num = <STDIN>;
  my $length = length $line1;
  my $post = substr $line2, $num, $length, $line1;
  push @res, $line2 . $post;
}
print
  join "\n", @res,
  "\n";

757 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 04:05:10 ]
>>755
なにがどう「じゃあ」なんだよwww


758 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 04:53:55 ]
$ perldoc -f substr
No documentation found for "perlfunc".

^^v

759 名前:デフォルトの名無しさん [2009/10/08(木) 06:39:44 ]
>>756
マニュアルに記載のない使い方はしないほうがよいのか
代入文だからlvalueが保持されると考えるのがよいのかが知りたかった。
多分、後者だね。


コードについては、ヒアドキュメント使うと柔軟性に難があるから、下記のがいいかも。

@lines=<DATA>;

(プログラム末尾)
__DATA__
入力データ
入力データ



あと、入力が偶数行でなかったときはこけるね。
入力の妥当性を調べるのはプログラムの仕事だよ。

それから、任意ってそういうことだったのかな?
もとの要求が謎の多いものだから、こちらは乱数にしたのだけど。

760 名前:デフォルトの名無しさん [2009/10/08(木) 06:46:42 ]
>>756
もう一度プログラム見た。
これ、正しくない。

挿入位置+1行目の長さが2行目の長さより短いと
順がおかしくなる。



761 名前:デフォルトの名無しさん [2009/10/08(木) 09:04:20 ]
>>760
おぉ。ホントだ。台風で午前中休みにして暇になったから直した。
無理やりsubstr使う必要なかったな
my @lines = split /\n/, $str;
die unless $#lines % 2;

my @res;
while (@lines) {
  my $line1 = shift @lines;
  my $line2 = shift @lines;

  print "num?: ";
  my $num = <STDIN>;
  my $post = substr $line2, $num;

  $line2 =~ s/($post)$/$line1$1/xms;
  push @res, $line2;
}

762 名前:デフォルトの名無しさん [2009/10/08(木) 11:53:43 ]
ハッシュ%hogeで
$hoge{$a}{$b}{$c}{$d}...{$n}
を定義した順番でkeyを
keysで取り出したい

普通モジュールの Tie:IxHash を使うらしいけど
それだと最初の$aのkeyだけ定義順番でとりだせて
%{$hoge{$a}}以降の深い構造でのkeyが
順番どうりならず、ばらばらにkeysで取り出されるようになる

どうにかして定義した順番でどの段階でも
取り出せるようにしたいんだけど
おしえて下さい。

763 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 12:04:59 ]
>>762
キーを配列にとっとけ。
$hoge{$fuga}{$foobar} = 'bar';
push(@hoge, [$a, $foobar]);




764 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 12:07:39 ]
$hash{a}{b}に値を入れる前に

tie %{$hash{a}}, 'Tie::IxHash';

しておけば、

keys %{$hash{a}}は順番に取り出せるよ。

765 名前:デフォルトの名無しさん [2009/10/08(木) 15:42:29 ]
一度で深いところの値を定義することになるので
(このように $hoge{$a}{$b}{$c}{$d}...{$n}=1)
>>764はつかえない

あと同じkeyが何回もでてくる可能性があるので>>763
もつかえない
(このように for $a (同じのあり)
        for  $b (同じのあり)
          $hoge{$a}{$b}{$c}{$d}...{$n}++
 )
あとでkeyをとりだすとき何回も同じのがでてきてしまう
>>763

いい方法ないでしょうか

766 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 15:45:51 ]
>>765
配列だから同じキーが何回出てこようとちゃんと
保存されていて問題ないはずだが?

767 名前:765 [2009/10/08(木) 15:46:38 ]
あと
tie
すると前保持していた値がすべて真っ白になってしまうので
繰り返しのなかに>>764
いれられない状態。
一日なやんでもいい方法が思いつかない

768 名前:デフォルトの名無しさん [2009/10/08(木) 15:52:52 ]
a b c d a b c d e f a g a
という順番でkeyがでてくるとする
とりだすときは
a b c d e f g
でとりだしたいんだけど
できる?>>766


769 名前:デフォルトの名無しさん [2009/10/08(木) 15:57:32 ]
>>762
やり方が悪いので、データ構造を見直すべし。

770 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 15:59:54 ]
>>768
そんなのすでに取り出したかハッシュで管理してとばせばいいだけだろ。



771 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 16:10:42 ]
>>768
それこそハッシュ使って同じキーが出てきたらスキップするようにすればいい。
んで$hoge->{$foo}の階層だけとりだしたいなら、

whlile(@hoge){
  next unless $_->[$foo];
  my @keys = @$_;
}

で取り出せるだろ。あ、あと>>763は間違いがあった。

間違い
$hoge{$fuga}{$foobar} = 'bar';
push(@hoge, [$a, $foobar]);

正しい
$hoge{$fuga}{$foobar} = 'bar';
push(@hoge, [$fuga, $foobar]);

772 名前:デフォルトの名無しさん [2009/10/08(木) 17:35:28 ]
もしかしてこういうのでいいってオチか?

print sort keys %hash;

もしくは

print map $hash{$_}, sort keys %hash;


773 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 18:44:55 ]
よくわからんが、各層のキーをjoinしたものをハッシュキーにして
Tie::IxHashを使えばいいんじゃないのか。

774 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 21:00:34 ]
Perlで/etc/shadowに使うSHA512化されたパスワードを作ろうとしているのですが
/etc/shadowとsaltとpasswordを同じにしても出てくるハッシュが一致しません。

もし他によい方法があれば教えて下さい・・・

#!/usr/bin/perl
use strict;
use Digest::SHA qw(hmac_sha512_base64);

my $sha = hmac_sha512_base64("password","salt");
print "$sha\n";

775 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 22:25:23 ]
Webリソースのバイト数を取得するモジュールって何かありますか?

776 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:12:20 ]
>>775
Webリソースって具体的に何だ?

777 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:20:33 ]
>776
タイミングが悪くて非常に申し訳ない。
自己解決しました^^;

ダウンロード対象のつもりでした。html,zip,etc…

778 名前:デフォルトの名無しさん [2009/10/08(木) 23:21:56 ]
perlってsocks串刺せますか?

779 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:27:55 ]
uaでいいんじゃないのか?

780 名前:デフォルトの名無しさん [2009/10/08(木) 23:28:35 ]
ua…
LWP?とかいうのと関係ありますか?



781 名前:デフォルトの名無しさん [2009/10/09(金) 05:57:46 ]
>>774
目的はクラッキング?
フツウの人はシャドウなんていじらないもんな。

782 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 07:14:21 ]
Pealのデバッガで変数を強制で変えるコマンドってある?

初心者な質問ですまん

783 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 07:45:58 ]
perlな

784 名前:デフォルトの名無しさん [2009/10/09(金) 08:52:12 ]
>>782
普通に代入じゃだめなのん?

785 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 09:14:52 ]
>>774
そういうシステムならcryptもsha512対応してると思うので
そっち使えばいいと思う。同じライブラリ呼ぶので確実な
筈だよ。

print crypt('password', '$6$salt');

786 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 14:08:33 ]
>>774
車道クラックか?

>>777
解決したならそれを書くのが筋。HTTPレスポンスのことならHTTPヘッダの
Content-Length: 行で取れるよな。

>>782
スカラ型の内部値を変えたいのか?質問の意図がよくわからん。
数値にしたけりゃ
$foo += 0;
文字列にしたけりゃ
$foo .= '';
内部的にリファレンスとか整数型にしたいとかだったら簡単な方法は知らん。

787 名前:774 mailto:sage [2009/10/09(金) 17:07:06 ]
>>785
普通にcryptで出来るんですね・・・ありがとうございました。

>>781
>>786
趣味で自宅サーバーをやっているのですが
Perlからsystem関数でuseraddを使うためです。
誤解を招く質問をしてしまい申し訳ありません。

788 名前:777 mailto:sage [2009/10/10(土) 03:46:06 ]
>786
おっしゃる通り、HTTPレスポンスから取得出来ました。
Perlの質問ではありませんでした…

789 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 01:53:02 ]
自己解決しましたっつーのは自分が苦労して答えを導き出せたから
掲示板に答えが書かれてしまうと自分の苦労の価値が下がってしまうから
それを避けるための自慰行為。
「Webリソース」とか書くようなバ力は788なんかじゃなくてwcとかで解決したつもりだろ。


790 名前:デフォルトの名無しさん [2009/10/11(日) 03:25:57 ]
>>787
お陰さまで私も勉強になりました。
今時のシステムはパスワード暗号化にsha512使ってるなんて
知りませんでしたから。
うちのシステムは何を使ってるんだろ?



791 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:13:01 ]
gzファイルをgzopenを使って読み込みこむことはできたんですが
日本語が文字化けしてしまいます
普通のtxtファイルなどは日本語でも文字化けしません
どうしたらいいんでしょうか

792 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:20:33 ]
>>791
使うな。

793 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:25:11 ]
gzopenを使うなってことですか?

794 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:54:51 ]
perlを使うな

795 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 21:03:41 ]
perlだとできないんですか?
それじゃphpでやってみます・・

796 名前:デフォルトの名無しさん [2009/10/11(日) 23:57:04 ]
連想配列について質問です。
たとえばkeysでとりだしたハッシュの順序は一定ではないそうですが、
何回もperl *.plで実行しても同じ順序でキーが取り出されます。
ハッシュの順序はOS依存なんですか?それともperlのバージョン依存なんですか?
同じ環境のもとで同じプログラムにした場合はkeysでとりだされるキーも同じ順序になるのですか?

797 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:12:59 ]
ハッシュ依存じゃないの?

798 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:17:12 ]
>一定ではないそうですが

これは誰から聞いたの?

799 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:35:34 ]
別に乱数は使ってないよ

800 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:51:45 ]
一定ではないというのは環境によるんだろうが
ハッシュに順序の保障を求めるべきではないとは思う
順序の保障が欲しければリストを利用/併用すべきだろうな



801 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:24:16 ]
perlのバージョン依存。

perl5.10.0のperldoc -f keysでは、
===========
超訳。
perl5.8.1までは、セキュリティー上の理由から、
keysはプログラムを実行する度に違う順序で取り出されてた。
(順番自体は見た目上ランダムに決定されてる。ただし、
同一プロセス内で、hashに変更が無いならeach, valuesでも
keysと同じ順である事は保証される。)
===========
暗に「より新しいperlではkeysはhashに変更が無いなら
プログラムを複数回実行しても同じ順に取り出される。」
と言ってはいるが、それをkeysのperldocでは明文化は
してない。
ここまで調べて面倒になった。

俺も>>800氏と同じ見解だし。


802 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:32:14 ]
うそっ
わざわざランダムにしてたんだ

for (keys
っていう処理はするけど、大抵はsortとセットだから気にしたこともなかった

803 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 02:52:49 ]
>>801
逆だ。5.8.0までは特定の順序で取り出されていたのを、
5.8.1以降で変わるようにしたんだ。

perldoc.perl.org/functions/keys.html
> Since Perl 5.8.1 the ordering is different even between different runs of Perl
> for security reasons (see "Algorithmic Complexity Attacks" in perlsec).

perldoc.perl.org/perlsec.html#Algorithmic-Complexity-Attacks
perldoc.jp/docs/perl/5.10.0/perlsec.pod

804 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 03:59:09 ]
セキュリティが理由なら、止めてしまう訳ないしな

805 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 05:43:17 ]
質問です。サブルーチンの途中でreturnせずに戻り値を返すことは可能でしょうか?

長文処理の自作モジュールに引数としてファイル名を渡し、
サブルーチン内でopen、while(各行処理)、closeまで行なっています。

行数が数千行になるので各行で処理を終えたい(@本文のようなリストは作りたくない)のです。
現在サブルーチン内で各行をprintしていますが、どうもスマートではないと思い質問しました。

いまの状態を簡易に書くとこんな感じです。

(呼び出し側)
$foo->get('file')

(package foo内のサブルーチン)
sub get {
my $self = shift;
my $file = shift;
open my $in, "< $file" or die($!);
while (<$in>) {
#ここで各行を処理してprint
}
close $in;
return 1;
}

素直に呼び出し側でファイルを開いて行単位でサブルーチンを呼ぶべきかとも思うのですが、
それもなんかスマートでない気がしてモヤモヤしています。よろしければ方向性だけでも示唆ください。

806 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 06:03:32 ]
コルーチン






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<256KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef