首先,我必须承认我对 Perl 不够了解,因此我的问题可能对你们中的一些人来说很荒谬,我很抱歉。目前我正在使用 VMWare SDK for Perl,并且在上传函数方面遇到了困难。我想做的是为每个 VMDK 生成一个唯一标识符(例如,我添加到虚拟机中的硬盘)。基本上,用户提供脚本参数作为硬盘应该具有的名称。
然而,如果用户选择的名称已存在,则会出现问题。我考虑了许多解决方案,比如添加时间戳(这将是唯一的),但我想要更加优雅的方式。因此,我们考虑:
@vmdks:列出已经在虚拟机上的硬盘 $filename:用户希望为 VMDK 给出的名称,一旦它位于虚拟机上 $target:实际上硬盘将拥有的名称。
我想要像文件名-00X 这样的东西,其中 X 是出现次数。例如,如果有人尝试添加一个名为 “FOO” 的硬盘,而已经存在一个,那么它将重命名为 “FOO-001”。请注意,用户只能输入由字母数字字符组成的磁盘名称,因此他不能命名硬盘为 “FOO-001”,从而避免冲突。
因为我不太了解 Perl,所以我决定用伪代码来写,希望你不介意:
我猜可以通过以下方式轻松实现第一个条件:
然而,如果用户选择的名称已存在,则会出现问题。我考虑了许多解决方案,比如添加时间戳(这将是唯一的),但我想要更加优雅的方式。因此,我们考虑:
@vmdks:列出已经在虚拟机上的硬盘 $filename:用户希望为 VMDK 给出的名称,一旦它位于虚拟机上 $target:实际上硬盘将拥有的名称。
我想要像文件名-00X 这样的东西,其中 X 是出现次数。例如,如果有人尝试添加一个名为 “FOO” 的硬盘,而已经存在一个,那么它将重命名为 “FOO-001”。请注意,用户只能输入由字母数字字符组成的磁盘名称,因此他不能命名硬盘为 “FOO-001”,从而避免冲突。
因为我不太了解 Perl,所以我决定用伪代码来写,希望你不介意:
IF $filename IS IN @vmdks
# So here we have a conflict
IF $filename-X IS IN @vmdks
# X should be a 3-digit number, like 001, 002, 666, etc.
INDEX := X
INDEX++
$target = $filename-INDEX
ELSE
$target = $filename-001
ENDIF
ELSE
$target = $filename
ENDIF
我猜可以通过以下方式轻松实现第一个条件:
if(grep{$_ eq $filename} @vmdks) ...
但是第二个问题……我真的卡住了 :/ 我该如何匹配$filename-index,并且获取后者?
非常感谢,希望我表达清楚了