在Perl中,当我尝试在循环中阅读dir
并执行for each file stat()
以获取$size
和$mode
时,我得到了错误的数据!
例如,我刚刚创建了一个简单的文本文件,它显示它具有权限0000且没有大小。
Perl代码:
if (!@ARGV[0]) {
die("Za mało parametrów!\n");
}
$dirname = @ARGV[0];
opendir(DIR, $dirname) || die("Nie mogę otworzyć katalogu!\n");
while( $filename = readdir(DIR) ) {
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
$perm = sprintf("%04o", $mode & 07777);
$tmp1 = int(($size/1024));
$tmp2 = length($filename);
if (($tmp1 > $tmp2) && ($perm =~ /.[^5410]../)) {
print("$filename\n");
}
}
closedir(DIR);
答案 0 :(得分:7)
您需要将完整的文件路径传递给stat()函数。目前您只是传递一个文件名,因此脚本将在其当前目录中查找该文件。
换句话说,这样做:
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = stat("$dirname/$filename");
答案 1 :(得分:0)
正如其他人所提到的,问题在于您尝试仅使用文件名($dirname
文档)对readdir
中的文件进行操作。如果没有完整路径,stat
将无法找到该文件。
可以将目录连接到每个文件名,甚至可能使结果绝对(请参阅我对其他答案的评论),但这是一个痛苦的问题。
对$dirname
中的文件进行操作的另一种方法是将工作目录更改为相关目录,操作然后返回原始目录。我最喜欢cd
的方法是File::chdir
模块,它创建与当前工作目录绑定的标量$CWD
。这正是我在对块进行local
并将其更改为相关目录时所描述的内容。然后你可以做类似的事情:
use strict;
use warnings;
use File::chdir;
$dirname = shift @ARGV or die("Za mało parametrów!\n") ;
{
local $CWD = $dirname; #changes the cwd to contents of $dirname
opendir(my $dir, $CWD) || die("Nie mogę otworzyć katalogu!\n");
while( $filename = readdir($dir) ) {
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
$perm = sprintf("%04o", $mode & 07777);
$tmp1 = int(($size/1024));
$tmp2 = length($filename);
if (($tmp1 > $tmp2) && ($perm =~ /.[^5410]../)) {
print("$filename\n");
}
}
}
在阻止之后,恢复原始cwd
。注意:我没有针对这种情况测试此代码。我经常使用这种方法。它应该解决问题,它是可移植的!