Perlについての質問箱 41箱目at TECH
Perlについての質問箱 41箱目 - 暇つぶし2ch606:デフォルトの名無しさん
09/09/26 11:33:59
プログラミングする目的は綺麗なコードを書く事じゃないし
行儀のいいコードを書く必要性は場合よる

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

607:デフォルトの名無しさん
09/09/26 12:11:35
プログラムは本来動けばいい物でしょ

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

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

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

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

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

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

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

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

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

613:デフォルトの名無しさん
09/09/26 13:00:50
プログラミングの鉄則


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



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

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

615:デフォルトの名無しさん
09/09/26 13:10:05
そうかそうか

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

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

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

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

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

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

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

620:デフォルトの名無しさん
09/09/26 13:49:02
200行のループしかないプログラムだったり

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

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

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

>>619
同意

622:デフォルトの名無しさん
09/09/26 14:13:57
s/機械的/盲目的/

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

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

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

625:デフォルトの名無しさん
09/09/26 15:50:33
よそでやれ

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

627:デフォルトの名無しさん
09/09/26 15:58:19
ハゲ・ズラ板でやれ

628: ◆TWARamEjuA
09/09/26 16:18:45 BE:1634235-BRZ(10101)
つ 夢・独り言@2ch掲示板 URLリンク(changi.2ch.net)

629:デフォルトの名無しさん
09/09/26 16:24:52
>>628
行ってらっしゃーい

630:デフォルトの名無しさん
09/09/26 18:08:27
> 綺麗で可読性のあるコード

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

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

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

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

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

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

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

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

