1

私は初心者で、この Perl サブルーチン内で何が起こっているのか混乱しています。

単純化するためにグローバル変数のみを使用していますが、まだ機能していません。

私は単純に、IF ステートメントでファイル テスト演算子を使用して、ファイルの読み取り、書き込み、および実行可能属性を出力しようとしています。

誰かが私のために問題を指摘できますか?

ルイ

sub getfileattributes {
    if (-r $file) {
        $attributes[0] = "readable";
    } else { $attributes[0] = "not readable"; }
    if (-w _) {
        $attributes[1] = "writable";
    } else { $attributes[1] = "not writable"; }
    if (-x _) {
        $attributes[2] = "executable";
    } else { $attributes[2] = "not executable"; }
}    

my @attributes;
my $file;

foreach $file (@ARGV) {
    &getfileattributes;
    printf "The file $file is %s, %s and %s\n", @attributes;
}
4

2 に答える 2

3

グローバル変数を使用することは、通常、非常に悪いことであり、設計エラーを示しています。この場合、サブルーチンに引数を渡す方法がわからないことがエラーのようです。

Perl でのパターンは次のとおりです。

sub I_take_arguments {
   # all my arguments are in @_ array
   my ($firstarg, $secondarg, @rest) = @_;
   say "1st argument: $firstarg";
   say "2nd argument: " .($firstarg+1). " (incremented)";
   say "The rest  is: [@rest]";
}

サブは次のように呼び出されます

I_take_arguments(1, 2, "three", 4);

(これらを として呼び出さない&nameOfTheSubでください。これは、通常は必要としない非常に特殊な動作を利用します。)

これは印刷されます

1st argument: 1
2nd argument: 3
The rest  is: [three 4]

サブルーチンは、ステートメントと共に、または実行された最後のステートメントの値として、値を返すことができます。returnこれらのサブルーチンは同等です:

sub foo {return "return value"}
sub bar {"return value"}

getfileattributes私はあなたを次のように書きます

sub getFileAttributes {
   my ($name) = @_;
   return
      -r $name ? "readable"   : "not readable",
      -w $name ? "writable"   : "not writable",
      -x $name ? "executable" : "not executable";
}

ここで何が起きてるの?引数を取り、値のリスト$nameを返します。キーワードは省略できます。は値のリストを取り、括弧は必要ないので、省略します。演算子は他の言語から知られています。returnreturnTEST ? TRUE-STATEMENT : FALSE-STATEMENT

次に、ループで、サブが次のように呼び出されます

for my $filename (@ARGV) {
   my ($r, $w, $x) = getFileAttributes($filename);
   say "The file $filename is $r, $w and $x";
}

また

foreach my $file (@ARGV) {
   my @attributes = getFileAttributes($file);
   printf "The file $file is %s, %s and %s\n", @attributes;
}

ノート:

  • sayに似printていますが、最後に改行を追加します。これを使用するには、Perl > 5.10 が必要でuse 5.010、どのバージョンまたはuse feature qw(say).

  • use strict; use warnings;あなたが確かによく知らない限り、常に。

  • 多くの場合、変数に 2 回代入しなくてもプログラムを作成できます (単一代入形式)。これにより、制御フローに関する推論がはるかに簡単になります。これが、グローバル変数 (ただし、グローバル定数ではない) が悪い理由です。

于 2012-11-03T11:47:06.823 に答える
-1

実際にはグローバル変数を使用していません。私のスコープはメイン ルーチンに対してローカルな変数なので、サブルーチンを呼び出すと、$file と @attributes はメイン ルーチンではなく、サブルーチンにスコープされます。

my を our for $file および @attributes に変更して、変数をグローバルにし、サブルーチンで使用できるようにします。

これは、perl の -d 引数を使用してデバッガーで実行し、項目の値を確認することで、自分で確認できます。

于 2012-11-03T02:48:49.210 に答える