Преобразование Perl в Ruby (многомерные массивы) - PullRequest
0 голосов
/ 08 марта 2011

Я просто пытаюсь разобраться в создании многомерного массива из сценария perl, который я сейчас конвертирую в Ruby, у меня 0 опыта работы с Perl, так как я открыл свой первый сценарий Perl сегодня утром.

Вот оригинальный цикл:

my $tl = {};

for my $zoom ($zoommin..$zoommax) {

    my $txmin = lon2tilex($lonmin, $zoom);
    my $txmax = lon2tilex($lonmax, $zoom);
    # Note that y=0 is near lat=+85.0511 and y=max is near
    # lat=-85.0511, so lat2tiley is monotonically decreasing.
    my $tymin = lat2tiley($latmax, $zoom);
    my $tymax = lat2tiley($latmin, $zoom);

    my $ntx = $txmax - $txmin + 1;
    my $nty = $tymax - $tymin + 1;
    printf "Schedule %d (%d x %d) tiles for zoom level %d for download ...\n",
           $ntx*$nty, $ntx, $nty, $zoom
        unless $opt{quiet};
    $tl->{$zoom} = [];    

    for my $tx ($txmin..$txmax) {
        for my $ty ($tymin..$tymax) {
        push @{$tl->{$zoom}}, 
            { xyz => [ $tx, $ty, $zoom ] };
        }
    }

}

и то, что у меня есть в Ruby:

  tl = []

  for zoom in zoommin..zoommax

    txmin = cm.tiles.xtile(lonmin,zoom)
    txmax = cm.tiles.xtile(lonmax,zoom)

    tymin = cm.tiles.ytile(latmax,zoom)
    tymax = cm.tiles.ytile(latmin,zoom)

    ntx = txmax - txmin + 1
    nty = tymax - tymin + 1

    tl[zoom] = []

    for tx in txmin..txmax
      for ty in tymin..tymax
        tl[zoom] << xyz = [tx,ty,zoom]
        puts tl
      end
    end

  end

Часть, в которой я не уверен, вложена прямо вкорень циклов, push @{$tl->{$zoom}},{ xyz => [ $tx, $ty, $zoom ] };

Я уверен, что это будет очень просто для опытного программиста Perl, спасибо!`

1 Ответ

5 голосов
/ 08 марта 2011

Код Perl создает сложную структуру данных в $tl - хэш, массив, хэш, массив:

$tl{$zoom}[i]{xyz}[j] = $tx     # j = 0
$tl{$zoom}[i]{xyz}[j] = $ty     # j = 1
$tl{$zoom}[i]{xyz}[j] = $zoom   # j = 2

Так что я думаю, что ключевая строка в вашем коде Ruby должна быть такой:

tl[zoom] << { 'xzy' => [tx,ty,zoom] }

Обратите внимание, что корневой элемент ($tl) ссылается на хэш в коде Perl, а ваш код Ruby инициализирует его как массив. Эта разница может вызвать проблемы у вас, в зависимости от значений, которые принимает $zoom.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...