2013-11-15 2 views
2

Я изучаю Perl, и у меня есть 2 примера того, как выполнить одну и ту же задачу, я просто смущен тем, как написан сценарий.Perl функции и подпрограммы

скрипт # 1

#!/usr/bin/perl 
use strict; 
use warnings; 
use IO::File; 

my $filename = "linesfile.txt"; # the name of the file 

# open the file - with simple error reporting 

my $fh = IO::File->new($filename, "r"); 
if(! $fh) { 
print("Cannot open $filename ($!)\n"); 
exit; 
} 

# count the lines 
my $count = 0; 
while($fh->getline) { 
$count++; 
} 

# close and print 
$fh->close; 
print("There are $count lines in $filename\n"); 

Script # 2

#!/usr/bin/perl 
# 
use strict; 
use warnings; 
use IO::File; 

main(@ARGV); 

# entry point 
sub main 
    { 
    my $filename = shift || "linesfile.txt"; 
    my $count = countlines($filename); 
    message("There are $count lines in $filename"); 
    } 

# countlines (filename) - count the lines in a file 
# returns the number of lines 
sub countlines 
{ 
my $filename = shift; 
error("countlines: missing filename") unless $filename; 

# open the file 
my $fh = IO::File->new($filename, "r") or 
    error("Cannot open $filename ($!)\n"); 

# count the lines 
my $count = 0; 
$count++ while($fh->getline); 

# return the result 
return $count;  
} 

# message (string) - display a message terminated with a newline 
sub message 
{ 
    my $m = shift or return; 
    print("$m\n"); 
} 

# error (string) - display an error message and exit 
sub error 
{ 
    my $e = shift || 'unkown error'; 
    print("$0: $e\n"); 
    exit 0; 
} 

Из сценария # 2 Я не понимаю, цель позади следующего

  1. основной (@ARGV);
  2. Почему мы нуждаемся в вспомогательном сообщении и ошибке sub?

Благодаря

ответ

3

Цель состоит в том, чтобы разделить код с точки зрения обязанностей, чтобы сделать его более читаемым и, следовательно, его легче поддерживать и расширять в будущем. Функция main предназначена как очевидная точка входа, для записи сообщения на экран отвечает message, а error - для записи сообщения об ошибке и завершения работы программы.

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

3

@ARGV массив список аргументов, которые поставляются в сценарий. Например, при вызове сценария, как это:

./script.pl one two three 

@ARGV массив будет содержать ("one", "two", "three").

Подпрограммыи sub error используются для отображения информации пользователю. Например:

message("There are $count lines in $filename"); 
error("Cannot open $filename ($!)\n"); 

Две линии выше вызова этих подпрограмм. Это всего лишь несколько более удобный способ информирования пользователя, поскольку могут быть сделаны последовательные корректировки вывода (например, добавление метки времени в сообщение или запись ее в файл).

3

Строка main(@ARGV); вызывает основную подпрограмму с параметрами, которые являются аргументами программы. Другие подпрограммы используются для повторного использования кода. Много раз вам понадобится написать тот же код, поэтому создание подпрограммы, содержащей этот код, очень полезно.

Смежные вопросы