散列,静态变量,递归函数,序列化

此代码段提供了可应用于大多数程序的编程技术的几个示例。

  • 使用哈希创建独特的结果
  • 静态变量
  • 递归函数
  • 序列化

代码本身会生成由随机数组成的字符串列表。 字符串内不会重复任何数字,字符串列表内也不会重复任何字符串。 紧随该代码之后的是对如何使用上述编程技术来满足这些要求的简短讨论。


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功能: 语法:
  • 严格 -Perl编译指示限制不安全的构造
  • 警告 -Perl编译指示来控制可选警告

From: https://bytes.com/topic/perl/insights/859808-hashes-static-variables-recursive-functions-serialization

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值