敢えて言おう,Perl 怖い

以前から Perl は苦手なのですが,久しぶりに使ってみて,相変わらず苦手なことが良く分かりました.普段 C++ を使っているため,書式が大きく異なる Perl は使いにくいと感じているのだと思います.どちらかというと,Python の方が使いやすく感じます.アッサリ味で….

特徴的な記号の使い方が原因でしょうか.今回は,ファイルハンドルを受け取るメソッドに型グラブを使いながら「型グラブってなんやねん」というツッコミを入れてみたり,print を使いながらファイルハンドルの後ろにコンマがないことを気にしたりしていました.どうにも,細かいところが気になってしまいます.


今日はウェブコーパスのエントリを読み出すためのモジュールを作成していたのですが,どういう書き方が適切なのか判断できなくて困りました.自由度の高さが良い方向に働くとは限らないということですね.

package WebArchive::Entry;

sub new
{
  my $class = shift;
  my $self = {
    url_ => "",
    status_code_ => 0,
    header_ => "",
    body_ => "",
  };
  return bless $self, $class;
}

sub url
{
  my $self = shift;
  return $self->{url_};
}

sub status_code
{
  my $self = shift;
  return $self->{status_code_};
}

sub header
{
  my $self = shift;
  return $self->{header_};
}

sub body
{
  my $self = shift;
  return $self->{body_};
}

sub read
{
  my $self = shift;
  local(*file_handle) = shift;

  $self->{url_} = <file_handle> or return 0;
  chomp($self->{url_});

  $self->{status_code_} = <file_handle> or return 0;
  chomp($self->{status_code_});

  my $header_length = <file_handle>;
  if ($header_length != 0) {
    read(file_handle, $self->{header_}, $header_length) or return 0;
  }
  else {
    $self->{header_} = ""
  }

  my $body_length = <file_handle>;
  if ($body_length != 0) {
    read(file_handle, $self->{body_}, $body_length) or return 0;
  }
  else {
    $self->{body_} = ""
  }

  return 1;
}

sub write
{
  my $self = shift;
  local(*file_handle) = shift;

  print file_handle $self->url(), "\n";
  print file_handle $self->status_code(), "\n";
  print file_handle length($self->header()), "\n", $self->header();
  print file_handle length($self->body()), "\n", $self->body();
}

1;