1

IO::File#METHODSで説明されている組み込みopen関数、基本的な Perl の open 演算子、および 3 引数の open 演算子はすべて同じ関数ですか?

4

1 に答える 1

6

はいといいえ。

open組み込みについては、 で説明されていますperldoc -f open。この関数は、実際のテキスト指向の作業を行うのに適しています。入力ストリームの自動デコーディングまたはエンコーディングを行うために、PerlIO レイヤーを使用できます。

Perl には、 と呼ばれるファイルを開く別の方法がありますsysopen。これは基本的に C の非常に薄いラッパーfdopenであり、すべての落とし穴と問題があります。Perlでは、sysopenのように呼ばれます

sysopen FILEHANDLE, FILENAME, MODE[, PERMS]

現在、IO::Fileファイルを開くためのオブジェクト指向インターフェイスを提供し、 から継承していIO::Handleます。open メソッドには次のコード含まれます。

sub open {
  @_ >= 2 && @_ <= 4 or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])';
  my ($fh, $file) = @_;
  if (@_ > 2) {
    my ($mode, $perms) = @_[2, 3];
    if ($mode =~ /^\d+$/) {
      defined $perms or $perms = 0666;
      return sysopen($fh, $file, $mode, $perms);
    } elsif ($mode =~ /:/) {
      return open($fh, $mode, $file) if @_ == 3;
      croak 'usage: $fh->open(FILENAME, IOLAYERS)';
    } else {
      return open($fh, IO::Handle::_open_mode_string($mode), $file);
    }
  }
  open($fh, $file);
}

ご覧のとおり、これは and のラッパーopensysopenあるため、このメソッドはコアと同一ではないと言っても過言ではありませんopen;-) また、ドキュメント (リンク先) にはそう記載されています。

于 2013-01-06T15:18:11.280 に答える