此代码段提供了可应用于大多数程序的编程技术的几个示例。
- 使用哈希创建独特的结果
- 静态变量
- 递归函数
- 序列化
代码本身会生成由随机数组成的字符串列表。 字符串内不会重复任何数字,字符串列表内也不会重复任何字符串。 紧随该代码之后的是对如何使用上述编程技术来满足这些要求的简短讨论。
use warnings;
use strict;
my $length = 7; # the amount of numbers per string
my $max = 1000; # the number of strings
my @strings; # array to store the strings
for (1..$max) {
push @strings, rand_nums($length);
}
print "$_\n" for @strings;
{
my %cache; # create a "static" variable
sub rand_nums {
my %local_cache; # create a new hash
my ($length) = @_; # the length of the random number string passed to the sub
my $serial = int(rand(49))+1; # get the first number for the serialized string
$local_cache{$serial} = 1; # store the first number in the hash
for (2..$length) {# start at 2 because we already have the first number
my $num = int(rand(49))+1; # get a new random number
redo if exists $local_cache{$num}; # redo the loop if the number already exists
$local_cache{$num} = 1; # store the number in the hash
$serial .= "-$num"; # append to the serialized string
}
rand_nums($length) if exists $cache{$serial}; # redo the function if the key already exists
$cache{$serial}=1; # store the new key in the hash (%cache)
return $serial;
}
}
每当您认为Perl独特时,总是会使用哈希。
这是因为哈希键必须唯一。
我使用了两个哈希值,一个用于跟踪每个数字字符串(%local_cache)以确保任何一个字符串中都没有重复的数字,另一个用于确保所有字符串都是唯一的(%cache)。
%cache被包装在函数(rand_nums)的块{}中,以创建完善的C静态变量版本。 在块内用“ my”声明它可以使其在词法上作用于函数,但对其余代码/文件隐藏。 由于上面的代码片段没有执行任何其他操作,因此这并不是必需的,而是使用perl创建静态变量的示例。 Perl 5.10还具有一项新功能,允许您创建称为
状态 。在函数内部将%local_cache声明为“ my”,因为我们希望每次调用该函数时都声明一个新的哈希。 这样可以确保每个数字字符串都没有重复的值。 %cache确保没有重复的数字字符串。
$ length和$ max可以很容易地用于接受脚本的一些输入,从而使这些变量在每次运行脚本时都是动态的
在rand_nums()函数内部,您可以看到对该函数的调用:
rand_nums($ length)如果存在$ cache {$ key};这只是告诉perl如果该字符串已经存在,则再次运行该函数。 该函数再次运行,生成另一个数字字符串,并再次检查它是否已经存在。 这是递归perl函数的简单示例。 如果数字字符串尚不存在,则代码将继续运行,并最终返回一个字符串,以将其添加回数组@strings中。
使用递归函数时要记住的重要一点是,不要引入可能导致无限(或深度)递归的条件。 如果您的Perl脚本中出现这种情况,则“警告”实用程序将警告您。 在上面的代码中,如果将$ length设置为一个较小的数字,例如3,则可以自己看到会发生什么。
我在一开始提到序列化。 序列化是将任意字符串连接在一起组成一个字符串。 $ serial将是序列化的字符串,它是随机数的连接列表。 它从这一行开始:
我的$ serial = int(rand(49))+ 1; #获取序列化字符串的第一个数字通过使用串联运算符和赋值运算符将字符串序列化:
$ serial。=“”-$ num“;我们最终得到一个类似这样的字符串:
3-22-45-9-11-33-48该字符串用作哈希键,以确保最终列表中没有重复的字符串。 我们不加入%local_cache的键来生成序列化字符串的原因是,虽然哈希没有确定的顺序,但它们没有随机的顺序。 通过将散列键连接在一起而生成的结果随机数字符串将不再是随机的,而是倾向于数字出现在字符串中某些位置的概率。 即使不会重复两个字符串,您最终也会在相同位置反复出现具有相同数字的字符串。
代码中使用的编译指示和perl内置函数的列表:
Perl功能: 语法: