首先,我必须承认我是 Perl 的新手,所以我的问题对某些人来说可能看起来很垃圾,我很抱歉。我目前正在使用适用于 Perl 的 VMWare SDK,但我被困在我的上传功能上。我想做的是为每个 VMDK 生成一个唯一标识符(例如,我添加到 VM 的硬盘)。基本上,用户提供硬盘应该作为脚本的参数。
但是,如果用户选择了一个已经被占用的名字,我们就会遇到问题。我考虑了很多解决方案,比如添加时间戳(这将是唯一的),但我想要更优雅的东西。所以,让我们考虑一下:
@vmdks:列出所有已经在 VM 上的硬盘
$filename:用户想要给 VMDK 的名称,一旦它在 VM 上
$target:硬盘实际拥有的名称。
我想要类似 filename-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,然后检索后者?
非常感谢,我希望我足够清楚