(´;ω;`)ブワッ

635:デフォルトの名無しさん
09/09/26 22:12:43
(´;ω;`;:..

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

(´;;:;::;..

636:デフォルトの名無しさん
09/09/26 22:14:07
(´;;:;::;..

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

(´ ∀`)

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

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

638:デフォルトの名無しさん
09/09/27 01:43:41
>>637
もちろんです。

man Imagemagick

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

(´・ω 。o。゚。o○

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

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

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

641:デフォルトの名無しさん
09/09/27 09:25:39
s/\t/  /g;

642:デフォルトの名無しさん
09/09/27 09:57:50
>>641
それじゃダメだろ

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


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

645:デフォルトの名無しさん
09/09/27 11:29:21
 

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

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

648:デフォルトの名無しさん
09/09/27 12:19:15
641じゃデコボコになるだろ・・

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

650:デフォルトの名無しさん
09/09/27 13:04:24
Damian Conway先生に怒られるしね

651:デフォルトの名無しさん
09/09/27 13:11:40
>>649
あなた、井の中の蛙さん?

652:デフォルトの名無しさん
09/09/27 13:49:34
そうだけど何か? ゜_゜

653:デフォルトの名無しさん
09/09/27 16:07:09
かわいそうに

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



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

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

657:デフォルトの名無しさん
09/09/28 21:50:38
さがってる

658:デフォルトの名無しさん
09/09/28 23:07:51
下がってても落ちないよ

659:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/30 12:42:56
>>659
デリミタは#とか括弧類にしてくれ。

あとPerlのせいにすんな。

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

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

662:661
09/09/30 13:50:08
使用している文字コードはutf-8です。

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

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


665:デフォルトの名無しさん
09/09/30 17:38:18
>>659
んー、WindowsXPで普通に動く。

666:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/30 20:03:39
なんかC++みたいだな


669:デフォルトの名無しさん
09/10/01 07:53:07
>>668
XSが何か分かってないだろ。
ちゃんとPerlの質問だ。

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

670:デフォルトの名無しさん
09/10/01 09:24:05
>>667
SvPOK_onlyかSvPOK_only_UTF8が必要なんじゃね?

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

SV *
hoge()

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

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

673:デフォルトの名無しさん
09/10/01 09:32:52
あ、いいのか。

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

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

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

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

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

679:デフォルトの名無しさん
09/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
09/10/02 23:15:29
ラリーウォールさんの書いたperlのソースってどこかで見れませんか?
どんなものでもいいです

681:デフォルトの名無しさん
09/10/02 23:26:04
URLリンク(www.wall.org)

682:デフォルトの名無しさん
09/10/03 01:34:21
Mail to larry@wall.org

このメアドがまたすげー

683:uy50% ◆e6.oHu1j.o
09/10/03 02:33:27
>>681
見つからないんですが、どこのページに?

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

685:デフォルトの名無しさん
09/10/03 04:32:13
あ?

686:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/03 05:13:25
>>686
あなたには答えてほしくありません。

688:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/03 05:23:18
>>687
回答者を選ぶなら質問するな。
そもそも俺が何番の人か分かってるのかなこの人。勘違いだと思うんだが。
何番かアンカー晒してみ。

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

691:デフォルトの名無しさん
09/10/03 05:47:31
普通に考えてそうだろ.

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

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

695:デフォルトの名無しさん
09/10/03 14:13:13
やはりそうですか…
ありがとうございました

696:デフォルトの名無しさん
09/10/03 14:26:36
URLリンク(deepneko.dyndns.org)
このサイトに書いてあるようにしたのですが、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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/03 15:49:41
>>693
map $hoge (....)とは書けるんだがな。
メソッド呼び出しはリストしか受けないから無理でしょ。

699:デフォルトの名無しさん
09/10/03 22:35:23
WWW::SourceforgeJP ver.0.0.1 リリース
URLリンク(acapulco.dyndns.org)

700:デフォルトの名無しさん
09/10/03 23:25:10
正規表現でマッチした文字列そのものを取得したいです

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

可能でしょうか

701: ◆TWARamEjuA
09/10/03 23:30:31 BE:1307243-BRZ(10101)
可能でしょうねぇ。。。

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

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

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

705:デフォルトの名無しさん
09/10/04 00:03:35
おれも知りたい。

706:700
09/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
09/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:デフォルトの名無しさん
09/10/04 04:32:58
レキサ作ってんのか。。。

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

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

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

710:700
09/10/04 14:05:04
>>709
おお!いけました!
ありがとうございます

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

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

712:デフォルトの名無しさん
09/10/04 17:21:40
777

713:デフォルトの名無しさん
09/10/04 17:25:40
>>711
use utf8とかその辺りが原因の気が。

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

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

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

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

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

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

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


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

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

721:デフォルトの名無しさん
09/10/05 18:35:36
>>720
ごめん、ごばった

722: ◆TWARamEjuA
09/10/05 18:36:03 BE:1742382-BRZ(10101)
>>719
ググればすぐに出てくるんですけれども。。。
URLリンク(www.alwaysfine.jp)

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

723:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/06 11:01:41
>>715
保存でeuc-jp指定とnkfで-eとは違うのですか?
無知ですみません。

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

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

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

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

727:デフォルトの名無しさん
09/10/06 12:40:35
デバッグという概念が失われて久しい……

728:デフォルトの名無しさん
09/10/06 13:18:59
改行が入ってんだろ

729:デフォルトの名無しさん
09/10/06 14:04:23
>>726
デバッグしろ。

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

730:デフォルトの名無しさん
09/10/06 16:09:48
perl のデバッガって何がおすすめですか。

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

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

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

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


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

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

737:デフォルトの名無しさん
09/10/07 07:10:08
>>735
日本語が妖しいので確認


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




738:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/07 10:47:16
> ググっても見つからなかった。

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

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

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

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

(URLリンク(perldoc.jp))

てことなので、

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

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

741:デフォルトの名無しさん
09/10/07 11:12:40
>>739
あるよ
perldoc -f substr
で調べられる

742:デフォルトの名無しさん
09/10/07 13:06:10
正規表現で、abもしくはxyもしくは12を含むは、

/ab|xy|12/

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

743:デフォルトの名無しさん
09/10/07 13:30:17
>>742
ab,xy,12をすべての順列で並べて

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

と書けばいい。

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

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

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

744:デフォルトの名無しさん
09/10/07 13:43:19
>>743


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

746:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/07 14:31:29
マニュアル提示サービスはここですか?

748:デフォルトの名無しさん
09/10/07 14:36:29
ちがいます

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


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

751:デフォルトの名無しさん
09/10/07 15:22:25
そうです 質問スレです…

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

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

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

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


756:741
09/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:デフォルトの名無しさん
09/10/08 04:05:10
>>755
なにがどう「じゃあ」なんだよwww


758:デフォルトの名無しさん
09/10/08 04:53:55
$ perldoc -f substr
No documentation found for "perlfunc".

^^v

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


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

@lines=<DATA>;

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



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

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

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

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

761:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/08 11:53:43
ハッシュ%hogeで
$hoge{$a}{$b}{$c}{$d}...{$n}
を定義した順番でkeyを
keysで取り出したい

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

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

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




764:デフォルトの名無しさん
09/10/08 12:07:39
$hash{a}{b}に値を入れる前に

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

しておけば、

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

765:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/08 15:45:51
>>765
配列だから同じキーが何回出てこようとちゃんと
保存されていて問題ないはずだが?

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

768:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/08 15:57:32
>>762
やり方が悪いので、データ構造を見直すべし。

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

771:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/08 17:35:28
もしかしてこういうのでいいってオチか?

print sort keys %hash;

もしくは

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


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

774:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/08 22:25:23
Webリソースのバイト数を取得するモジュールって何かありますか?

776:デフォルトの名無しさん
09/10/08 23:12:20
>>775
Webリソースって具体的に何だ?

777:デフォルトの名無しさん
09/10/08 23:20:33
>776
タイミングが悪くて非常に申し訳ない。
自己解決しました^^;

ダウンロード対象のつもりでした。html,zip,etc…

778:デフォルトの名無しさん
09/10/08 23:21:56
perlってsocks串刺せますか?

779:デフォルトの名無しさん
09/10/08 23:27:55
uaでいいんじゃないのか?

780:デフォルトの名無しさん
09/10/08 23:28:35
ua…
LWP?とかいうのと関係ありますか?

781:デフォルトの名無しさん
09/10/09 05:57:46
>>774
目的はクラッキング?
フツウの人はシャドウなんていじらないもんな。

782:デフォルトの名無しさん
09/10/09 07:14:21
Pealのデバッガで変数を強制で変えるコマンドってある?

初心者な質問ですまん

783:デフォルトの名無しさん
09/10/09 07:45:58
perlな

784:デフォルトの名無しさん
09/10/09 08:52:12
>>782
普通に代入じゃだめなのん?

785:デフォルトの名無しさん
09/10/09 09:14:52
>>774
そういうシステムならcryptもsha512対応してると思うので
そっち使えばいいと思う。同じライブラリ呼ぶので確実な
筈だよ。

print crypt('password', '$6$salt');

786:デフォルトの名無しさん
09/10/09 14:08:33
>>774
車道クラックか?

>>777
解決したならそれを書くのが筋。HTTPレスポンスのことならHTTPヘッダの
Content-Length: 行で取れるよな。

>>782
スカラ型の内部値を変えたいのか?質問の意図がよくわからん。
数値にしたけりゃ
$foo += 0;
文字列にしたけりゃ
$foo .= '';
内部的にリファレンスとか整数型にしたいとかだったら簡単な方法は知らん。

787:774
09/10/09 17:07:06
>>785
普通にcryptで出来るんですね・・・ありがとうございました。

>>781
>>786
趣味で自宅サーバーをやっているのですが
Perlからsystem関数でuseraddを使うためです。
誤解を招く質問をしてしまい申し訳ありません。

788:777
09/10/10 03:46:06
>786
おっしゃる通り、HTTPレスポンスから取得出来ました。
Perlの質問ではありませんでした…

789:デフォルトの名無しさん
09/10/11 01:53:02
自己解決しましたっつーのは自分が苦労して答えを導き出せたから
掲示板に答えが書かれてしまうと自分の苦労の価値が下がってしまうから
それを避けるための自慰行為。
「Webリソース」とか書くようなバ力は788なんかじゃなくてwcとかで解決したつもりだろ。


790:デフォルトの名無しさん
09/10/11 03:25:57
>>787
お陰さまで私も勉強になりました。
今時のシステムはパスワード暗号化にsha512使ってるなんて
知りませんでしたから。
うちのシステムは何を使ってるんだろ?

791:デフォルトの名無しさん
09/10/11 20:13:01
gzファイルをgzopenを使って読み込みこむことはできたんですが
日本語が文字化けしてしまいます
普通のtxtファイルなどは日本語でも文字化けしません
どうしたらいいんでしょうか

792:デフォルトの名無しさん
09/10/11 20:20:33
>>791
使うな。

793:デフォルトの名無しさん
09/10/11 20:25:11
gzopenを使うなってことですか?

794:デフォルトの名無しさん
09/10/11 20:54:51
perlを使うな

795:デフォルトの名無しさん
09/10/11 21:03:41
perlだとできないんですか?
それじゃphpでやってみます・・

796:デフォルトの名無しさん
09/10/11 23:57:04
連想配列について質問です。
たとえばkeysでとりだしたハッシュの順序は一定ではないそうですが、
何回もperl *.plで実行しても同じ順序でキーが取り出されます。
ハッシュの順序はOS依存なんですか?それともperlのバージョン依存なんですか?
同じ環境のもとで同じプログラムにした場合はkeysでとりだされるキーも同じ順序になるのですか?

797:デフォルトの名無しさん
09/10/12 00:12:59
ハッシュ依存じゃないの?

798:デフォルトの名無しさん
09/10/12 00:17:12
>一定ではないそうですが

これは誰から聞いたの?

799:デフォルトの名無しさん
09/10/12 00:35:34
別に乱数は使ってないよ

800:デフォルトの名無しさん
09/10/12 00:51:45
一定ではないというのは環境によるんだろうが
ハッシュに順序の保障を求めるべきではないとは思う
順序の保障が欲しければリストを利用/併用すべきだろうな

801:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/12 01:32:14
うそっ
わざわざランダムにしてたんだ

for (keys
っていう処理はするけど、大抵はsortとセットだから気にしたこともなかった

803:デフォルトの名無しさん
09/10/12 02:52:49
>>801
逆だ。5.8.0までは特定の順序で取り出されていたのを、
5.8.1以降で変わるようにしたんだ。

URLリンク(perldoc.perl.org)
> Since Perl 5.8.1 the ordering is different even between different runs of Perl
> for security reasons (see "Algorithmic Complexity Attacks" in perlsec).

URLリンク(perldoc.perl.org)
URLリンク(perldoc.jp)

804:デフォルトの名無しさん
09/10/12 03:59:09
セキュリティが理由なら、止めてしまう訳ないしな

805:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/13 06:03:32
コルーチン


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