首先,总是,总是包括use strict;
and use warnings;
。
其次,使用缩进。我在工作中教过 Perl 课程,并且拒绝接受任何没有正确缩进的作业。事实上,我对此非常非常严格,因为我希望用户学习按标准编写代码(4 个空格缩进等)。它使您的程序更易于阅读和支持。
当我们这样做的时候,打破过长的行——尤其是在 StackOverflow 上。当您必须来回滚动时,很难阅读程序。
快速查看您的程序:
在 Perl 中,字符串和数字使用两组不同的布尔运算。这是因为字符串只能包含数字,但仍然是字符串。想象一下库存项目编号,例如1384
和993
。如果我将这些排序为字符串,则该1384
项目排在第一位。如果我按数字对它们进行排序,993
应该排在第一位。除了您使用的布尔运算之外,您的程序无法知道这一点:
Boolean Operation Numeric String
================= ======= ======
Equals == eq
Not Equals != ne
Greater Than > gt
Less Than < lt
Greater than/Equals >= ge
Less than/Equals <= le
另一个是or
, and
,||
并且&&
只能与两个布尔值一起使用。这不起作用:
if ( $a > $b or $c ) {
这是在说什么:
if ( ( $a > $b ) or $c ) {
因此,如果$c
是一个非零值,那么$c
将是true,并且整个语句都是正确的。你必须以这种方式做你的陈述:
if ( $a > $b or $a > $c ) {
另一件事是,在引用包含引号的字符串时使用qq(..)
and 。q()
这样,您不必在它们前面加上反斜杠。
print "The word is \"swordfish\"\n";
print qq(The word is "swordfish"\n);
而且,如果您use feature qw(say);
在程序的顶部使用,您将获得say
类似于的奖励命令print
,除了假定结束新行:
say qq(The word is "swordfish");
使用 时substr, $foo, -1
,您只查看最后一个字符。它不能是两个字符串:
if ( substr $word, -1 eq "ch" ) {
永远是假的。
长的 if 很难维持。我会使用for loop
(实际上不是,但让我们现在假装..):
#! /usr/bin/env perl
#
# Use these in ALL of your programs
#
use strict;
use warnings;
use feature qw(say);
#
# Use better, more descriptive names
#
my $standard_plural_suffix = 's';
my $uncommon_plural_suffix = 'es';
my $y_ending_plural_suffix = 'ies';
print "Enter a countable noun to get plural: ";
chomp (my $word = <STDIN>);
my $plural_form;
#
# Instead of a long, long "if", use a for loop for testing. Easier to maintain
#
for my $last_letter qw( b d c g r j k l m n p q r t v w e i o u) {
if ( substr($word, -1) eq $last_letter ) {
$plural_form = $word . $standard_plural_suffix;
last;
}
}
#
# Is it an "uncommon plural" test (single character)
#
if ( not $plural_form ) {
for my $last_letter qw(s x z) {
if ( substr($word, -1) eq $last_letter ) {
$plural_form = $word . $uncommon_plural_suffix;
last;
}
}
}
#
# Is it an "uncommon plural" test (double character)
#
if ( not $plural_form ) {
for my $last_two_letters qw(sh ch) {
if ( substr($word, -2) eq $last_two_letters ) {
$plural_form = $word . $uncommon_plural_suffix;
last;
}
}
}
if ( not $plural_form ) {
if ( substr($word, -1) eq 'y' ) {
chop ( my $chopped_word = $word );
$plural_form = $chopped_word . $y_ending_plural_suffix;
}
}
if ( $plural_form ) {
say qq(The plural of "$word" is "$plural_form");
}
else {
say qq(Could not find plural form of "$word");
}
你知道正则表达式吗?这些会比使用更好,substr
因为你可以一次测试多个东西。另外,我不会使用chop
,而是使用正则表达式替换:
#! /usr/bin/env perl
#
# Use these in ALL of your programs
#
use strict;
use warnings;
use feature qw(say);
#
# Use better, more descriptive names
#
my $standard_plural_suffix = 's';
my $uncommon_plural_suffix = 'es';
my $y_ending_plural_suffix = 'ies';
print "Enter a countable noun to get plural: ";
chomp (my $word = <STDIN>);
my $plural_form;
#
# Standard plural (adding plain ol' 's'
#
if ( $word =~ /[bdcgrjklmnpqrtvweiou]$/ ) {
$plural_form = $word . $standard_plural_suffix;
}
#
# Uncommon plural (adding es)
#
elsif ( $word =~ /([sxz]|[sc]h)$/ ) {
$plural_form = $word . $uncommon_plural_suffix;
}
#
# Final 'y' rule: Replace y with ies
#
elsif ( $word =~ /y$/ ) {
$plural_form = $word;
$plural_form =~ s/y$/ies/;
}
if ( $plural_form ) {
say qq(The plural of "$word" is "$plural_form");
}
else {
say qq(Could not find plural form of "$word");
}