我正在学习编码,然后按照以下教程尝试解决令人烦恼的问题-清理macOS上的文件,以免它们阻碍OneDrive正常工作。
我已经遵循了一些教程,并且几乎可以完成我希望的工作。
#!/usr/bin/perl -w
use strict;
use warnings;
use File::Find;
my @argv;
my $dir = $ARGV[0];
find(\&dirRecurs, $dir);
sub dirRecurs{
if (-f and not 's/^\./' )
{
(my $txt = $_) =~ s/^\ | (?=\.)|[\/!#%^?*&()\\]| $//g;
rename($_, $txt);
}
}
由于.dotfiles
,我希望它从重命名过程中排除and not 's/^\./'
,但事实并非如此。如果我从if行中删除了and not 's/^\./'
,则所有操作都可以实现,除了
我希望正则表达式中的\/
重命名more/less.pdf
之类的文件,但不会
答案 0 :(得分:0)
有问题的代码行是:
if (-f and not 's/^\./' )
-f
为true并且's/^\./'
为false时,此操作成功
-f
测试$_
是否是文件's/^\./'
测试给定的字符串是否不为空很显然,其中包含某些字符的任何字符串都不为null,因此if
测试始终会失败。
看看字符串的内容,很明显是要插入一个正则表达式测试。所需的形式是m//
形式(“匹配”)。 (几乎)提供的是s///
的格式错误的版本(搜索并替换)。
在Perl中,正则表达式通常不显示为字符串。适当的形式是(m
是可选的):
if (-f and not m/^\./)
几个侧面:
@argv
未在您的代码中使用(并且与@ARGV
不同)find(\&dirRecurs, @ARGV);
搜索多个路径(作为perl脚本的参数提供)if
来防止这种情况:if ((my $txt = $_) =~ s/^\ | (?=\.)|[\/!#%^?*&()\\]| $//g) {
rename($_, $txt);
}
# or:
rename($_, $txt)
if (my $txt = $_) =~ s/^\ | (?=\.)|[\/!#%^?*&()\\]| $//g;