Python Perl中的隐式循环

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

我正在尝试学习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 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地址。唯一的目的是生成一个随机数列表,输入一个更有趣的程序进行显示,完全出于教育目的。