我正在学习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我不明白以下
背后的目的谢谢
答案 0 :(得分:3)
@ARGV
数组是提供给脚本的参数列表。例如,在调用这样的脚本时:
./script.pl one two three
@ARGV
数组将包含( "one", "two", "three" )
。
sub message
和sub error
子例程用于向用户显示信息。例如:
message("There are $count lines in $filename");
error("Cannot open $filename ($!)\n");
上面两行称这些子程序。它只是一种更好的通知用户的方式,因为可以对输出进行一致的调整(例如向消息添加时间戳或将其写入文件)。
答案 1 :(得分:3)
目的是根据职责分割代码,使其更具可读性,从而更易于维护和扩展。 main
函数旨在作为明显的入口点,message
负责将消息写入屏幕,error
用于编写错误消息并终止程序。
在这种情况下,将一个简单的程序拆分为子程序并不多,但第二个脚本可能是一个教学工具,可以在一个简单的例子中显示程序的结构。
答案 2 :(得分:3)
行main(@ARGV);
正在调用带有参数的主子例程,这些参数是程序的参数
参数。
其他子程序用于拥有可重用的代码。有很多次你需要编写相同的代码,因此创建一个包含这段代码的子程序是非常有用的。