2016-06-21 6 views
0

У меня нет опыта работы в Perl вообще, а также новичок в PHP. Мне нужно перенести старую систему компании с помощью Perl на новую с помощью PHP. Вот код в Perl я не понял:переход от perl к php

while (my $data=$query->fetchrow_hashref) { 
     push @oid_list, $data->{oid}; 
     push @{$snmp_order->{$sensor}}, $data->{function}; 
     $oid_hash->{$sensor}->{$data->{function}}->{oid}=$data->{oid}; 
     $oid_hash->{$sensor}->{$data->{function}}->{scale}=$data->{scale}; 
    } 

Может кто-то объяснить, что делает код означает, и что он будет в PHP? Кроме того, что означает $a->{$b} в Perl?

Я пытался понять это с 3 дней, но все еще испытываю трудности с этим.

+0

Спросите у парня, который его разработал, может быть? –

+0

@CaelanGrgurovic Я не знаю, где вы работали в прошлом, но со мной слишком часто случалось, что оригинального программиста уже не вокруг, чтобы помочь! –

+1

[perlreftut] (http://p3rl.org/perlreftut), [perlref] (http://p3rl.org/perlref), [perllol] (http://p3rl.org/perllol), [perldsc] (http://p3rl.org/perldsc). – choroba

ответ

3

Я не использую PHP, но я пытаюсь объяснить код в целом:

# while there is data in the object that is returned by calling the method "fetchrow_hashref" of the object $query: it means, get a single data row from the database 
while (my $data=$query->fetchrow_hashref) { 

    # add the value stored in field "oid" from the hash "data" to array "oid_list" 
    # what is hash? kind of array indexed by strings. Red more about hashes here: http://perlmaven.com/perl-hashes 
    push @oid_list, $data->{oid}; 

    # add the value stored in field "function" of the hash "data" to 
    # an array that is found in a reference, which reference is stored in hash "snmp_order" under 
    # a field that is named the same as the value of variable $sensor 
    push @{$snmp_order->{$sensor}}, $data->{function}; 

    # now: the data->oid is added to oid_hash. I will use array notation to explain where it lands: 
    # oid_hash[$sensor][$data->{function}][oid] = $data->{oid} 
    $oid_hash->{$sensor}->{$data->{function}}->{oid}=$data->{oid}; 

    # oid_hash[$sensor][$data->{function}][scale] = $data->{scale} 
    # $sensor and $data->{function} are variables! 
    $oid_hash->{$sensor}->{$data->{function}}->{scale}=$data->{scale}; 
} 

Вы можете прочитать больше о Perl хэши, например, здесь (я повторюсь): http://perlmaven.com/perl-hashes

+0

Ах, вы были быстрее :) – Otterbein

+2

Хорошо иметь больше точек зрения :) – Piotr

+0

Большое вам спасибо! @ Петр действительно помогает мне –

3

Ну, так как я не php-программист, я просто могу сказать вам, что означает Perl-код. Может быть, это поможет вам немного дальше!

#an query to the Database was fired through the DBI-module from Perl 
#the result is temporarily stored in the $query but has to be fetched 
#before further use. Since the result could contain multiple rows the $data 
#is filled with each row while the ->fetchrow_hashref() function returns a hash of 
#data representing one returned row of the query. The keys of the hash are the column 
#names of the database-table 
while(my $data = $query->fetchrow_hashref){...} 

@ указывает массив в Perl. Таким образом, @oid_list рассматривается как один. Поэтому в него можно нажать значение $data->{oid} (push @oid_list, $data->{oid}).

Синтаксис $data->{oid} немного сложнее. Представьте себе, что $data является ссылкой (просто указателем) на хеш (или на других языках, таких как Java, называемых Map). Но вы скорее хотите получить доступ к хеш-адресу за этой ссылкой. Таким образом, вы используете -> в разыменовываете указатель и получаете доступ к реальному хешу, указывающему на $data. К $data->{oid} вы получаете значение за ключом oid в Hashreferenceby $data.

Аналогичная вещь происходит в push @{$snmp_order->{$sensor}}, $data->{function};. Но здесь вам сначала нужно получить доступ к реальному массиву за ссылкой $snmp_order->{$sensor}. Здесь ключ ссылочного хеша содержит ссылку с массивом, которая получает в нее значение $data->{function};.

Остальная часть кода является видом этих двух вещей. Программист просто назначает разные значения из выбранной строки базы данных $data на разные ключи большой хэш-справки $oid_hash. В пределах {} вы всегда найдете имя ключа, к которому осуществляется доступ.