珀尔。无法进入一段时间 (<>) 循环



我在perl中有一块代码,该代码用于 pre-reciee git Hook(它限制了可以按下的文件大小。它在服务器端(。问题是我不能输入 while(&lt;>(循环,我真的不知道它是如何工作的。你能给我解释吗?为什么我不能输入循环?

预先感谢!

while循环的代码在这里:

while (<>) {
  print "I can't enter here, so I cannot block the files!!!"
  chomp;
  my ($old, $new, $ref) = split / /, $_;
  my %visited = ();
  my $log = ($old =~ /^0+$/ ? `/usr/bin/git log --pretty=%H $new`
                            : `/usr/bin/git log --pretty=%H $old..$new`);
  for my $commit (split /n/, $log) {
    # pick new files in each commit
    for my $entry (split /n/,
      ($old =~ /^0+$/
        ? `/usr/bin/git diff-tree --no-commit-id -r $commit`
        : `/usr/bin/git diff-tree --no-commit-id -r $old..$commit`)) {
      if ($entry =~ /^:d+ d+ w+ (w+) w+t(.*)$/ && !$visited{$1}) {
        my $sha = $1;
        my $name = $2;
        unless ($sha =~ /^0+$/) {
          $visited{$sha} = 1;
          # check file size
          my $size = `/usr/bin/git cat-file -s $sha`;
          chomp $size;
          # reject file size is greater than limit
          if ($size > $limit) {
            my $shortsha = substr($commit, 0, 10);
            my $hsize = hsize($size);
            my $hlimit = hsize($limit);
            print "'$name' of size $hsize in $shortsha is over $hlimit limit";
            $hasBadFiles = 1;
          }
        }
      }
    }
  }
}

<>-钻石操作员 - 也被称为 <ARGV>

perldoc perlvar

argv @ARGV中命令行文件的迭代的特殊fileHandle。通常在角度运算符中以null FileHandle的形式编写。请注意,目前ARGV仅在&lt;>运算符中具有神奇的效果;在其他地方,它只是与&lt;>打开的最后一个文件相对应的普通文件。特别是,将 *argv作为一个期望filehandle的函数的参数可能不会导致您的函数自动读取@ARGV中的所有文件的内容。

while ( <> ) {

告诉perl:

  • 打开指定为参数的文件,然后按行读取它们。
  • 逐行阅读stdin。