为什么我尝试使用Perl';Windows上的统计功能失败?
我想不出如何重新开始前一个问题。这是参考资料。 我使用了你的第二个建议,它适用于路径文件名中没有空格的文件。但是,我正在使用的许多工具都包含空格。 我的搜索表明字符串应该在双引号内才能解决此问题。我做了一些尝试,取得了各种成果 此代码读取包含路径文件名条目列表的文件。我在中阅读了每一个条目,并尝试在完整条目上运行stat。存在具有不同大小和日期属性的重复条目。这是因为条目位于不同的驱动器上。我想将路径文件名、大小、日期属性输出到另一个文件。然后,我将使用排序函数来输出一个按完整路径排序的列表,其中包含日期和大小,以便在评估列表后删除不需要的条目 这是读取路径文件名条目并尝试执行stat函数的代码为什么我尝试使用Perl';Windows上的统计功能失败?,perl,Perl,我想不出如何重新开始前一个问题。这是参考资料。 我使用了你的第二个建议,它适用于路径文件名中没有空格的文件。但是,我正在使用的许多工具都包含空格。 我的搜索表明字符串应该在双引号内才能解决此问题。我做了一些尝试,取得了各种成果 此代码读取包含路径文件名条目列表的文件。我在中阅读了每一个条目,并尝试在完整条目上运行stat。存在具有不同大小和日期属性的重复条目。这是因为条目位于不同的驱动器上。我想将路径文件名、大小、日期属性输出到另一个文件。然后,我将使用排序函数来输出一个按完整路径排序的列表,
my $record = 0;
my $time = 0;
my $size = 0;
my $quote = '"'; # single quote, double quote, single quote
print "quote = $quote \n";
# read lines from listing file
open (ALL_, "<", $filename); # open my file list for reading
while (defined($_ = <ALL_>)) # while(my $line = <$
{ chomp; # remove newline "/n"
print " Normal value = $_\n"; # status output
$record = $_;
$record =~ s/\\/\//g; # change \ to /
$record = "\"$record\""; # add single double quote to start and end of record
# $record = $quote . $record . $quote;
print " now = $record \n";
# use lib '/home/foobar/code'; ?? add dbl quotes
# use My::Module;
# Using File::stat, which replaces stat with a function with a friendlier interface:
use File::stat qw( stat );
use POSIX qw( strftime );
# my $qfn = $quote . $_ . $quote; # also adds double quote
my $qfn = $record;
my $stat = stat($qfn) or die("Can't stat \"$qfn\": $!\n");
printf("File %s: size=%s modified=%s\n",
$qfn,
$stat->size,
strftime("%Y-%m-%d %H:%M:%S", localtime($stat->mtime)),
);
}
退出或死亡(无法统计\“qfn\”:$!\n)
如果我把它注释掉
$record = "\"$record\"";
为了省去我得到的双引号:
normal value = N:\dir1\dir2\dir3file1
now = N:/dir1/dir2/dir3/file1
file N:/dir1/dir2/dir3/file1: size=280580 modified=20022-12-13 09:41:28
normal value = C:\dir01\dir 02\dir03\file 2
now = C:/dir01/dir 02/dir03/file 2
Can't stat "C:/dir1/dir 02/dir03/file2": No such file or directory
退出或死亡(无法统计\“qfn\”:$!\n)
stat处理双引号的方式是否有所不同,以至于它仍然可以看到空格 如果我能正确执行这些操作:
有没有一种方法可以允许或die()提供一条消息,表明出现了故障,并继续处理在处理过程中不知何故被删除的一个文件?您所说的似乎与我所知道的有关Windows上路径等的任何内容都不一致。下面是一个示例程序,它统计了一组名称中带有空格的文件:
#!/usr/bin/env perl
use strict;
use warnings;
use File::Spec::Functions qw(catdir catpath rootdir);
use File::Find;
my %number_of = (
files_with_spaces_for_which_stat_was_successful => 0,
files_with_spaces_seen => 0,
);
my $top = catpath('C:', catdir(rootdir(), 'Program Files', 'Internet Explorer'));
print "calling stat for every file under '$top'\n";
find({
no_chdir => 1,
wanted => sub {
next unless /\s/;
$number_of{files_with_spaces_seen} += 1;
print "$_: ";
if (stat) {
$number_of{files_with_spaces_for_which_stat_was_successful} += 1;
print "+\n";
}
else {
print "-\n";
}
},
}, $top);
use YAML::XS;
print Dump \%number_of;
输出:
C:\> perl t.pl
...
---
files_with_spaces_for_which_stat_was_successful: 171
files_with_spaces_seen: 171
C:\>perl t.pl
...
---
文件\u带有\u空格\u用于\u统计\u成功的\u:171
带有空格的文件:171
stat
适用于我在Windows(8.1)上使用空格,不需要引号。另外,这个问题有点混乱——您声称在第一个示例中获得的输出显然不是由上面所示的代码版本生成的。你能不能把它简化为一个简单的例子(删除注释行等)并显示该代码的输出?你为什么要在(定义($)时编写?相反,使用while(my$line=)
。。。i、 e.不要使用主题变量$\uuu
,而是使用您自己的词汇范围$line
,并且不要使用裸字文件句柄,而是使用词汇文件句柄。不要发明您自己的文件名处理例程。使用,或,或stat
可以在文件名中使用任何混合的/和\分隔符,但是如果您确实想规范化显示给用户或传递给其他程序的字符串,则可以使用Canopath
。
C:\> perl t.pl
...
---
files_with_spaces_for_which_stat_was_successful: 171
files_with_spaces_seen: 171