4

私が抱えている問題は、WindowsXPのStrawberryperl5.12.3.0で次のコードを実行することで見つけることができます。

    #!/usr/bin/perl -w

    use strict;
    use warnings;
    use Win32::Unicode::File;
    use Encode;

    my $fname = shift @ARGV;

    my $fh = Win32::Unicode::File->new;
    if ($fh->open('<', $fname)){
      while (my $line = $fh->readline()){}
      close $fh;
    }else{
      print "Couldn't open file: $!\n";
    }

ここで起こっている唯一のことは、私がreadlineを実行し、Strawberryperlからメモリ不足エラーが発生するまでメモリを消費し続けることです。私は本当に大きなファイルを使用していますが、このコードはストリームベースであるため、問題にはなりません。ここで何かが足りないのですか、それともStrawberry perlのどこかにリークがありますか?ActivePerlでまったく同じコードをテストしましたが、正常に動作します。つまり、メモリを消費しません。

更新:Win32 :: Unicode :: Fileを通常のdiamond演算子に置き換えると、少なくとも私のディストリビューションでは機能するようです。次のコードを参照してください。

    use strict;
    use warnings;

    my $fname = shift @ARGV;

    if (open(my $fh, '<', $fname)){
      while (my $line = <$fh>){}
      close $fh;
    }else{ print "Couldn't open file: $!\n";}

だからそれは問題がWin32::Unicodeモジュールにあることを示唆しているでしょうか?

4

2 に答える 2

1

たぶん$/(または$ INPUT_RECORD_SEPARATOR)は改行ではありませんか?または、$ [((サブ)文字列の最初の配列要素と最初の文字のインデックス)が0ではありません。

これらの2つの変数は、読み取りまたは読み取りライン中にモジュールによって使用されます。

ところで:3つの関数呼び出しを使用して各行を一度に1文字ずつ読み取り、読み取った文字ごとにEncode :: decodeを呼び出してから、それを行バッファーに追加して、readlineがコードに返すため、非常に低速です。うん!

于 2012-01-27T04:31:16.633 に答える
1

少し変わったと思いますが、私自身の質問に答えます。ユニコードファイルを読み取る代わりに、Win32 :: Unicode::FileパッケージをPath::Class::Unicodeパッケージに置き換えました。これは正常に機能するため(つまり、メモリを消費しません)、問題はWin32 :: Unicode :: Fileパッケージにあるようで、おそらくバグです。私はパッケージの作者に連絡しました、そして彼はそれを調べています。コードを提供してほしい場合はお知らせください。それはかなり簡単です。

于 2012-01-30T21:18:33.063 に答える