Perl'-s'文件测试运算符问题

时间:2011-02-01 19:03:25

标签: perl file

我正在调试一段代码,它使用Perl '-s'函数来获取某些文件的大小。

my $File1 = /myfolder/.../mysubfolder1/document.pdf
my $File2 = /myfolder/.../mysubfolder2/document.pdf
my $File3 = /myfolder/.../mysubfolder1/document2.pdf $File3实际上是/myfolder/.../mysubfolder2/document.pdf又名$File2的链接

有缺陷的代码是:

my $size = int((-s $File)/1024);

$File替换为$File1 - $File3

由于某些原因,我无法解释这不适用于每个文件。

适用于$File1$File3,但不适用于$File2。我可以理解,$File2$File3都不起作用,这意味着文件/myfolder/.../mysubfolder2/document.pdf在某种程度上是腐败的。 我甚至在if (-e $File)|{之前添加了一个测试-s以确保该文件存在,但这三个文件确实存在。

更奇怪的是:.htaccess中有/myfolder/.../mysubfolder1/.htaccess中没有/myfolder/.../mysubfolder2/。如果它是反向的,我会认为.htaccess会以某种方式阻止-s调用。

有什么想法吗?

4 个答案:

答案 0 :(得分:10)

如果-s失败,则返回undef并将错误设置为$!。什么是$!?

答案 1 :(得分:5)

我想如果用“stat”检查那个文件的大小,你会得到小于1024字节的东西:) 如果size小于1024

,你的int(( - s $ fn)/ 1024)将返回0

答案 2 :(得分:5)

为了解决评论的结束,.htaccess文件控制通过网络服务器的请求访问文件。一旦用户请求执行有效的允许CGI /任何脚本的URL(我假设您的Perl代码在Web上下文中),那么该脚本绝对没有关于.htaccess的权限问题(除非您实际编写Perl代码以读取其内容)并明确地尊重他们。)

唯一可以搞砸Perl文件的权限是操作系统中的文件系统权限。

要获取文件大小,您的网络用户需要:

  • 对包含文件

  • 的目录执行权限
  • 可能是对包含该文件的目录的读取权限(不确定文件大小是否存储在inode中?)

  • 可能是对文件的读取权限。

如果所有3个文件(2个好文件和1个坏文件)都在同一目录中,请检查文件的读取权限。

如果它们位于不同的目录中,请检查文件的读取权限和目录权限。

答案 3 :(得分:4)

int((-s $file)/1024)更改为sprintf('%.0f', (-s $file)/1024) - 您会看到一些内容,该文件可能不到1024字节,因此int()将很乐意返回0.