perl生成图片_使用Perl生成模拟数据

perl生成图片

最近,在工作中,为了测试代码,我们的团队创建了一些测试,这些测试可以模拟数据,或者在某些情况下可以模拟正收益,这使我们能够更轻松地隔离正在处理的特定代码块。 我确信这在大多数测试驱动设计(TDD)场景中是相当普遍的做法。 但是,这让我想到了当我开始学习JavaScript时会使用的API,它将生成随机用户。 https://randomuser.me/

这是用于模拟用户数据的重要资源。 您可能会将其视为随机生成的用户的Lorem Ipsum。 当我在考虑这个整洁的工具以及我们的团队如何模拟其他类型的数据时,我开始考虑如何制作自己的用户数据生成器,类似于上面的API。

如果您想查看该项目的源代码,这是我到目前为止的内容:

https://github.com/ethanjarrell/randomUsers

以下示例将显示我如何考虑此过程,以及一些有关如何执行此过程的代码段。 首先,我需要了解我想为每个用户生成的事物的类型。 这是我想出的清单:

  • 名称
  • 年龄
  • 性别
  • 种族
  • 生日
  • 电子邮件
  • 电话号码
  • 地址
  • 占用
  • 兴趣爱好
  • 眼睛的颜色
  • 发色
  • 肤色
  • 高度
  • 重量
  • 体型
  • 婚姻状况
  • 配偶(如果已婚)
  • 小孩儿
  • 最高学历
  • 学校
  • 学生贷款债务
  • 年薪
  • 宗教

事后看来,我可能对这个清单有些不满。 但这是一个有趣的编程挑战。 我的想法是,您可以通过以下两种方式之一来执行此操作。 首先,您可以创建数千个概要文件,并且在运行代码时,只需随机返回数千个概要文件。

我认为第二种选择将耗时少得多,它是随机生成每个新人……以某种程度的随机性生成每个特征,而不依赖于任何包含完整随机概要文件的数据库。 例如,每次运行代码时,它将从列表或通过其他方式生成每个特征,并将其组合在一起以每次创建新的用户配置文件。

通过这样做,我意识到某些特质在某种程度上取决于其他特质。 而其他人则可以完全独立于其他任何人。 例如,您不能随机选择名称和性别。 否则,您最终可能会遇到一个叫伊莎贝拉的男人或一个叫巴基的女人。 并不是说这有什么问题,但是为了保持一致,我想在某种程度上保持社会规范。

其他细微的依赖特征可能是爱好,体重/体型等。 例如,如果我们随机选择这些特征,我们最终可能会成为一个爱好包括铁人三项但身体类型超重的人。 同样,这里没有错,但是重点是生成一致的数据。

另一个例子可能是教育/工作类型和年薪。 再有,我们可以随机选择,选拔一个拥有电气工程硕士学位的人,年薪为12,000美元。

为了以一种有意义的方式解决这个问题,我首先生成了不需要相互依赖的所有数据。 然后,根据最初的几个特征生成的内容,我可以从更孤立的数据子集中生成其余的特征。

为了开始我的Perl文件,我将使用一些本地Perl软件包:

#!/usr/bin/perl
use DBI;
use strict;
use warnings;
use lib qw(..);
use JSON qw( );
use Data::Dumper;

在此示例中,我实际上没有使用DBI,但是如果您要将每个新生成的用户写入数据库,则DBI可能会派上用场。 我将使用lib和JSON。

首先,我上网查看了为特定条目随机生成的特征的列表。 这些都包含在上面的github链接中。 清理数据,删除空格并添加逗号后,我遍历列表,将每个条目推入数组。 然后,当我想从数组中进行随机选择时,可以使用Perl的“ rand”方法来获得随机条目。

我使用了很多列表来提取数据,但是我基本上使用相同的格式从列表中提取数据。 这是我如何创建男性和女性姓名列表的示例:

