你会认为如果他们教你 Perl,他们会使用现代 Perl 语法。请不要把这个当成个人。毕竟,这就是你被教导的方式。但是,您应该了解新的 Perl 编程风格,因为它有助于消除各种编程错误,并使您的代码更易于理解。
- 使用编译指示
use strict;
和use warnings;
. 警告编译指示取代了-w
命令行上对标志的需要。它实际上更灵活,更好。例如,当我知道它们会成为问题时,我可以关闭特定的警告。use strict;
pragma 要求我使用my或our声明我的变量。(注意:不要声明 Perl 内置变量)。99% 的时间,你会使用我的. 这些变量称为词法作用域,但您可以将它们视为真正的局部变量。词法范围的变量在其范围之外没有任何值。例如,如果您my
在 while 循环中使用声明变量,则该变量将在循环退出后消失。
- 对
open
语句使用三参数语法:在下面的示例中,我使用三参数语法。这样,如果一个文件被调用>myfile
,我就可以从中读取。
- **使用本地定义的文件句柄。请注意,我使用
my $file_1_fh
而不是简单的 FILE_1_HANDLE。旧方式 FILE_1_HANDLE 是全局范围的,而且很难将文件句柄传递给函数。使用词法范围的文件句柄效果更好。
- 使用
or
andand
代替||
and&&
:它们更容易理解,并且它们的运算符优先级更好。他们更有可能不会引起问题。
- 始终检查您的
open
语句是否有效:您需要确保您的open
语句实际打开了一个文件。或者使用use autodie;
编译指示,如果语句失败,它将杀死你的程序open
(这可能是你想要做的。
而且,这是你的程序:
#! /usr/bin/env perl
#
use strict;
use warnings;
use autodie;
open my $file_1, "<", shift;
open my $file_2, "<", shift;
open my $output_fh, ">", shift;
for (;;) {
my $line_1 = <$file_1>;
my $line_2 = <$file_2>;
last if not defined $line_1 and not defined $line_2;
no warnings qw(uninitialized);
print {$output_fh} $line_1 . $line_2;
use warnings;
}
在上面的示例中,我从两个文件中读取,即使它们是空的。如果没有什么可读的,那么$line_1
or$line_2
就是未定义的。在我读完之后,我检查是否两者$line_1
都$line_2
未定义。如果是这样,我用last
结束我的循环。
因为我的文件句柄是一个标量变量,所以我喜欢把它放在花括号中,这样人们就知道它是一个文件句柄,而不是我想要打印出来的变量。我不需要它,但它可以提高清晰度。
注意no warnings qw(uninitialized);
. 这会关闭我将收到的未初始化警告。我知道要么$line_1
或$line_3
可能未初始化,所以我不想要警告。我在打印声明的正下方重新打开它,因为它是一个有价值的警告。
for
这是执行该循环的另一种方法:
while ( 1 ) {
my $line_1 = <$file_1>;
my $line_2 = <$file_2>;
last if not defined $line_1 and not defined $line_2;
print {$output_fh} $line_1 if defined $line_1;
print {$output_fh} $line_2 if defined $line_2;
}
无限循环是 while 循环而不是for循环。有些人不喜欢 C 风格的for
循环,并在他们的编码实践中禁止了它。因此,如果你有一个无限循环,你使用while ( 1 ) {
. 对我来说,可能是因为我来自 C 背景,for (;;) {
这意味着无限循环,并且while ( 1 ) {
需要额外的几毫秒来消化。
另外,我在打印它们之前检查是否定义$line_1
或定义。$line_2
我想这比使用no warning
and更好warning
,但我需要两个单独的打印语句,而不是将它们组合成一个。