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