# declare a variable for the test txt file
my $maleNames = 'maleNames.txt';
# connect to and open the json file
open (FH, "< $maleNames") or die "Can't open $maleNames for read: $!";
my @maleLines ;
while (<FH>) {
push ( @maleLines , $_);
}
close FH or die "Cannot close $maleNames: $!";
my @maleList = ();
foreach my $x ( @maleLines ) {
my $str = $x;
@maleList = split(',', $str);
}
# declare a variable for the test txt file
my $femaleNames = 'femaleNames.txt';
# connect to and open the json file
open (FH, "< $femaleNames") or die "Can't open $femaleNames for read: $!";
my @femaleLines ;
while (<FH>) {
push ( @femaleLines , $_);
}
close FH or die "Cannot close $femaleNames: $!";
my @femaleList = ();
foreach my $x ( @femaleLines ) {
my $str = $x;
@femaleList = split(',', $str);
}

现在,我可以模拟抛硬币,如下所示:

my $gender = int(rand(2));

这将为性别生成一个0或1的数字。

然后我可以使用一个条件:

if ( $gender == 0 ) {
$gender = "female";
} else {
$gender = "male";
}

性别随机决定后,我们可以根据随机选择的性别结果从男性或女性名字列表中随机抽取新记录。

生成随机电话号码:

现在,一旦在Random中选择了状态,我就可以进行API调用来确定状态的区号,但是我现在还没有具体说明这一点。 我真正关心的是该号码采用电话号码格式((xxx)xxx-xxxx)。

为此,我只是随机生成了10位数字,并将它们连接为正确的格式:

my $n1 = int(rand(8)+1);
my $n2 = int(rand(9));
my $n3 = int(rand(9));
my $n4 = int(rand(9));
my $n5 = int(rand(9));
my $n6 = int(rand(9));
my $n7 = int(rand(9));
my $n8 = int(rand(9));
my $n9 = int(rand(9));
my $n10 = int(rand(9));
my $phoneNumber = "($n1$n2$n3) $n4$n5$n6-$n7$n8$n9$n10";

生成随机邮政编码:

邮编也一样:

my $z1 = int(rand(8)+1);
my $z2 = int(rand(9));
my $z3 = int(rand(9));
my $z4 = int(rand(9));
my $z5 = int(rand(9));
my $zipcode = $z1 . $z2 . $z3 . $z4 . $z5;

生成随机电子邮件:

我认为电子邮件可能会有所不同。 例如,如果我已经生成了一个随机名称,则可以简单地执行以下操作:

firstName.lastName @ emailServer . com

虽然,这似乎并不令人信服,所以我想让电子邮件有几种。

my @emails = ("gmail", "hotmail", "protonmail", "yahoo", "aol");
my $index = rand @emails ;
my $email = $emails[$index];
my $index2 = rand @adjectiveList ;
my $adjective = $adjectiveList[$index2];
my $index3 = rand @animalsList ;
my $myAnimal = $animalsList[$index3];

每次运行代码时,都会从5个列表中随机选择一个电子邮件服务。然后,从每个数百个列表中随机选择一个形容词和动物。 这将允许我创建以下格式的电子邮件:

fuzzy . kitten . 01 @ gmail .com

要么

firstName . the . terrible @ yahoo .com

使用这些变量,我创建了5种格式类型,并在1到5之间随机选择一个数字。根据结果,新电子邮件将获得该格式。 看起来是这样的:

my $emailAddress = "";
my $girlGuy ="";
if ($gender eq "male"){
$girlGuy = "guy";
}else {
$girlGuy = "girl";
}
my $emailFormat = int(rand(5));
if ($emailFormat == 0){
$emailAddress = $lastName[0] . "." . $lastName[1] . $sN3 . $z2 . "@" . $email . ".com";
} elsif ($emailFormat == 1) {
$emailAddress = $adjective . "_" . $myAnimal . $sN1 . "@" . $email . ".com";
} elsif ($emailFormat == 2) {
$emailAddress = $adjective . "_" . $lastName[0] . $sN1 . "@" . $email . ".com";
} elsif ($emailFormat == 3) {
$emailAddress = $newState . "_" . $girlGuy . $sN1 . $sN2 . $sN3 . "@" . $email . ".com";
} elsif ($emailFormat == 4) {
$emailAddress = $adjective . "_" . $newCity . "_" . $girlGuy . $sN1 . $sN2 . $sN3 . "@" . $email . ".com";
}
$emailAddress =~ s/\s+//g;

产生随机工作和学位:

