Фрагмент DirTreeSize.pl sub ProcessDir { my( $Dir ) = @_; my( @DirList, @FileList ); if( opendir( DIR, $Dir ) ) { while( my $Object = readdir( DIR ) ) { next if( «.» eq $Object || «..» eq $Object ); my $Path = «$Dir$Object»; if( -f $Path ) { push( @FileList, $Path ); } elsif( -d $Path ) { push( @DirList, $Path ); } } closedir( DIR ); } foreach my $Path ( sort @FileList ) { ProcessFile( $Path ); } foreach my $Path ( sort @DirList ) { # Begin Callout A $giCountDir++; UpdateDisplay(); ProcessDir( $Path ); # End Callout A } } sub ProcessFile { my( $Path ) = @_; my @Stats = stat( $Path ); # Begin Callout B $giSize += $Stats[7]; $giCountFile++; UpdateDisplay(); # End Callout B } sub UpdateDisplay() { # Begin Callout C printf( «Files: % 7s Dirs: % 4s TotalSize: %s bytes (%s bytes) », FormatNumber( $giCountFile ), FormatNumber( $giCountDir ), FormatNumberPretty( $gSize ), FormatNumber( $gSize ) ); # End Callout C }