2012.03.01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

MHI 5.0

この「にっき」には暴力シーンやグロテスクな表現が含まれています。

(2012.03.02)

$ ファイル表示の実装に見る言語文法の特徴

ちょっと気分転換に

- Perl

open(my $fp,'<','foo.pl') or die;
while( <$fp> ){
    print $_;
}
close $fp;
  • 明示的な open/close が必要

- Ruby

IO.foreach('foo.rb') do |line|
    print line
end
  • 自動オープン/クローズ
  • イタレータの文法が特徴的

- AWK (ただし、gawk/nawk)

BEGIN{
    while( getline < "foo.awk" ){
        print $0
    }
    close("foo.awk")
}
  • open と read が一体化しているという変わった文法 (個人的には嫌いではない)
  • close は省略できるが、スクリプト終了まで開きっぱなしになる。

- Python

with open("foo.py") as fp:
    for line in fp:
        print line,
  • with の文法が若干ださく感じる
  • print 文をそのまま使ってしまうと、改行コードを二重に付けてしまう
    • そのため、カンマで改行を抑制
    • 本来は sys.stdout.write(line) を使うべきなのでしょうな

- Lua

for line in io.lines("foo.lua") do
    print(line)
end
  • 自動オープン/クローズ
  • 最もシンプルかつオーソドックス

tyru PerlはIO::File使うとclose()必要なくなりますね。
my $fp = IO::File->new('foo.pl') or die; (2012/03/11 06:10:38)

はやま ふぅむ。ありがとうございます。$fp の有効範囲を抜けるタイミングでクローズされるのでしょうか (2012/03/11 20:05:23)

tyru そうです。

具体的にはPerlのblessされたオブジェクトがスコープを抜けるとblessで関連付けられたクラスのDESTROY()が呼ばれます。(C++のデストラクタと一緒ですね)
この場合はIO::File::DESTROY()です。
実際はおそらく基底クラスで実装されてると思いますが。

また、ちなみにPerlのGCは参照カウンタなので「スコープを抜けるタイミング = GCされるタイミング」で呼ばれます。

{
my $fp = IO::File->new('foo.pl') or die;
# ここで$fp->close()が呼ばれる
} (2012/03/12 00:55:17)

はやま なるほど! マークアンドスイープじゃないから、デストラクタはただちに呼ばれるというわけですか。勉強になりました。ありがとうございます! (2012/03/12 05:12:28)

(2012.02.27) | (2012.03.11)

.net(3) C++(3) Cygwin(12) GAME(3) Groovy(1) Linux(2) Lua(39) Mercurial(13) NYAOS(92) OS/2(7) Oracle(3) Perl(4) Python(22) SKK(4) Windows8(1) album(68) ckw(10) coLinux(1) vim(6) wifky(27) 書評(21) (9)

zetamattaのたいじゅー