Perl脚本在变量中创建模式

时间:2011-07-22 00:45:06

标签: perl variables

#! /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

由于

1 个答案:

答案 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) {...}