- 1 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 21:17:36 ]
- "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/02/09 現在の最新版: 5.10.0 ▼ 前スレ Perlについての質問箱 38箱目 pc11.2ch.net/test/read.cgi/tech/1221967332/ リンク集は >>2-3 Perl 日本語処理の基礎の基礎 >>4 過去スレは >>5-6 あたり
- 116 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 03:18:46 ]
- >>106
>switch.layer3.asia が稼動してる際に SNMPv2c の一般的な読み取りコミュニティ名で >リクエストを送ると、どこかのツリーの下に私の携帯電話番号が現れますよ layer3.asia/ 痛いw
- 117 名前:デフォルトの名無しさん [2009/02/24(火) 03:02:56 ]
- perlに限った事じゃないかも知れない(前置き)
klassというのをたまに見掛けるけど、これはどういった意図で使ってるの? ある程度の頻度で見掛けるので、一定の合意があるのかと思って聞いてみました。
- 118 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 03:29:04 ]
- classが予約語の言語でclassの類似物を作った場合とか
funktionなんてのもよく見るね
- 119 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 13:22:48 ]
- フォームから読み出したデータを処理したいのです。
読み出したデータの名前はa1からa10までで、それを$a1から$a10に入れたいのですが、 $form = new CGI; $a1 = $form -> param('a1'); $a2 = $form -> param('a2'); …と、a10まで順番に書いていかなければならないんでしょうか。 すっきりした書き方があれば、教えて下さい。
- 120 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 13:25:44 ]
- >>119
そもそも変数名に通し番号をつけるセンスをなんとかすべきだな。 配列使えよ。
- 121 名前:デフォルトの名無しさん [2009/02/24(火) 13:32:09 ]
- $form = new CGI;
foreach(0..10){push(@a, $form->param('a' . $_))} でいいんじゃね?ゼロからだけど@aの添え字にあわせるため。
- 122 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 14:00:14 ]
- >>119
${"a$_"} = $form->param("a$_") for 1..10;
- 123 名前:デフォルトの名無しさん [2009/02/24(火) 14:13:51 ]
- 変態が好きなら0-9にしようぜ
push(@a,$form->param($_))for a0..a9;
- 124 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 14:23:55 ]
- というか、パラメタにつく数字は2桁超えるならa00-a10と言う風に桁をそろえようぜ。
ソートする時とか上のような技法が使えないから。
- 125 名前:119 mailto:sage [2009/02/24(火) 14:41:12 ]
- >>120-124
配列なんて考えもしませんでした…思いついたところで、 今度は「配列に入れたいんですが」と泣きついていたように思いますが。 桁数にも気をつけます。 ありがとうございました。
- 126 名前:デフォルトの名無しさん [2009/02/24(火) 14:45:13 ]
- >>124
ラマ本は買った? www.amazon.co.jp/dp/4900900818 昔のラマ本の方が分かりやすかったな・・・。
- 127 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 14:45:31 ]
- >>125
- 128 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 14:47:47 ]
- さらにごめん。さっきの中古本だった。3版になってるのね。
www.amazon.co.jp/dp/4873111269
- 129 名前:デフォルトの名無しさん [2009/02/24(火) 17:06:30 ]
- BigFloatで以下などが正確に計算出来ないのですが、何故なのでしょうか?
print Math::BigFloat->new('436611485')->fdiv('2074', 3)->bstr, "\n"; # 211000 と表示されてしまう
- 130 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 17:24:37 ]
- つprint Math::BigFloat->new('436611485')->bdiv('2074')->bstr, "\n";
fdivじゃなくてbdivだよな。bdivの二番目の引数は精度だから精度3桁で計算合ってるよ。
- 131 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 18:44:14 ]
- jcode(ver 2.7) で誰か知ってたらおしえてください。
utf8の文字列(フラグ付き)で、 'あ' という文字を 650字程度より 多い状態で、sjis に変換すると 途中から、????? と文字化けします。 Jcode.pm ってバイト数の制限があるのでしょうか。 どなたか知っていたら教えてください。
- 132 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 18:54:10 ]
- >>131
とりあえずざっと目通した? search.cpan.org/~dankogai/Jcode-2.07/Jcode.pm search.cpan.org/~dankogai/Encode-2.31/Encode.pm
- 133 名前:デフォルトの名無しさん [2009/02/24(火) 23:21:18 ]
- Perlの実行エラー時に、エラーの発生したファイル名と行番号が表示されますが、
それに加えて、呼び出し元(さらに呼び出し元の呼び出し元なども)の関数を表示できるような機能ってありますか? &aaa(); sub aaa{ &bbb(); } sub bbb{ &ccc(); } sub ccc{ &ddd(); } #ここでエラー たとえば、上のようなプログラムで、関数 ddd が定義されていないとき、 「Undefined subroutine &main::ddd called at test.pl line XX.」というエラーが出ますが、 このエラーの呼び出し元が bbb でさらにその呼び出し元が aaa であることが エラーメッセージで表示されると助かります。
- 134 名前:デフォルトの名無しさん [2009/02/24(火) 23:52:07 ]
- anond.hatelabo.jp/20080822142610
ここにプログラムがありますが、これを実行するために 1.必要なもの 2.(1.)が揃ったらやること をざっと教えてください。
- 135 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:57:57 ]
- >133
自前でエラー出すなら perldoc carp 参照。 そうじゃなきゃ、perl -d hoge.pl でデバッガ上で実行すれば?
- 136 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:06:54 ]
- >>134
増田に聞けば? はてなでもいいけど とりあえず自分がどこまで理解しているのかくらいは書けよ 環境とか
- 137 名前:デフォルトの名無しさん [2009/02/25(水) 00:13:10 ]
- >>136
すんません プログラミング経験はありません 環境はwindows vistaです
- 138 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:26:05 ]
- >>134
> anond.hatelabo.jp/20080822142610 > ここにプログラムがありますが、これを実行するために > 1.必要なもの それを実行するために何が必要で、何をやればいいのかがわかるだけの知識。
- 139 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:26:18 ]
- >>136
それ書けば質問に答えられるのか?
- 140 名前:デフォルトの名無しさん [2009/02/25(水) 00:31:02 ]
- >>138
その知識を分けてください >>139 もしかしたら>>134の1,2,の回答だけじゃ俺には無理かもしれないけど 最低限それだけあれば頑張れそうな気がする 要するにエロい思いしたいからです。
- 141 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:32:54 ]
- えっちなのはいけないと思います。
- 142 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:33:20 ]
- 正直者め
- 143 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 03:22:27 ]
- >>140
ここ見て、知らない単語はぐぐれ。 ttp://www.moongift.jp/2008/06/strawberry_perl/ 英語読めるなら ttp://win32.perl.org/wiki/
- 144 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 13:44:59 ]
- >>140
プログラミング自体が初めてなら、こうゆう本から始めたほうがいいかもな。 books.livedoor.com/item/379362 Perlとは何か、プログラムとは何か、というところから始まってるから。 ただ、オレ自身はこの本を読んだことはないが。
- 145 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 19:34:10 ]
- ワラタw何という見当外れな回答
その上、読んでない本すすめてるし ちょっと興味もって調べたら著者はこぼら
- 146 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:35:21 ]
- 4Uは、Gigazineの記事を読んだだけでスルーしてたけど、二次元版も出来てたんだな
さっそく登録した
- 147 名前:デフォルトの名無しさん [2009/02/26(木) 06:13:13 ]
- Sort::Fields - 区切られたフィールドを持つ行のソート
fleur.hio.jp/perldoc/mix/Fields.ja.html フィールドソートをしたいのですが、 use Sort::Fields; これを書くとエラーになります。インストール先ディレクトリをみると sort.pmやfields.pmがperl本体と同じディレクトリに置かれています。 本来は perl本体のディレクトリ直下から /sort/の下に存在するべき物でしょうか? インストール場所が悪いと手直しをお客に依頼する必要があるのですが、 作業は大変でしょうか? 環境はlinux Red Hatなのでsortで頑張った方が良いですか? sort に詳しくありません。
- 148 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 06:21:09 ]
- 「エラーになります」
大爆笑
- 149 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 06:59:30 ]
- ぞっとした
- 150 名前:デフォルトの名無しさん [2009/02/26(木) 09:21:40 ]
- みんなで仲良くねF
- 151 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 10:15:42 ]
- >>147
確かにuse Sort::Fieldsがアクセスするのは"[モジュールの検索パス]/Sort/Fields.pm"(大文字小文字の区別有り)だと思うけど、 なんかファイル名が小文字でperl本体と同居してるとかなってるなら もはやカオスとしか言いようが無い。 CPAN行ってインストールをやり直した方がマシじゃね。 もちろん、使うコマンドは"perl -MCPAN -e shell"で。
- 152 名前:デフォルトの名無しさん [2009/02/26(木) 10:27:07 ]
- sortで出来るかどうかもわからないなら、もはやらくだ本からやり直してもらうしかない。
第三フィールドでソートしたいとかなら配列の配列使えば出来るよ。
- 153 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 10:46:46 ]
- >>151
バカに引っ張られて自分もバカになるなよ。
- 154 名前:デフォルトの名無しさん [2009/02/26(木) 13:04:39 ]
- 正規表現スレとどっちかと思ったんですが、perlで組んでいるので
ひとまずこっちに質問させてください。 XMLっぽいタグを解析してるんですが、 <AAA BBB=CCC> にマッチさせるのに /<.*?>/ と書いています。一応これでマッチするのですが、CCCに例えば <AAA BBB="XXX>=YYY"> のような大小比較式がダブルクオートで囲まれて入っている場合があって、 このときは上の書き方だと <AAA BBB="XXX> にマッチしてしまいます。ダブルクオート内を無視して<〜>にマッチさせる にはどう書けば良いのでしょうか? よろしくお願いします。
- 155 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 13:17:12 ]
- 誰かがゴリゴリ書いてるだろうと想像して傍観。"....\"...."とかは許されるんだっけ?
- 156 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 13:21:26 ]
- XML タグ 正規表現
でググったら変態正規表現がけっこうヒットするな。
- 157 名前:154 mailto:sage [2009/02/26(木) 13:34:51 ]
- ども
- 158 名前:デフォルトの名無しさん [2009/02/26(木) 17:04:37 ]
- 誰もゴリゴリ書かなかったな。
/(<[^>"]*?(?:(?:".*?){2}|)>)/
- 159 名前:147 mailto:sage [2009/02/26(木) 22:26:27 ]
- >>151
>use Sort::Fields >"[モジュールの検索パス]/Sort/Fields.pm"(大文字小文字の区別有り) やっぱりそうでしたか。 エラーにはperlのインストール環境と思われるパスが出力されました。 >なんかファイル名が小文字でperl本体と同居してる 今日も確認しましたが、小文字でperl本体と同居になっていました。 お客の環境を使っているので、指摘や説明をするのが大変なので諦めます。 有り難うございました。
- 160 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 07:35:19 ]
- 全力でスルーしてたが…
sort.pm, fields.pm => pragma Sort::Fields => 外部モジュール 「人間はタマゴから生まれる」レベルの気違い理論を展開してる事に気付け。
- 161 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 07:40:21 ]
- よくそれで仕事にしてるよな・・・。
- 162 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 07:58:04 ]
- がまんしてスルーして
- 163 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 11:24:32 ]
- Windows 2000 / XPでは$SIG{'QUIT'}を設定することで、Windowsのシャットダウン時に
終了処理ができたんですが、Vistaでは終了処理が実行されずに、問答無用で停止し ているようです。Vistaで終了処理を実行するヒント等、ありますでしょうか? ActivePerl 1004で、以下のようなスクリプトでテストしています。 $SIG{INT} = $SIG{HUP} = $SIG{TERM} = $SIG{KILL} = $SIG{QUIT} = sub { # 終了処理 } while (1){ print "a"; sleep 1; }
- 164 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 17:07:51 ]
- ループでひとつの配列を使いまわしているのですが、次のループ時も前のループのときの配列のデータが残っていて都合が悪いです
配列を空っぽにする方法はありますか?
- 165 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 17:13:02 ]
- >>164
@a = ();
- 166 名前:164 mailto:sage [2009/02/27(金) 17:31:23 ]
- ありがとうございました
うまく空っぽにすることができました
- 167 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 17:35:31 ]
- >>166
できれば仕組みも理解してね。応用利くから。
- 168 名前:デフォルトの名無しさん [2009/02/28(土) 23:31:59 ]
- 複数のテキストファイルから1行目だけを抜き出すスクリプトって
かけないでしょうか。
- 169 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 23:37:29 ]
- >>168
#!/usr/bin/perl foreach my $fn (@ARGV){ open my $fp, "<", $fn; print scalar(<$fp>); }
- 170 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 23:39:31 ]
- >>168
書けるよ
- 171 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 23:43:38 ]
- >>169が回答出してるのに「書けるよ」と自慢げに一行レスする>>170
- 172 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:10:02 ]
- >>168
書けるよ
- 173 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:10:14 ]
- >>171
いやん
- 174 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:11:00 ]
- ところで、headコマンドつかっちゃダメなの?pure perlでやらなくちゃダメなの?
- 175 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:21:22 ]
- >>169
まだ冗長だね。 #!/usr/bin/perl while(<>){ print $_; close(ARGV); }
- 176 名前: ◆TWARamEjuA mailto:sage [2009/03/01(日) 00:30:41 BE:2723055-BRZ(10000)]
- え?
- 177 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:40:57 ]
- PERLっていくら学んでも知らない書き方が出てくるな・・w
>>175 close(ARGV)ってclose($ARGV)やclose(@ARGV)とはどう違うん? とりあえず、printの後の$_は省略出来るぜ
- 178 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:45:08 ]
- >>175
おお、d>printの後の$_ close(ARGV)はコマンドラインで指定されたファイルのうち今開いてるファイルを閉じる。 次の<>では次のファイルを開く。
- 179 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:52:04 ]
- #!/usr/bin/perl -n
print ; close ARGV;
- 180 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 01:17:03 ]
- % perl -ne 'print;close ARGV'
- 181 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 01:23:46 ]
- perl -pe 'close ARGV' *
- 182 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 01:32:22 ]
- perl -pe'close ARGV' *
- 183 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 01:57:48 ]
- head -n 1 -q *
- 184 名前:デフォルトの名無しさん [2009/03/01(日) 08:33:59 ]
- #!/usr/local/bin/radin;
print $musabetsutero;
- 185 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 10:38:53 ]
- >>184
いつのネタだよ。ったく。
- 186 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 10:42:21 ]
- >>181
先にcloseしちゃうからダメじゃん。
- 187 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 11:04:56 ]
- >>186
closeする前に1行分が読み込まれてるから大丈夫。
- 188 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 11:13:47 ]
- >>187
あ、そか。さんくす。
- 189 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:05:50 ]
- 日本語でおk
- 190 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:12:36 ]
- openで開くファイル名に使えない文字コードってありますか?
Shift-jisでスクリプトを書いていてShift-jisのファイル名でファイルを作成しようとするとエラーは出ないのですがファイルが作成できません 英数字のファイル名だとファイルが作成できます
- 191 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:16:16 ]
- >>190
システムがShift-JISのファイル名に対応してなかったら当然作れない。 あと""で囲むとメタ文字が発動するかもな。
- 192 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:28:07 ]
- 使用環境はWindows+ActivePer5.10.0lです
$file = "テスト"; open FH, ">$file"; →失敗 open FH, '>$file'; →書き込めるが当然変数展開がされない open FH, ">テスト"; →成功 open FH, '>テスト'; →成功 ファイル名を変数を使わずに直接記述するとうまくいきました 変数に格納されている文字列の形式がおかしいのかな…
- 193 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:35:19 ]
- >>192
調べてないけど、2回""で囲ってるからメタ文字が二度発動してるんだと思われ。
- 194 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:37:40 ]
- まあ、Shift_JIS文字列はいかなる場合でもメタ文字に気をつけるのが吉。
ダメ文字という言葉は知っておいた方がいい。
- 195 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 13:24:19 ]
- 時々ファイル名にもIOレイヤみたいな仕組みが欲しくなるね。
- 196 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 13:45:53 ]
- ダメ文字の対処法としてメジャーなのが
$a = '十\'; だと思うが、探すのもメンテも面倒だしなんかイラッとくるから、 $a = <<'EOF'; 十 EOF chop($a); とするようにしてる。
- 197 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 13:47:50 ]
- つーかそんな面倒なことしなくてもqwで何とかなるような気がしてきた。
昔はqwなかったからその時の流儀をそのまま使ってる。
- 198 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 13:53:03 ]
- あー久しぶりにこのコード書くなと思ったら、最近はUTF-8でコード書いて出力時変換だな。
連投スマソ
- 199 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 17:07:13 ]
- >>190-198 のような話題を解決するために
>>4のテンプレがあるのにな。
- 200 名前:190 mailto:sage [2009/03/01(日) 19:41:26 ]
- open ">$file";
ならファイルが作成できるんですが、 open ">$file.txt"にするとだめでした 事前に$file .= ".txt"; で文字結合してもだめでした
- 201 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 19:48:27 ]
- file="テスト"なんだよね?
ソースファイルのエンコーディングは何? もしSJISでなければSJISにしてみては?
- 202 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 19:49:52 ]
- ってSJISって書いてあった。すまん
- 203 名前:190 mailto:sage [2009/03/01(日) 19:53:45 ]
- ソースファイルのエンコーディングはSJISです
open ">テスト.txt";はできます 末尾に.txtを文字結合すると書き込めなくなるようです
- 204 名前:190 mailto:sage [2009/03/01(日) 20:00:43 ]
- Dumpしてみたら原因がわかりました
改行コードを含んでいたようです スレ汚し失礼しました
- 205 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:41:48 BE:1417729695-2BP(192)]
- Perrrrrrrrrrrrrrrrrrrrrrrrrrrrnrrrrrrl
- 206 名前:デフォルトの名無しさん [2009/03/03(火) 13:58:07 ]
- オブジェクト指向の勉強中なんだが…
my(%ch, $i); $i = 0; sub new{ my($pkg, $data) = @_; $ch{$i} = $data; my $self = {obj_num => $i ++}; return bless $self, $pkg; } sub DESTROY{ delete $ch{$_->{obj_num}}; } カプセル化ってこんな感じでいいの? 自分で動かした感じは問題なさそうだけど普通のオブジェクトとアクセサしか使えないだけで同じ動作する?
- 207 名前:1/2 mailto:sage [2009/03/03(火) 17:18:15 ]
- $iがゴニョゴニョとか$_って何よ?とかあるが…それを差し引いて
どのレベルでのカプセル化を言っとるんだ? その例だと、呼出元にて、$obj->{obj_num} = 10 ; とかしてobj_numに 直接代入可能だから、その点ではカプセル化されたとは言えん。 只、編集とか継承とかしない限りにおいて、$ch{$obj->{obj_num}} には アクセス出来ん事だけは確かだ。ゲッタねえし。 インサイドアウトオブジェクトレベルの意味ならば以下に簡単な例。 Hoge2は(恐らく)貴方の目指してた物をインサイドアウトで実現してる。 new時に投入した'hoge'がアクセサを介さず変えられるか?がポイント。 package Hoge; #=== カプセル前 === sub new { bless { data => pop }, shift ; } sub setter { shift->{data} = pop ; return ; } sub getter { shift->{data} } 1; package Hoge2; #=== カプセル後 === use Scalar::Util qw(refaddr) ; my %hash ; sub new { my $obj = bless \do{''}, shift ; $hash{ refaddr $obj } = shift ; $obj ;} sub getter { $hash{ refaddr shift} ; } sub setter { $hash{ refaddr shift} = pop ; return ; } sub DESTROY { delete $hash{ refaddr shift } ; } 1;
- 208 名前:2/2 mailto:sage [2009/03/03(火) 17:18:54 ]
- package main ; #=== 実行 ===
use Data::Dumper ; use Hoge; use Hoge2; my $obj = Hoge->new('hoge') ; print Dumper $obj ; # ほら丸見えだし、 $obj->setter('fuga') ; # 折角セッタでセットしても $obj->{data} = 'bar' ; # カプセル化出来てねえよ。 print $obj->getter . qq{\n} ; # ほらね、変えられちゃった my $obj2 = Hoge2->new('hoge') ; print Dumper $obj2 ; # bless先がdo{ }で弄り様もねえしなあ。 printf "%s\n", $obj2->getter; $obj2->setter('fuga') ; # 専用のセッタを用いて漸く変更可能。 printf "%s\n", $obj2->getter; #Hoge2を以下の様に書いてるサイト(有名所)もあるが、大ポカだから注意! #package Hoge2; #my %hash ; #sub new { my $obj = bless \do{''}, shift ; $hash{ $obj } = shift ; $obj ;} #sub getter { $hash{ shift } ; } #sub setter { $hash{ shift } = pop ; return ; } #sub DESTROY { delete $hash{ shift } ; } #1; 長文失礼
- 209 名前:デフォルトの名無しさん [2009/03/03(火) 19:46:08 ]
- >>207
それそれ、それ完璧 Scalar:Util の refaddr がよく分からんけど、Dumper に見てもらった限りだとオブジェクトごとに固有の数字を割り振ってくれる感じなのかな? とりあえずゲッターとセッター書いたのに、 使わなくても自由に書き換えできるなら書く意味ないじゃんってのが気持ち悪かったから、 それが解消できればよかった $iゴニョゴニョはrefaddrの代わりにオブジェクトごとに固有の数字を割り当てるために使ってたつもり $_はミスです 後でScalar::Utilについては色々詳しく調べてみます、丁寧にありがとう 助かりました
- 210 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 19:05:23 ]
- >>208
どこらへんが大ポカなの?
- 211 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 09:30:59 ]
- ゥーperlーパー
- 212 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 11:27:45 ]
- Perlかわいいよ
- 213 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 01:50:07 ]
- *Hoge::huga = /&hogehoge('hugahuga');
としたときに引数が設定されたメソッドが生えると思います ですが Hoge::huga('hogehoge'); としてもhogehogeは無視されるようです 設定した引数に加えて更に引数を追加する方法は無いでしょうか
- 214 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 04:47:47 ]
- >213
> *Hoge::huga = /&hogehoge('hugahuga'); > としたときに引数が設定されたメソッドが生えると思います 本当? > 設定した引数に加えて更に引数を追加する方法は無いでしょうか *Hoge::huga = sub { hogehoge('hugahuga', @_); };
- 215 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 12:31:20 ]
- >>213
つ Sub::Curry
- 216 名前:デフォルトの名無しさん [2009/03/07(土) 13:32:36 ]
- SUPERAntiSpywareでスキャンしていたら、
Adware.Vundo/Variant [ 4 items ] Files C:\PERL\LIB\AUTO\FCNTL\FCNTL.DLL C:\PERL\LIB\AUTO\LIST\UTIL\UTIL.DLL C:\PERL\LIB\AUTO\MIME\BASE64\BASE64.DLL C:\PERL\LIB\AUTO\SOCKET\SOCKET.DLL と検出されていました。 昔、perlをインストールした憶えはあるのですが、入れた経緯は忘れてしまいました。 これって誤検出ですよね? 誰かSUPERAntiSpyware入れてる方で、検出された方いますか?
|

|