Python Perl中的隐式循环
我正在尝试学习Perl,我想知道在下面的代码中是否有更好的等价物来生成四个整数(假IP地址)的列表: 在Python中,我会这样做Python Perl中的隐式循环,python,perl,for-loop,Python,Perl,For Loop,我正在尝试学习Perl,我想知道在下面的代码中是否有更好的等价物来生成四个整数(假IP地址)的列表: 在Python中,我会这样做 [int(random.randrange(100, 255)) for _ in range(4)] 尽管我很确定还有更好的方法可以做到这一点。我通常只做: map 100 + int rand 155, 1..4 我通常只做: map 100 + int rand 155, 1..4 与Python示例类似的另一种表示法可以是: # assign each
[int(random.randrange(100, 255)) for _ in range(4)]
尽管我很确定还有更好的方法可以做到这一点。我通常只做:
map 100 + int rand 155, 1..4
我通常只做:
map 100 + int rand 155, 1..4
与Python示例类似的另一种表示法可以是:
# assign each random octet to a list.
my @list;
push @list, int(rand(155) + 100) for (1 .. 4);
提问者通常会使用“针对每个人”的翻译方法,并询问是否有一种更优雅的方式来建议地图。我的偏好是坚持你的映射方法,但不要处理四个0的列表,而是使用范围
1。。4
正如ysth所示,代码以这种方式执行的操作更加清晰。另一种表示法,类似于您的Python示例,可以是:
# assign each random octet to a list.
my @list;
push @list, int(rand(155) + 100) for (1 .. 4);
提问者通常会使用“针对每个人”的翻译方法,并询问是否有一种更优雅的方式来建议地图。我的偏好是坚持你的映射方法,但不要处理四个0的列表,而是使用范围
1。。4
正如ysth所示,代码以这种方式执行的操作更加清晰。IPv4地址只是一个32位整数,因此我将使用
unpack('C4', pack('N' int(rand(2**32))))
(这并没有将每个八位字节限制为100..255,但这样做毫无意义。)
请注意,某些系统的rand
的熵小于32位
>perl -V:randbits
randbits='15';
在这些系统上,如果使用rand
,代码将不可能返回某些IP地址(无论使用何种技术)。在本例中的系统中,rand
只能返回4294967296个地址中的32768个
CPAN上的库提供了具有更多熵的随机数生成器。IPv4地址只是一个32位整数,所以我使用
unpack('C4', pack('N' int(rand(2**32))))
(这并没有将每个八位字节限制为100..255,但这样做毫无意义。)
请注意,某些系统的rand
的熵小于32位
>perl -V:randbits
randbits='15';
在这些系统上,如果使用rand
,代码将不可能返回某些IP地址(无论使用何种技术)。在本例中的系统中,rand
只能返回4294967296个地址中的32768个
CPAN上的库提供了具有更多熵的随机数生成器。我将尝试根据您的Python代码所做的工作来转换它
my @ip = qw(0 0 0 0); #create 4 member array
foreach my $number(@ip) {
$number += int( rand(155) + 100 );
}
print "Your IP array is currently '@ip'\n";
my $ip_joined = join '.', @ip; #create period separated string from the array
print "Your joined IP string is $ip_joined\n";
如果出于某种原因,您真的想尽量减少行数,您可以通过去掉一些漂亮的空白,将其减少到每个循环的一行:
my @ip = qw(0 0 0 0); #create 4 member array
foreach my $number(@ip) { $number += int(rand(155) + 100) }
从这个角度看,它确实看起来像一个映射循环:
my @ip = qw(0 0 0 0); #create 4 member array
@ip = map { int(rand(155) + 100) } @ip;
此外,映射的{}可以替换为映射表达式与其应用的列表之间的简单逗号:
my @ip = qw(0 0 0 0); #create 4 member array
@ip = map int(rand(155) + 100), @ip;
我将尝试根据我认为您的Python代码正在做的事情来转换它
my @ip = qw(0 0 0 0); #create 4 member array
foreach my $number(@ip) {
$number += int( rand(155) + 100 );
}
print "Your IP array is currently '@ip'\n";
my $ip_joined = join '.', @ip; #create period separated string from the array
print "Your joined IP string is $ip_joined\n";
如果出于某种原因,您真的想尽量减少行数,您可以通过去掉一些漂亮的空白,将其减少到每个循环的一行:
my @ip = qw(0 0 0 0); #create 4 member array
foreach my $number(@ip) { $number += int(rand(155) + 100) }
从这个角度看,它确实看起来像一个映射循环:
my @ip = qw(0 0 0 0); #create 4 member array
@ip = map { int(rand(155) + 100) } @ip;
此外,映射的{}可以替换为映射表达式与其应用的列表之间的简单逗号:
my @ip = qw(0 0 0 0); #create 4 member array
@ip = map int(rand(155) + 100), @ip;
在这种情况下,使用
map()。您可能希望将列表(0,0,0,0)
替换为范围1..4
,就像@ysthf给出的答案一样。出于某种原因,当我测试它时,使用1..4不能与perl-e
一起使用。它一直声称在语句末尾的分号后面有编译错误,但遵守了显式列表。奇怪的是,我只是做了以下操作(在Windows上,Perl 5.10):Perl-e“print join.”,map 100+int rand 155,1..4“
,并使用map()打印了254.139.105.133
在这种情况下非常适合。您可能希望将列表(0,0,0,0)
替换为范围1..4
,就像@ysthf给出的答案一样。出于某种原因,当我测试它时,使用1..4不能与perl-e
一起使用。它一直声称在语句末尾的分号后面有一个编译错误,但遵守了显式列表。奇怪的是,我只是做了以下操作(在Windows上,Perl 5.10):Perl-e“print join.”,map 100+int rand 155,1..4“
,并打印了254.139.105.133
。也许我应该说“IP spec”地址。实际上只是一个由四个三位数整数组成的列表。如何以及为什么打包/解包工作?那是什么???IPv4地址只是一个32位的数字。w.x.y.z中的w,x,y,z代表IP地址四个字节中的每个字节的值。只是一个数字列表,可以是IP地址,或者看起来像IP地址。唯一的目的是生成一个随机数列表,输入到一个更有趣的程序中显示,完全出于教育目的。也许我应该说“IP规范”地址。实际上只是一个由四个三位数整数组成的列表。如何以及为什么打包/解包工作?那是什么???IPv4地址只是一个32位的数字。w.x.y.z中的w,x,y,z代表IP地址四个字节中的每个字节的值。只是一个数字列表,可以是IP地址,或者看起来像IP地址。唯一的目的是生成一个随机数列表,输入一个更有趣的程序进行显示,完全出于教育目的。