Perl скрипт, создающий шаблон в переменных - PullRequest
2 голосов
/ 22 июля 2011
#! /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 top x 100 left), но как мне изменить его так, чтобы $ top выдавал 0, 2.5, 5 ... 100 вместо 0, 1, 2, ... 100 и $ left производят 0, 1,25, 2,5, ... 100 вместо 0, 1, 2, ... 100

Спасибо

1 Ответ

1 голос
/ 22 июля 2011

Цикл 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) {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...