多年来,我自学了很多编程语言,包括 Perl。我发现一种学习工具是使用某种语言参考,以避免仅仅为了弄清楚起点而不得不阅读手册中的几个章节的挫败感。
另一个好的学习技巧是找到一个 Perl 程序,它的功能与您想要做的事情类似,然后通过摆弄它来逐步修改其行为,并在遇到困难时使用您的参考资料。最终,在您构思出想要做什么的想法,然后将其转化为一组编程指令之后,您就能够从头开始了。
几年前,在合作编写 Scribus 手册的过程中,我花了很多时间在 freenode.net 的 Scribus 频道上,与我的德国合作者以及其他主要居住在欧洲某处的人交谈。您最终会就各种主题进行大量对话,在世界任何地方您都会谈论天气,但当然他们谈论的是摄氏温度,而我体验的是华氏温度。所以我用 Perl 做了一个小程序来查看 14°C 是多少,或者也许我不告诉他们我的华氏温度,而是能够给他们一个摄氏温度的数字。
让我们用这个来谈谈 Perl。
#!/usr/bin/perl -w
print "\nThis is the program for Fahrenheit to Celsius\n
and Celsius to Fahrenheit temperature conversion\n\n";
$temp = $ARGV[0];
$f1temp = $temp . "°F";
$ctemp = ($temp - 32)* 5.0/9.0;
$rtemp = sprintf("%.1f", $ctemp);
$c1temp = $rtemp . "°C";
print "$f1temp is $c1temp\n\n";
$ftemp = $temp* 9.0/5.0 + 32;
$rtemp = sprintf("%.1f", $ftemp);
$c2temp = $temp . "°C";
$f2temp = $rtemp . "°F";
print "$c2temp is $f2temp\n\n";
我将其命名为 tempconv.pl
,因此首先要指出的是,您可以使用 .pl
扩展名来命名文件,以表明这是一个 Perl 脚本。接下来,看看第一行。它以以下字符开头:#!
这有一个名称,shebang,之后它会告诉您的计算机在哪里找到解释器,而 -w
是要求警告我在编写此脚本时可能犯的错误。这一行必须是脚本的第一行。
第二行只是给自己的一条小消息,以确认这是在做什么,当然这不仅是输出的一部分,而且当我查看文件时可以阅读它,所以在这种情况下,它是此脚本的完整文档。您反复看到的这个 \n
是为了让打印输出(在这种情况下是屏幕上)添加一个换行符或回车符。如果您稍微分解一下输出,会更容易阅读。我使用了双引号,它的行为与单引号不同。例如,单引号内的 \n
会按字面意思打印;它不会被解释,也不会创建新行。
第三行最终触及了我们想要运行它的核心内容。请注意所有这些以 $
开头的单词或单词片段。所有变量名都必须以特殊字符开头。 $
表示标量变量,或者换句话说,具有单个值的变量。 ARGV
是 Perl 使用的特殊变量名,用于引用程序运行时发送到脚本的任何输入。
实际上,我可以输入多个数字,例如 tempconv.pl 45 23 38
,在这种情况下,这三个值会创建一个数组 @ARGV
,我们可以从中指定 $ARGV[0]
,这将是 45,或 $ARGV[1]
为 23,依此类推。由于此脚本的编写方式,无论您包含多少个值都无关紧要,因为它只会使用第一个值。(稍后我们将回到这一点。)
要转换温度,请键入 tempconv.pl 45
以转换值 45。 ARGV
指的是该输入,即 45。
接下来,发生了一些有趣的事情。请注意我是如何将字符串值 45 °F
赋值给变量 $f1temp
的(句点是连接运算符,用于将这两者粘合在一起)。在下一行中,我获取相同的输入并对其执行数学运算。那么 45 是字符串还是数字?显然两者都是。您应该能够识别出将华氏温度转换为摄氏温度的公式 ($temp - 32)*9.0/5.0
。
剩下的就是打印结果,但我想确保它以带有一位小数的浮点数形式输出,这就是 sprintf
命令的作用。
此脚本的其余部分只是假设 45 是摄氏温度并将其转换为华氏温度,因此此脚本的总输出是
This is the program for Fahrenheit to Celsius and Celsius to Fahrenheit temperature conversion 45°F is 7.2°C 45°C is 113.0°F
我这样做可能看起来很奇怪,但实际情况是,最初我制作了两个脚本,一个名为 celsius.pl
,另一个名为 fahren.pl
,每个脚本只进行一次计算。问题是过了一段时间后,我忘记了 celsius.pl
是想要一个摄氏温度值还是正在生成一个摄氏温度值。在我看来,最简单的事情就是将操作组合起来,给出两个答案并保持用法简单。为了进一步简化,我还创建了一个在 Bash 中运行的别名,称为 temp
,这不仅节省了输入整个文件名的时间,还节省了输入其路径的时间。
一个不太困难的补充是创建一个循环,以便可以输入多个值,并进行串行计算。主要考虑因素是检测已输入多少个值,以避免生成错误。更重要的是,我没有看到这方面的需求。但是,让我们在此处提及您可能已经注意到 Perl 的一个特性,即除了第一个语句外,每行都以分号结尾。我应该限定地说,每个可执行语句都以分号结尾。例如,假设我们想在末尾添加一条基于条件的可选消息
if ($rtemp > 99) {
print "Wow! That's hot!\n\n";
}
可执行部分仍然以分号结尾,但 if 条件有其自身的结构,使用花括号来包含如果满足条件将执行的所有行。通常,这些行会缩进,以便在您阅读脚本时更容易突出显示。
很容易想象将您在此处看到的内容用于制作各种其他小程序来转换重量、距离、排版尺寸等等,事实上,我已经做了很多这样的事情。
9 条评论