0

Perlに問題があります(私はまったく新しいです)。同じディレクトリに1つの.txtファイルがあります。ファイルをコピーしてstdoutに印刷し、コピーにテキストを追加して、ファイルサイズを比較することを計画しています。これは私がこれまでに持っているものです:

#!/usr/local/bin/perl
use File::Copy;

copy("data.txt", "copyOfData.txt") or die "copy failed :(";
open (MYFILE, "data.txt") or die "open failed :(";
while (<MYFILE>) {
    chomp;
    print "$_\n";
}
$filesize = -s MYFILE;
print "MYFILE filesize is $filesize\n";
close (MYFILE); 

open(MYCOPYFILE, ">>copyOfData.txt");
print MYCOPYFILE "\nextra data here blah blah blah\n";
$filesize = -s MYCOPYFILE;
print "MYCOPYFILE filesize is $filesize\n";
close (MYCOPYFILE); 

しかし、私が得ている出力は次のとおりです。

MYFILEファイルサイズは28ですMYCOPYFILEファイルサイズは28です

確かに、テキストを追加したので、MYCOPYFILEのサイズはMYFILEのサイズよりも大きくする必要がありますか?両方のテキストファイルを確認しましたが、コピーの最後に余分なテキストがあります。

ご協力いただきありがとうございます!

4

5 に答える 5

6

ファイル名を使用してファイルのサイズを確認できます(ファイルを開く必要はありません)。

my $size = -s 'data.txt' ;

そして、あなたは常にあなたのスクリプトを始めるべきです

use strict ;
use warnings ;

そして、ファイルを開くには、3つの引数バージョンのopen

open my $filehandle , '<' , 'filename' or die "Failed to open: $!" ;
于 2013-03-25T11:59:56.560 に答える
3
$filesize = -s MYFILE;

上で指摘したように、-sはファイルハンドルでは機能しません。ファイルハンドルからサイズを取得する場合は、statを使用します

$filesize = ((stat(MYFILE))[7]);

-sおよび友人の詳細については、perldoc -f -Xを参照してください。統計については、 perldoc-fstatを参照してください。

于 2013-03-25T12:04:41.667 に答える
2

ファイルを閉じた後、ファイルサイズを確認してください。これでファイルサイズが変わらない場合は、テキストを追加してみてください。サイズが変わる可能性があります。

ご挨拶

于 2013-03-25T11:51:23.403 に答える
2

dgwの答えは正しいです。

別の方法は、次のように使用することFile::statです。

    #!/usr/bin/perl
    use strict;
    use warnings;
    use File::stat;

    my $filesize = stat("test.txt")->size;

    print "Size: $filesize\n";

    exit 0;
于 2013-03-25T12:03:23.673 に答える
1

Perlは、IOオブジェクトに対して自動的にいくつかのバッファリング操作を実行します。を呼び出した直後は、内容がディスクに書き込まれない場合がありますprint FH "blalba"。ただし、この-s関数はディスクからファイルサイズを読み取ります。したがって、ファイルを「更新」したと思うと、予想よりもサイズが小さくなる可能性があります。

正しいサイズを取得するには、バッファ内のコンテンツをディスクにフラッシュしてから、でサイズをフェッチし-sます。close(FH)最初にバッファを自動的にフラッシュしてから、ファイルハンドルを閉じることに注意してください。したがって、呼び出しの-s後に操作を配置して、正確なサイズを取得できます。close

flush()または、サイズをIO::Handle取得する前にを呼び出して、バッファを明示的にフラッシュします。

open(MYCOPYFILE, ">>copyOfData.txt");
print MYCOPYFILE "\nextra data here blah blah blah\n";
MYCOPYFILE->flush();
$filesize = -s MYCOPYFILE;
print "MYCOPYFILE filesize is $filesize\n";

-sファイルハンドル、ディレクトリハンドル、およびファイル名を表す式を操作します。したがって、についてのコードは正常に-s機能します。

于 2013-03-25T13:56:42.953 に答える