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

my $file_name = 0;
my $info = 0;
my $ret_mode = 0;
my $size;
my $last_mod;
my @array_file;
my $index = 0;
my @array_mode;
my @array_size;
my @array_last_mod;
foreach(@ARGV){
  $file_name = $_;
  $info = stat($file_name);
  $size = $info->size;
  $last_mod = scalar(localtime($info->mtime));
  $ret_mode  = $info->mode;
  $ret_mode = $ret_mode & 0777;
  $array_file[$index] = ($file_name);
  $array_mode[$index] = ($ret_mode);
  $array_size[$index] = ($size);
  $array_last_mod[$index] = ($last_mod);
  $ret_mode = 0;
  $index++;
 }
 my @array_arrays = (@array_file, @array_mode, @array_size, @array_last_mod);
 my $array_ref = \@array_arrays;
 my $i = 0;
 for(@$array_ref){
  print "@$array_ref[$i]\n";
  $i++;
 }

配列の配列を作成しました。作成した配列の配列からファイル名、mmode、サイズ、最終アクセス時刻を出力したいと考えています。値を出力していない、

 for(@$array_ref){
  print "@$array_ref[$i]\n";
  $i++;
 }
4

2 に答える 2

5
my @array_arrays = (@array_file, @array_mode, @array_size, @array_last_mod);

このステートメントは、配列の配列を作成しません。代わりに、さまざまな配列を 1 つの大きなフラット リストにフラット化し、それを に割り当て@array_arraysます。配列参照を割り当てたい。参照演算子でそれらを取得します\

my @array_arrays = (\@array_file, \@array_mode, \@array_size, \@array_last_mod);

またはショートカットで

my @array_arrays = \(@array_file, @array_mode, @array_size, @array_last_mod);

それでも、最後のforeachループは間違っています。あなたはおそらく意味した

for my $i (0 .. $#{ $array_arrays[0] }) {
  for my $aref (@array_arrays) {
    print $aref->[$i], "\n";
  }
}

または似たようなもの。


コード スタイルが改善される可能性があります。

  • すべての変数を先頭で宣言しないでください。可能な限り狭い範囲で宣言してください。初期化の時点でそれらを宣言してみてください。

    for my $file_name (@ARGV) {
      my $info = stat($file_name);
      my size = $info->size;
      ...
    }
    
  • 配列名の前にarray_. 記号および/または演算子の@添字により、[...]これらが配列であることを明確にします。

  • $ret_mode & 0777– 結果は$ret_modeそれ自体である必要があります: 0777is 0b111111111. つまり、これは最後の 9 ビットを除くすべてを削除します。左側にさらに多くのビットがあっても気にしません。

  • $last_mod = scalar(localtime($info->mtime));– スカラー代入のため、localtimeスカラー コンテキストで既に実行されています。これを明示する必要はありません。

  • my $index = 0; ... for (...) { $array[$index] = ...; $index++ }. しないでください。push:を使用するだけですfor (...) { push @array, ... }。必要がない限り、自分でインデックスを維持しないでください。

  • $ret_mode = 0;なんで?とにかく、次の反復中に新しい値を割り当てます。ループ内でこの変数を宣言する必要があることに注意してください (タイトなスコープに関する私のポイントを参照してください)。これにより、反復ごとに新しい変数が作成され、これがさらに役に立たなくなります。

  • my $array_ref = \@array_arrays; .. @$array_ref[$i]. これは少し後退していませんか?$array_arrays[$i]同様に機能します。@あなたの逆参照では、おそらく間違った印章であることに注意してください。あなたが意味し$$array_ref[$i]た。

于 2013-08-18T21:55:36.753 に答える