2013-07-11 4 views
-3

Используя пример, пусть начало перл программа следующим образом:Perl: Вызов метода модуля внутри []

use strict; 
use warnings; 
use Time::HiRes; 

В чем разница между

my $request_start_epoch = [Time::HiRes::gettimeofday]; 

и

my $request_start_epoch = Time::HiRes::gettimeofday; 

?

+0

Как вы думаете, какая разница? – TLP

+1

'Time :: HiRes :: gettimeofday' возвращает два целых числа (целые секунды с эпохи, микросекунды с начала текущей секунды) в контексте списка и число с плавающей запятой (секунды с эпохи) в скалярном контексте. – mob

+0

Я взял на себя смелость довести этот код до сути вопроса, удалив конструкторский код. – innaM

ответ

4

Первый вызов функции в контексте списка, сбор анонимного массива, содержащего элементы возвращенного списка, и устанавливает $request_start_epoch в ссылку на этот массив.

Последний вызывает функцию в скалярном контексте и сохраняет возвращаемое значение в $request_start_epoch.

Это почти всегда будет отличаться; единственное время, когда они будут одинаковыми, - это то, что поведение функции в скалярном контексте состоит в том, чтобы завершать результаты своего контекста-списка в анонимном массиве и возвращать ссылку на него. Я никогда не видел ни одного метода, написанного так, но я уверен, что кто-то где-то это сделал в какой-то момент!

+0

Я видел несколько краснеющих злоупотреблений 'wantarray'. –

+0

@ruakh спасибо за объяснение. я как-то понял, что для этого случая первый более естественный. – ado

+0

хотя за cpan «gettimeofday Возвращает 2-элементный массив со второй и микросекундами с эпохи». поэтому я бы пошел на более поздний – ado

0

Скобки [] конвертировать то, что возвращается gettimeofday в ссылку массива. В вашем случае это будет массив из одного элемента.

Создание ссылки на массив.

$arr_ref = [ 1,2,3,4,5 ]; 

Откладывая это.

@{ $arr_ref }; 

Доступ к элементу.

$ { $array_ref }[0] 
+3

Я думаю, что чаще всего писать '@ $ arr_ref' и' $ arr_ref -> [0] '. – ruakh