#! /usr/bin/perl
use strict;
use warnings; #Always use these!
open (MYFILE, '>script2.txt');
my $world = 1;
for my $top (1 .. 100) {
for my $left (1 .. 100) {
print MYFILE "\#world$world \{
background: url(/images/1.png) 0 0 no-repeat;
float: left;
width: 1%;
height: 2%;
position: absolute;
top: $top\%;
left: $left\%;
z-index: -1;
margin-top: -10px;
margin-left: -10px;
\}
\#world$world:hover \{
background-position: 0 -20px;
cursor: pointer;
\}";
$world++;
}
}
close (MYFILE);
目前这个perl脚本生成10000个结果(100个顶部x 100左)但是如何修改它以便$ top生成0,2.5,5 ... 100而不是0,1,2,... .100和$ left产生0,1.25,2.5,... 100而不是0,1,2,...... 100
由于
答案 0 :(得分:1)
Perl的foreach
循环在很多情况下很有用,但是当你需要对增量进行高级控制时,C风格的循环是正确的工具:
for (my $top = 0; $top <= 100; $top += 2.5) {...}
$left
应该很容易理解。
perlsyn手册页包含有关不同循环样式的更多信息,以及与其控件相关的关键字。
最后,现代代码倾向于使用open
的三个参数形式以及词法文件句柄。将您的open
行更改为:
open my $file, '>', 'script2.txt' or die $!;
然后在其余代码中将MYFILE
替换为$file
。造成这种情况的原因有很多种,其中包括错误检查,防止文件句柄崩溃,自动关闭......在SO上搜索应提供详细信息。
正如ysth指出的那样,为了避免使用浮点数出现任何复合错误,您可以这样写:
my $low = 0;
my $high = 100;
my $step = 2.5;
my $reps = int (($high - $low) / $step);
for my $i (0 .. $reps) {
my $top = $i * $step;
...
}
你可以把它包装成一个函数:
sub range {
my ($low, $high, $step) = @_;
map {$low + $_ * $step} 0 .. int (($high - $low) / $step)
}
然后它就像:
一样简单for my $top (range 0 => 100, +2.5) {...}