my $filename = "path/to/file.png";처럼 변수에 어떤 파일의 경로명이 들어있을 때, 그 파일의 크기를 알아내는 가장 쉬운 방법은 -s 연산자를 사용하는 것입니다: my $size = -s $filename;

use strict;
use warnings;
use 5.010;

my $filename = "/etc/passwd";
my $size = -s $filename;
say $size;

stat 함수

다른 방법으로는, 내장 함수인 stat을 사용하면 파일의 상태를 나타내는 13가지 정보의 리스트를 받을 수 있습니다. 그 중 8번째 (인덱스 7) 원소가 파일의 크기입니다.

use strict;
use warnings;
use 5.010;

my $filename = "/etc/passwd";
my @stat = stat $filename;
say $stat[7];

리스트 원소를 즉석으로 가져오기

물론 stat 함수의 반환값을 굳이 배열에 담지 않아도 됩니다. 전체 표현식을 괄호로 감싼 후 뒤에 대괄호 안에 인덱스를 적어주면 특정 원소를 곧바로 얻어올 수 있습니다: (stat $filename)[7];

use strict;
use warnings;
use 5.010;

my $filename = "/etc/passwd";
my $size = (stat $filename)[7];
say $size;

$size 변수도 굳이 사용할 필요가 없습니다. 다만 단순하게 say (stat $filename)[7]; 또는 print (stat $filename)[7];처럼 적으면 안 됩니다.

이 경우 펄이 저 괄호가 sayprint 함수에 결합된 것으로 간주하고, [7]say 또는 print의 반환값에 적용되는 인덱스인 것으로 처리하게 됩니다.

이 문제를 해결하려면 진짜로 say/print 함수의 일부가 되는 괄호를 따로 적어주거나, 괄호 앞에 + 부호를 적어줍니다.

use strict;
use warnings;
use 5.010;

my $filename = "/etc/passwd";
say ((stat $filename)[7]);
say +(stat $filename)[7];

객체 지향

여러 해결방법 중에서 가장 눈으로 봐서 이해하기 쉬운 것은 아마도 File::stat 모듈을 사용하는 것일 겁니다. 이 모듈에는 펄의 내장 함수 대신 사용할 수 있는 stat 함수가 있는데, 이 함수는 객체를 반환하며, 그 객체에 있는 메소드 중에는 파일의 크기를 반환하는 size 메소드도 있습니다.

이번 예제에서도 첫 번째 버전은 객체를 $stat 변수에 할당한 후 사용하고, 두 번째 버전은 별도의 변수를 쓰지 않고 즉석에서 size 메소드를 호출하고 있습니다.

use strict;
use warnings;
use 5.010;

my $filename = "/etc/passwd";

use File::stat;
my $stat = stat($filename);
say $stat->size;

say stat($filename)->size;