タグ

ブックマーク / fbis.hatenablog.com (17)

  • List::MoreUtilsのuniq関数の実装が変わってた件 - Unknown::Programming

    大分昔に書いたHashを使って配列をユニークにしようという記事のブコメにてList::MoreUtilsのuniq関数の実装が変わったというコメントを頂きました。 List::MoreUtils 0.25_02 では少々変更されていた。 http://cpansearch.perl.org/src/VPARSEVAL/List-MoreUtils-0.25_02/lib/List/MoreUtils.pm はてなブックマーク - kitsのブックマーク / 2009年11月17日 さっそくどう変わったのか確認したところ、なんともアンビリーバボーな実装になってました。 # List::MoreUtils-0.22 sub uniq (@) { my %h; map { $h{$_}++ == 0 ? $_ : () } @_; } # List::MoreUtils-0.25_02 sub

    List::MoreUtilsのuniq関数の実装が変わってた件 - Unknown::Programming
  • PHP初心者でも簡単にPerlに移行するための妙妙案 - Unknown::Programming

    PHPが何で扱いやすいかわかったよ!PHPタグに真理があったんだよ! <html> <body> <?php $name = "fbis" ?> 僕の名前は<?php print $name; ?>です。 年齢は<?php print $_REQUEST['age']; ?>歳です。 </body> </html> これだけで動くんだもんそりゃ便利だし分かりやすいよ。 なのでPerlでもPHPタグ使えるようにしてみました。 package PHP::Block; use strict; use warnings; use Module::Compile -base; sub conver_print { my $str = shift; return '' unless $str; $str =~ s{\x27}{\x5C\x27}g; $str = ';header() if @_HEA

    PHP初心者でも簡単にPerlに移行するための妙妙案 - Unknown::Programming
  • UNIVERSAL::cantなるものを触ってみた - Unknown::Programming

    ぼへーっとCPANのRSS眺めてたらUNIVERSAL::cantとかいうが目に付いたのでさっそく触ってみた。 以下概要のまんまだけど例。 if ( $obj->cant('hoge') ) { # hogeメソッドが存在しない } else { # hogeメソッドが存在する } つまりcanメソッドと逆の動きをするわけですね。へー。 メソッドが存在しないときを明示的に判定できるわけです。なるほどね。 ちなみにcant()だけじゃなくcan't()でも呼び出せます。これはシングルクォートが::と同じだということを利用しているわけですね。 ってことは勝手にcanパッケージにtメソッドを定義してることになるんでちょっと微妙といえば微妙なんですがまぁカブることもないだろうし見栄え的にいい感じなのでいいんじゃないでしょうか。 あとですね、来のcanメソッドは戻り値に関数のリファレンスを返してく

    UNIVERSAL::cantなるものを触ってみた - Unknown::Programming
  • PHP「"0x0A" == "10"はTRUEですがよろしいですか」 - Unknown::Programming

    ぼく「えっ」 PHP「"0x0A" == "10"はTRUEになりますが」 ぼく「いえFALSEです」 PHP「えっ」 ぼく「えっ」 PHP「まだ比較したことがないということでしょうか」 ぼく「えっ」 PHP「えっ」 ぼく「変化するってことですか」 PHP「なにがですか」 ぼく「型が」 PHP「ああ文字列でも整数っぽい文字列なら自動で型変換されますよ」 ぼく「そうなんだすごい」 PHP「では比較いたしましょうかTRUEですよ」 ぼく「でも"0x0A"は明示的にキャストしたら0になりますよね」 PHP「えっ」 ぼく「えっ」 PHP「ああ16進数のことなら比較の場合のみ10進数に自動で変換してから比較するんですよ」 ぼく「なにそれこわい」 PHP「"0x0A" == "+000010.0000000000000001"の場合もTRUEになります」 ぼく「なにそれもこわい」 PHP「えっ」 ぼく

    PHP「"0x0A" == "10"はTRUEですがよろしいですか」 - Unknown::Programming
    tyru
    tyru 2009/06/18
  • Perlにおける定数宣言(constant or Readonly or Attribute::Constant) - Unknown::Programming

    正直言いますと、個人的には定数って殆ど使わないんですよね。 昔はちょこちょこ使ってたんですが、最近は定数となりうる物は基的にYAML等外部ファイルに持たせて変更可能にすることが多いのでまったく使ってません。 ですがそれでもPerlで定数を使いたい時にはどーすんの?っていう時のために軽くここにまとめておきます。 言わずもかなPerl5.8にはconstantという定数を定義できる標準モジュールがあります。 use strict; use constant PI => 3.14; # 表示 print PI; # 3.14 # 上書きしようとすると・・・ PI = 3; # Can't modify constant item in scalar assignment とこのように上書きしようとするとエラーを吐いて死にます。 しかも実行時ではなく、コンパイル時にエラーを吐きます。 実はこのc

    Perlにおける定数宣言(constant or Readonly or Attribute::Constant) - Unknown::Programming
  • Path::Class::Dir-0.16のchildrenが「0」で止まる件 - Unknown::Programming

    ブログにお絵かきなんてものが増えてたので喜び勇んで描いてみた。 って前からあったっけ? タイトルまんまなんだけども、children呼ぶときの対象のディレクトリ以下に「0」って言う名前のファイル(もしくはディレクトリ)が存在してるとディレクトリ一覧が取れないのです。 コード見てみたら一目瞭然、IO::Dirのreadをwhileでぐーるぐるしてるわけですが、終了の判定を単なる真偽値で行っているため「0」というファイルがあっちゃうとそこで止まってしまうというわけです。こーゆー場合はちゃんとdefined関数使わないとね。 以下パッチ。 --- Dir.pm Fri Apr 17 18:23:50 2009 +++ newDir.pm Fri Apr 17 18:36:21 2009 @@ -164,7 +164,7 @@ my $dh = $self->open or Carp::croak

    Path::Class::Dir-0.16のchildrenが「0」で止まる件 - Unknown::Programming
  • ランダムな文字列を生成するString::Random - Unknown::Programming

    普段から良く使うんでメモ。 DBとかにユニークな値を突っ込む時とかにランダム文字列生成とかよくあること。 で、Perlでランダム文字列を生成しようと思ったらString::Randomがオススメ。 色々作り方があるんだけど一番便利なのはrandregexメソッド。 use String::Random; my $rand_str = String::Random->new->randregex('[A-Za-z0-9]{32}'); こんな感じで正規表現が指定できるので上記のように書くと32桁の英数字でランダムな文字列を生成してくれる。 ちなみにDBに突っ込む目的ならDBIx::Class::RandomStringColumnsってのがString::Randam使用して勝手に突っ込んでくれたりするので便利だったりする。

    ランダムな文字列を生成するString::Random - Unknown::Programming
  • mapと非破壊 - Unknown::Programming

    http://d.hatena.ne.jp/kazukichop/20080124/1201146190 Perl分かってない - Lism.in * blog - nekoya (id:studio-m) あんまり元記事とカンケイなかったりするけど、一応。 print join "\n" , map { s/a/A/g; $_ } @list; この書き方は@listを破壊してしまう。 無論、破壊されても構わない場合はこれでもいいが、mapを使っているということは基的には破壊されたくないはずだ。(でしょでしょ?) 破壊させる目的ならば個人的にはforeachを使う方がいいと思ってる。 s/a/A/g foreach @list; print join "\n" , @list; ま、それでもmapを使って値を変更しつつ@listを破壊したくないのであれば print join "\n"

    mapと非破壊 - Unknown::Programming
  • Unknown::Programming - 何故Perlなのか。

    なんで僕はこうもPerlが好きなんだろう。 そして何故PHPが好きになれないんだろう。 前に「PHPがどうにも好きになれない理由 - Unknown::Programming」というエントリを書いたけど、なんていうかもしあの不満点が全部解決したとしてもおそらくPerl程好きになることは無いと思う。 やっぱり良くも悪くも初めて真面目に取り組んだのがPerlという言語だったからなのかなぁ。 専門学校時代にはC,C++,VBをやった。会社入ってからはJava(iアプリ)をちょっとやった後にWEBアプリケーション開発にまわされた。 そこで初めてPerlを触った。 初めて触った時には「なんだこのクソ言語」と思ったものだ。 Perlでやった初めての仕事は地獄だった。当に辛かった。 水も何も持たずに砂漠のど真ん中にいきなり放置されたような感じだった。 まず誰も何も教えてくれなかった。先輩は皆忙しそうで

    Unknown::Programming - 何故Perlなのか。
  • Perl Quizで遊んでみる - Unknown::Programming

    Perl Quiz - package名について - Islands in the byte stream #!perl -w use strict; use Test::More 'no_plan'; sub f{ package main::Foo; } f(); is ref(bless({}, 'Foo')), 'Foo'; とか #!perl -w use strict; use Test::More 'no_plan'; sub f{ package Foo; our @ISA = ('Foo'); } f(); is ref(bless({}, 'Foo')), 'Foo'; 死ぬのは無し?でもf関数で死ぬわけじゃないから有り? #!perl -w use strict; use Test::More 'no_plan'; sub f{ }__END__ } f(); is

    Perl Quizで遊んでみる - Unknown::Programming
  • Perl Internalsについて - Unknown::Programming

    実は、Perl 5.8以降では、Internals::SvREADONLY()という関数がuseなしで使えるようになっていて、Internals::SvREADONLY($scalar, 1)で$scalarをREADONLY flagをonに、Internals::SvREADONLY($scalar, 0)でoffにできます。 404 Blog Not Found:perl - Const released -- True Readonly SUGEEEE、ってかそんなのあるなんて知らなかった。まぢで?まぢで?早速試してみた。 my $foo = 10; Internals::SvREADONLY($foo, 1); eval { $foo = 'WRYYYYYY' }; # エラーになるはず print $@ ? "error! $@" : 'not error!'; Interna

    Perl Internalsについて - Unknown::Programming
    tyru
    tyru 2009/03/10
    変数をreadonlyに出来るInternals::SvREADONLYについて
  • 複数同時にlocal化したいばやい - Unknown::Programming

    あけましておめでとうございます、ってもう2月かよ! 今日は物凄くどうでも良くて、凄まじく応用範囲の狭い小ネタでも提供します。 %SIGに同じ関数登録しようとして、 local $SIG{$_} = sub {...} for qw/INT TERM ALRM .../; みたいなことをしたんだが。うまくいかなかった。 どうも、後置forの前は見えないスコープがあるようだ。localが効いてない。 後置ループにもスコープがある? - Practice of Programming ということで、あるデータを複数同時にlocal化したいようなばやいについてです。 my @key = qw/INT TERM ALRM/; my $sub = sub {}; { local @SIG{@key} = ($sub) x @key; # ローカル化されるお! } あとmapとか使えば色々な初期値を入れ

    複数同時にlocal化したいばやい - Unknown::Programming
  • 型グロブとシンボリックリファレンスでメソッド定義するときの注意点 - Unknown::Programming

    型グロブとシンボリックリファレンスを使ってメソッドを動的に定義するというケースって結構あります。 例えばアクセサメソッドを提供するmk_accessorというのを作りたいとします。 package Hoge; use strict; sub mk_accessor { my $class = shift; my $accessor = shift; no strict 'refs'; *{"${class}::$accessor"} = sub { my $self = shift; $self->{$accessor} = shift if @_; return $self->{$accessor}; }; } sub new { my $class = shift; return bless {} , ref $class || $class; } Hoge->mk_accessor(

    型グロブとシンボリックリファレンスでメソッド定義するときの注意点 - Unknown::Programming
  • whileでファイルハンドルをループする時の暗黙の$_について - Unknown::Programming

    こんな記事をみつけた。 Perlプログラムをコンパクトに記述する方法 - builder by ZDNet Japan 短く書けてPerlってすげーんだよ的な記事でまぁそれはそれでいいんだけどこういう場合はデメリットもちゃんと説明すべきかと。 というのも上記記事にこういうコードがあったのです。 while (<STDIN>) { print $_; } $_を使うことによって「while( $line = ) {}」と書くよりも短く書けて良いっちゃ良いんですが、このコードにはバグが含まれています。 whileでの暗黙の$_はローカル化されないのです。コレ超重要。 つまり、 $_ = 100; while ( <STDIN> ) { print $_; } print $_; こう書くと$_に格納してた100が上書きされてしまうので、whileを抜けたあとに$_を参照しても100という値は消

    whileでファイルハンドルをループする時の暗黙の$_について - Unknown::Programming
  • URIモジュールのメモ - Unknown::Programming

    各種メソッドの挙動。 use URI; use Data::Dumper; sub p { local $Data::Dumper::Indent = 1; print $_[0]; print Dumper($_[1]); } my $url = 'http://example.com/foo/bar/00000.html?uid=aaaa&hoge=あああ'; my $uri = URI->new($url); p 'scheme :',$uri->scheme; p 'opaque :',$uri->opaque; p 'path :',$uri->path; p 'fragment :',$uri->fragment ; p 'as_string :',$uri->as_string; p 'canonical :',$uri->canonical; p 'authority :'

    URIモジュールのメモ - Unknown::Programming
  • お世話になったPerl本のまとめ - Unknown::Programming

    僕が今までPerlの勉強、及び学習のために利用したPerl関連の書物についてのまとめをば書いてみます。 Perlデバッグ明快技法 作者: Martin Brown,岡田長治出版社/メーカー: オーム社発売日: 2001/05メディア: 単行 クリック: 1回この商品を含むブログ (4件) を見る まずは僕が始めて購入したPerl。 会社に置いてあったラクダをざっと一通り読み終わったときになんか自分でもが欲しいなと思ってたときに見つけた。 バグやエラーに対する心構えやstrictとwarningsの詳細な使い方と説明、シグナルハンドラについて色々と学ぶところがあって良かった。あとはプロファイラについての説明が熱くてこれを知った当時はプロファイラ使っていろんなプログラムの負荷テストとやってみたりしたもんだ。 最後に付録として診断(エラー)メッセージもついててナイス。 そういや診断メッ

    お世話になったPerl本のまとめ - Unknown::Programming
  • Perlが初めての人に教えてあげたいちょっとしたこと - Unknown::Programming

    タイトルは釣りです。 実際のタイトルは「Perlのオブジェクト指向がムズカシイだって?んなバカな。だったらPHPで再現してやんよ!」でございます。 ヘイヘイヘイ。そこの君。Perlのオブジェクト指向が難しいだなんていったい誰が言ったんだい? Perlのオブジェクト指向ほど、シンプル且つ柔軟なものはないよ! 単なるパッケージ(名前空間)とリファレンス(データ)をblessという関数で紐付けただけのもなんだから。 第一引数に必ず$selfが来るっていうのも結局の話たんなる関数呼び出しとなんら変わらないのだから。 package Foo; sub new { my $class = shift; return bless { @_ } , ref $class || $class; } sub plus { my $self = shift; my $int = shift; return $s

    Perlが初めての人に教えてあげたいちょっとしたこと - Unknown::Programming
  • 1