- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Getopt::Long 删除一些目录。我想要做的是在目录中运行脚本并仅删除我指定的目录(和所有文件)(target_1、target_2、target_3)。我想那样执行它 -
cleanup_script.pl -target target_1,target_2,target_3
这是我到目前为止写的-
#!/usr/bin/env perl
use strict;
use warnings;
use diagnostics;
#Logs
open(STDOUT, '>', 'results.log') or die "Can't open log";
open(STDERR, '>', 'errors.log') or die "Can't open log";
#Input
use Getopt::Long;
my $target = "target";
(my $target_1, my $target_2, my $target_3) = split ',', $target;
GetOptions ("target=s" => \$target);
#Check and delete
if ($target_1 =~ '/target_1'){
system("rm -rf $target_1")};
if ($target_2 =~ '/target_2'){
system("rm -rf $target_2")};
if ($target_3 =~ '/target_3'){
system("rm -rf $target_3")};
错误日志-
Use of uninitialized value $target_1 in pattern match (m//) at
cleanup_script.pl line 22 (#1)
(W uninitialized) An undefined value was used as if it were already
defined. It was interpreted as a "" or a 0, but maybe it was a mistake.
To suppress this warning assign a defined value to your variables.
To help you figure out what was undefined, perl will try to tell you the
name of the variable (if any) that was undefined. In some cases it cannot
do this, so it also tells you what operation you used the undefined value
in. Note, however, that perl optimizes your program and the operation
displayed in the warning may not necessarily appear literally in your
program. For example, "that $foo" is usually optimized into "that "
. $foo, and the warning will refer to the concatenation (.) operator,
even though there is no . in your program.
Use of uninitialized value $target_3 in pattern match (m//) at
cleanup_script.pl line 26 (#1)
谢谢!
最佳答案
Getopt::Long有一个明确的目的是解析程序的参数并将它们读入程序和变量。 (它也可以执行任意代码,但将它用于除了参数处理需要以外的任何事情都是非常糟糕的做法。)
所以一旦库被用来读取像 dir1,dir2,...
这样的字符串,它就是你选择的 target
名称的参数的值†,然后拆分该字符串并获得所需的列表。然后程序可以继续处理(在这种情况下删除提交的目录)
use Getopt::Long;
use File::Path qw(remove_tree); # better use this than system's 'rm'
...
my $target; # only need to declare
# - I strongly advise an argument with a more informative name, like
# GetOptions ("dirs-to-remove=s" => \$target);
# - Don't want to proceed with a program that deletes stuff if there is an error!
# So exit with a brief usage message (or call a function with a nicer message)
GetOptions ("target=s" => \$target)
or die "Usage: $0 [arguments...]\n"; # or call a sub for usage message
# Check these directories if you have any way to do so
my @dirs_to_remove = split /,/, $target;
# Now iterate over all those `@dirs_to_remove`
foreach my $dir_to_del (@dirs_to_remove) {
#
# Check as best as you can. A whole hierarchy is getting blown away
#
if ( -d $dir_to_del and ... ) { # check somehow
my $num_removed = remove_tree(
$dir_to_del, { error => \my $err, safe => 1 }
);
if ($err and @$err) {
# See module docs for how to work with $err
die "Errors while removing $dir_to_del ...";
}
# print, check ...; see docs for options
}
}
请参阅文档。特别是,remove_tree
可以采用一些非常有用的选项。我发现 error
选项特别好,因为我宁愿在删除条目的程序中立即退出任何错误。
库可以在多个目标上调用,所以你可以说
my $num_removed = remove_tree( @dirs_to_remove, ... );
在这种情况下,您不需要循环,只需要这一条语句。但是,没有办法检查每个目录,因为它即将被删除,或者在它被删除之后——它们都消失了。
我建议始终使用完善的 Perl 库,而不是外出到系统和使用外部工具,当有用于该工作的库时。在这种情况下肯定有,比如 File::Path .
† 一旦这个程序被调用,一堆目录就会消失,可能无法恢复它们的内容。想到这个我就很紧张。
那么为什么不用一些非常明显的东西来命名命令行参数,比如
program_name --dirs-to-remove dir1,dir2...
(即使程序本身的当前名称具有信息性和特定性!)
然后,您可以更简单地调用它,甚至可能是 program_name -d dir1,dir2...
,因为 Getopt::Long
允许缩短参数,只要它们保持明确。 (但我不会——我宁愿让自己输入那个字符串,并在这个过程中重新思考即将发生的事情。)
关于perl - 如何在 PERL 中使用 Getopt::Long 删除特定目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66442670/
如果我的 Perl 程序使用 Perl 模块,它将如何确定在哪里可以找到包含模块代码的文件? 例如,如果程序包含: use MyModule1; # Example 1 us
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我正在自学 Perl,并且在我的 Windows 8 64 位系统上安装了 Strawberry。 Strawberry 命令行似乎工作正常,我在 C 驱动器上的 Strawberry 文件夹中创建了
我在 Perl 模块 IO::Socket::SSL 中发现了一个错误,我可能会修复它,但是,我担心测试修复。我从 Debian 下载了源码包(因为我打算为它制作一个 Debian 包或补丁)并查看了
我有一个 perl 文件,它使用了两个 perl 模块 A.pm 和 B.pm。 但是在 B.pm 中我需要调用 A.pm 的子程序。即使我在 A.pm 中使用并尝试使用它,我仍然遇到未定义的错误。
有没有办法在 Perl 运行时加载整个模块?我原以为我用 autouse 找到了一个很好的解决方案,但以下代码无法编译: package tryAutouse2; use autouse 'tryAu
过去,我编写过许多 perl 模块,以及不止一些独立的 perl 程序,但我之前从未发布过多文件 perl 程序。 我有一个几乎处于 beta 阶段的 perl 程序,它将被开源发布。它需要一些数据文
我有 1 个 perl 脚本,我们在其中编写了几个子例程。例子: # Try_1.pl main(); sub main{ --- --- check(); } check { -- --} 现在,
似乎 CPAN 上的一些(很多?)模块部分是使用 XS 在 C 中实现的,如果需要,可以回退到纯 perl 实现。虽然这很聪明,但它显然会损害性能,我想知道它是否会发生,以便我可以解决问题。 有没有一
我对 perl 很陌生。我希望我可以从 perl 安装一些软件包,我这样做是这样的: perl -MCPAN -e 'install VM::EC2' 我猜它由于依赖而失败,它显示: Result:
给定一个 Perl 包 Foo.pm,例如 package Foo; use strict; sub bar { # some code here } sub baz { # more
我有一个用 Perl 编写的测试生成器。它生成连接到模拟器的测试。这些测试本身是用 Perl 编写的,并通过其 API 连接到模拟器。我希望生成的代码是人类可读的,这意味着我希望它能够正确缩进和格式化
我正在学习 Perl,非常新的用户。我可以知道这些 Perl 代码之间有什么区别吗? #!/usr/bin/perl & #!/usr/bin/perl -w 最佳答案 那不是 perl 代码,它是
我不认为这是一个重复的问题。这专门针对 Perl 模块附带的脚本。 通常,在安装多个 Perl 版本时,您可以将 perl 可执行文件标记为版本号 (perl5.32),这样它们就可以在 /whate
我有一个在文件中使用 Blowfish 加密的程序和第二个 perl 程序,它提示输入用于将其解密为字符串的密码,我希望不必将解密的源代码写入硬盘驱动器,尽管将它放在内存中并不是真正的问题,因为运行程
有没有人为 Perl 中的惰性求值列表找到了一个好的解决方案?我尝试了很多方法来改变类似的东西 for my $item ( map { ... } @list ) { } 进入懒惰的评估——例如,通
我安装了多个版本的 Perl。 我已经指定了要使用的版本。但是为了验证,我想从 .pl 脚本本身输出 Perl 的版本。 这可能吗? 在 Perl 脚本中解析“perl --version”的输出似乎
人们还经常问“我怎样才能编译 Perl?”而他们真正想要的是创建一个可以在机器上运行的可执行文件,即使他们没有安装 Perl。 我知道有几种解决方案: perl2exe靛蓝之星 它是商业的。我从未尝试
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
我是一名优秀的程序员,十分优秀!