对我来说,另一个有趣的事情是创造一份工作和一个学位。 我使用了一个随机职位的列表,并随机选择一个,类似于我创建并随机选择一个男性或女性名字的方式。 然后,使用新的随机作业,我在Perl中使用substr方法比较了该作业。 我基本上在做的是将职位的子字符串与大量潜在的学位课程进行比较。 例如,如果工作是:

Electrical Engineer

然后,我可能只拿到职位的前5个字母:

elect

并遍历该列表中的所有学位课程,看是否存在匹配条件。 如果有匹配项,我会将匹配项添加到该新的“随机用户”拥有的度数列表中。 我有学士,副学士和硕士学位课程的清单,所以我将它们全部选中,然后将匹配项推入一个度数组:

my $substring = substr $job, 0, 5;
my @degrees = ();
foreach my $x ( @bachelorList ) {
if (index($x, $substring) != -1) {
push @degrees , $x;
}
}
foreach my $x ( @associateList ) {
if (index($x, $substring) != -1) {
push @degrees , $x;
}
}
foreach my $x ( @masterList ) {
if (index($x, $substring) != -1) {
push @degrees , $x;
}
}
my $degree = "";
foreach my $x ( @degrees ) {
$degree = $degree . ", " . $x;
}

最后,我只是将所有结果连接成一个字符串。

最终,我没有做完所有决定,最后得到的结果是哈希值,然后使用Dumper打印出来。 我的哈希看起来像这样,变量作为哈希值:

my $json = {NAME=>$name, WEIGHT=>$finalWeight, HEIGHT=>$finalHeight, EYE_COLOR=>$eyeColor, BODY_TYPE=>$bodyType, HAIR_COLOR=>$hairColor, SKIN_COLOR=>$skinColor, RELIGION=>$myReligion, SCHOOL=>$school, HIGHEST_LEVEL_OF_EDUCATION=>$highestLevelOfEducation, AGE=>$age, STUDENT_LOAN_DEBT=>'$' . $studentLoanDebt . '.00', ANNUAL_SALARY=>'$' . $annualSalary . '.00', CHILDREN=>$kids, BIRTHDAY=>$birthDate, GENDER=>$gender, MARITAL_STATUS=>$married, SPOUSE=>$spouse, ADDRESS=>$streetNumber . " " . $newStreet . ", " . $newCity . ", " . $newState . " " . $zipcode, PHONE=>$phoneNumber, EMAIL=>$emailAddress, OCCUPATION=>$job, HOBBIES=>$hobby1 . ", " . $hobby2 . ", " . $hobby3, DEGREE=>$degree, ETHNICITY=>$ethnicBackground};
print Dumper $json;

而且我的输出通常类似于以下内容:

{
'ADDRESS' => '7841 3rd Street West, Duarte, Minnesota 87604',
'GENDER' => 'female',
'SPOUSE' => 'Raleigh Teer',
'STUDENT_LOAN_DEBT' => '$6336.00',
'HAIR_COLOR' => 'Dark Brown',
'HEIGHT' => '6 feet, 10 inches',
'EMAIL' => ' creepy_Duarte_girl784@aol.com ',
'SKIN_COLOR' => 'Light Brown',
'RELIGION' => 'Stoicism',
'HOBBIES' => 'Golf, Tutoring Children, Photography',
'BIRTHDAY' => 'March 7, 1983',
'PHONE' => '(361) 734-5735',
'WEIGHT' => '327 lbs',
'AGE' => 35,
'MARITAL_STATUS' => 'married',
'DEGREE' => ', Bachelor of Accountancy, Master of Accountancy, Master of Accounting and Information Systems',
'ETHNICITY' => 'Chinese Australian',
'SCHOOL' => 'University of Minnesota-Duluth',
'NAME' => 'Maggie Davila',
'HIGHEST_LEVEL_OF_EDUCATION' => 'Masters Degree',
'BODY_TYPE' => 'Thick',
'EYE_COLOR' => 'Black',
'OCCUPATION' => 'Accountant',
'CHILDREN' => 5,
'ANNUAL_SALARY' => '$68077.00'
};

这是一个非常有趣的项目,即使它不是非常有用,我仍然在学习Perl方面学到了很多东西。 希望你喜欢。

翻译自: https://hackernoon.com/generating-mock-data-with-perl-7836a2ca0548

perl生成图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值