Perl函数和子例程

时间:2013-11-15 14:58:04

标签: perl

我正在学习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");

脚本#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. 为什么我们需要子消息和子错误?
  3. 谢谢

3 个答案:

答案 0 :(得分:3)

@ARGV数组是提供给脚本的参数列表。例如,在调用这样的脚本时:

./script.pl one two three

@ARGV数组将包含( "one", "two", "three" )

sub messagesub error子例程用于向用户显示信息。例如:

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

上面两行称这些子程序。它只是一种更好的通知用户的方式,因为可以对输出进行一致的调整(例如向消息添加时间戳或将其写入文件)。

答案 1 :(得分:3)

目的是根据职责分割代码,使其更具可读性,从而更易于维护和扩展。 main函数旨在作为明显的入口点,message负责将消息写入屏幕,error用于编写错误消息并终止程序。

在这种情况下,将一个简单的程序拆分为子程序并不多,但第二个脚本可能是一个教学工具,可以在一个简单的例子中显示程序的结构。

答案 2 :(得分:3)

main(@ARGV);正在调用带有参数的主子例程,这些参数是程序的参数 参数。 其他子程序用于拥有可重用的代码。有很多次你需要编写相同的代码,因此创建一个包含这段代码的子程序是非常有用的。