gpt4 book ai didi

arrays - Perl - 生成唯一标识符

转载 作者:行者123 更新时间:2023-12-01 03:31:33 25 4
gpt4 key购买 nike

首先,我必须承认我是 Perl 的新手,所以我的问题对某些人来说可能看起来很粗鲁,我很抱歉。我目前正在使用适用于 Perl 的 VMWare SDK,但我无法使用上传功能。我想做的是为每个 VMDK 生成一个唯一标识符(例如,我添加到 VM 的硬盘)。基本上,用户提供硬盘应该作为脚本的参数。

但是,如果用户选择了一个已经被使用的名字,我们就会遇到问题。我考虑了很多解决方案,比如添加时间戳(这将是唯一的),但我想要更优雅的东西。所以,让我们考虑一下:

@vmdks : 列出所有已经在虚拟机上的硬盘

$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,然后检索后者?

非常感谢,我希望我已经足够清楚了

最佳答案

您还可以使用 smart-match operator 进行匹配.我已经用 Perl 完成了你的伪代码,并对你的算法稍作调整。

请注意有不止一种方法可以做到这一点。您还可以使用散列进行查找。那会丢失的更快,但消耗更多的内存。这取决于最佳选择的任务。

#!/usr/bin/perl
use strict; use warnings;
use feature qw(say);

my @vmdks = qw( foo bar dilbert dilbert-001 );

sub test_filename {
my ($filename) = @_;

# abort if the filename is not alphanumeric
return if $filename =~ /\W/;

# check if the filename is in our list
if ($filename ~~ @vmdks) {
my $i = 1; # counter, starting at 1
# check if the extended filename is in the list
while ( sprintf('%s-%03d', $filename, $i) ~~ @vmdks ) {
$i++; # increment
}
# assign the new filename
$filename = sprintf('%s-%03d', $filename, $i);
}

return $filename;
}

# test ist
for (qw ( phb dilbert foo foo bar dogbert bar foo 1234 123) ) {
say test_filename($_);
}

关于arrays - Perl - 生成唯一标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12788397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com