Perl - 生成唯一标识符

3
首先,我必须承认我对 Perl 不够了解,因此我的问题可能对你们中的一些人来说很荒谬,我很抱歉。目前我正在使用 VMWare SDK for Perl,并且在上传函数方面遇到了困难。我想做的是为每个 VMDK 生成一个唯一标识符(例如,我添加到虚拟机中的硬盘)。基本上,用户提供脚本参数作为硬盘应该具有的名称。
然而,如果用户选择的名称已存在,则会出现问题。我考虑了许多解决方案,比如添加时间戳(这将是唯一的),但我想要更加优雅的方式。因此,我们考虑:
@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,并且获取后者?

非常感谢,希望我表达清楚了

2个回答

0

你也可以使用智能匹配运算符进行匹配。我已经用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($_);
}

0
您可以获取所有候选项的子数组,如下所示:
my @tmp = grep(/^$filename-\d+/, @vmdks);

@tmp 的最后一个元素将是 $filename 的最新索引文件名


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接