2014-09-14 2 views
2

Итак, я новичок в Perl, и я обнаружил, что хотел запрограммировать обратный отсчет и действительно боролся, я нашел здесь код http://www.perlmonks.org/bare/?node_id=407922 и попытался выяснить, что происходит, но не удалось частично.Perl: Countdown

Проблема в том, я ненавижу, используя код, который я не понимаю, так надеялся, что кто-то сможет мне помочь с некоторыми его частями (код ниже от URL)

use 5.16.3; 
use strict; 

my $countdown = 1*60*60; # in seconds 

$| = 1; 

my $beginTime = time; 
my $endTime = $beginTime + $countdown; 

for (;;) 
{ 
    my $time = time; 
    last if ($time >= $endTime); 

    printf("\r%02d:%02d:%02d", 
     ($endTime - $time)/(60*60), 
     ($endTime - $time)/( 60) % 60, 
     ($endTime - $time)   % 60, 
    ); 

    sleep(1); 
} 

Ниже я пронумерован и воспроизводящие строки кода, где я их не понимаю

1: 1*60*60 Я понимаю 60 * 60, но почему 1?

2: $| = 1; Понятия не имею на это

3: for(;;) Не уверен в том, что ;; делают?

4: Не знаю, что это делает? (Математически или синтаксически).

printf("\r%02d:%02d:%02d", 
     ($endTime - $time)/(60*60), 
     ($endTime - $time)/( 60) % 60, 
     ($endTime - $time)   % 60, 

Спасибо за любую помощь или (попытался это уже без толку) полезно URL, где я мог бы исследовать сам

+2

1. 1 легко изменена в другое количество часов 2. perldoc perlvar 3. же, как 'в то время как (1) {}' 4. perldoc - f printf, '\ r' перемещает курсор в начало строки, готовящей перезаписывать старый контент. –

+0

Спасибо, напишите как ответ, и я могу отметить его как ответ – user3001499

ответ

6

Удачи вам в изучении Perl. Удостовериться, что вы понимаете, что происходит, это отличный способ учиться.

  1. The 1 не делает ничего из математической или код точки зрения. Я предполагаю, что автор поставил его, чтобы упростить переход на другое количество часов - просто замените 1 на 2 или что-то еще.

  2. У Perl есть множество «специальных переменных», которые влияют на работу. Вы, вероятно, встретитесь с одним или двумя из них, но не нуждаетесь в отдыхе, пока не начнете делать что-то сложное. Все они описаны в документации Perl, которую вы можете получить, набрав perldoc perlvar в своей командной строке или просмотрев this page. В этом случае $| является «autoflush», и установка его на 1 означает, что как только вы распечатываете что-то, он сразу же отправляется на выход. Без этого может произойти некоторая буферизация. Однако не беспокойтесь об этом.

  3. Существует несколько способов указать, что цикл должен продолжаться бесконечно, или пока что-то вроде last не остановит его. Один из них - for (;;), который является синтаксисом, который исходит из C. Когда вы начинаете смотреть на разные типы циклов, вы узнаете об этом немного подробнее. Но есть и другие способы делать петли в Perl.

  4. Здесь происходят математика.Чтобы найти разницу во времени в часах, разность во времени в секундах ($endTime - $time) делится на 3600. Это печатается с использованием формата %dprintf, который округляет его до целого. Таким образом, вы увидите что-то вроде 03: в начале вывода. Следующее выражение принимает разницу во времени в секундах, делит его на 60, чтобы получить разницу во времени в минутах. Но если это больше одного часа, число будет больше 60, поэтому вы не можете просто отобразить это. Perl modulo functiton - %, и это дает остаток, когда вы снова делите на 60. Это дает количество минут в разнице во времени. Аналогичный подход дает количество секунд. Если вы не знакомы с printf, вы можете найти информацию, набрав perldoc -f printf или просмотрев here.

Я надеюсь, что это начнет иметь смысл для вас. Поиграйте с этим, и попросите здесь снова с любыми другими вопросами.

1
  1. 1 можно легко изменить в другое количество часов
  2. perldoc perlvar (AutoFlush стандартный вывод)
  3. же, как while (1){} (бесконечный цикл)
  4. perldoc -f Printf, \r перемещает курсор в терминале к началу строки, готовящейся к перезаписыванию старого содержимого.
0

Код $| = 1 является немного загадочным, но имеет довольно прямое объяснение. $| является одной из специальных переменных Perl. Он контролирует, является ли запись в STDOUT буферной или небуферизованной.

Значение по умолчанию для этой переменной: 0, что означает, что вывод буферизирован. Это в текущем приложении означает, что ваш номер обратного отсчета не будет обновляться до конца обратного отсчета.

Установка $| = 1 (или любое ненулевое значение) изменяет выход STDOUT на небуферизованный, чтобы время перерисовывалось каждый раз при обновлении его значения.

Для официального слова по этому вопросу см perlfaq5: http://perldoc.perl.org/perlfaq5.html#How-do-I-flush%2funbuffer-an-output-filehandle%3f-Why-must-I-do-this%3f