Perl将变量传递给子程序
我正在尝试对现有的 Perl 脚本进行更改。我正在尝试添加一个在不同位置多次调用的子程序,并根据调用位置打印不同的输出。
基本上,它创建一个文件并为业务团队编写一些业务消息(我是其中的一员,因此是我第一次用 Perl 编码)。
我想要/正在尝试的是
Sub filemessage ($arg1) {
open(fh, '>', $message_file);
print fh "$arg1/n";
close fh;
}
Sub filemessage ($arg1) {
open(fh, '>', $message_file);
print fh "$arg1/n";
close fh;
}
现在我想在很多地方(在其他子例程内)像这样调用这个子例程(已经有一个失败条件基于它被调用):
filemessage ("failed due to reason1")
filemessage ("failed due to reason2")
回答
你非常接近。
在 Perl 中,子程序是用sub关键字创建的(注意小写的 's')。
换行符转义序列是n, 不是/n。
现在,我们喜欢使用词法变量作为文件句柄(这还有其他好处,当变量超出范围时会自动关闭文件)。
>每次打开文件时,使用as 文件模式都会创建一个新的空文件。所以它只会包含添加的最后一条消息。切换到>>将附加消息。
您应该检查调用的返回值open()并在失败时采取适当的措施(通常杀死程序是最好的选择)。
您应该在$message_file某处声明和定义。由于子例程访问外部变量是一个坏主意,因此您可能希望在子例程内部执行此操作。
但你最大的问题是这条线:
sub filemessage ($arg1)
传统上,Perl 的子程序参数是通过一个名为的数组传递的@_,您需要自己提取它们。
my ($arg1) = @_;
但是从 Perl 5.20 开始,有一个实验性signatures功能可以按照您的预期工作。
把所有这些放在一起,我们最终得到了这个:
# turn on signatures (put this with the other "use"
# statements at the top of your file).
use experimental 'signatures';
sub filemessage ($arg1) {
my $message_file = 'log.txt';
open(my $fh, '>>', $message_file)
or die "Can't open [$message_file]: $!n";
print $fh "$arg1n";
}