Perl将变量传递给子例程
我正在尝试对现有的Perl脚本进行更改。我试图添加一个子程序,它在不同的地方被多次调用,并根据调用的位置打印不同的输出 基本上,它创建一个文件并为业务团队编写一些业务消息(我是其中的一员,因此我第一次使用Perl编写代码) 我想要/正在努力的是Perl将变量传递给子例程,perl,scripting,subroutine,Perl,Scripting,Subroutine,我正在尝试对现有的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;
}
现在我想在很多地方(在其他子例程中)调用这个子例程,就像这样(调用它时已经有一个失败条件):
以下是一些可以使其正常工作的更改:
my $message_file = 'some_file';
sub filemessage { # sub is spelled with a lowercase 's'
my ($arg1) = @_; # args are passed through the array @_
open(my $fh, '>', $message_file) or die "Error: $!"; # declare my $fh
print $fh "$arg1\n"; # \ not /
close $fh;
}
注意:模式
>
将截断文件,因此文件中最多只有一条消息。如果要附加到文件,请使用模式>
请检查以下代码段
最初的代码只需要一点点“爱”
- 您应该改为使用
,因为最后一个调用将覆盖每个>
子调用
- 为了调试目的,在消息中添加时间戳是很有用的
- 用退出代码
和带有特定错误代码的错误指示程序成功完成0
严格使用代码>和使用警告代码>在代码中,它将帮助您避免代码中的许多陷阱。当您执行可能导致错误或潜在意外结果的操作时,Perl将向您发出警告
注意:通过添加$filename
作为子例程可重用性增强的参数,使用相同的子例程代码在各种文件中写入消息(有时对于调试非常有用)
产出
Mon May 24 01:23:19 2021 INFO: my_prog is started
Mon May 24 01:23:19 2021 INFO: my_prog is running
Mon May 24 01:23:19 2021 ERROR: my_prog immitage some error
Mon May 24 01:23:19 2021 INFO: my_prog is done
参考文献:
你很接近
在Perl中,子例程是用sub
关键字(注意小写的“s”)创建的
换行符转义序列是\n
,而不是/n
现在,我们喜欢使用词法变量作为文件句柄(除其他优点外,这将在变量超出范围时自动关闭文件)
使用
作为文件模式将在每次打开文件时创建一个新的空文件。因此,它将只包含最后添加的消息。切换到>
将附加消息
您应该检查对open()
的调用的返回值,如果失败,应采取适当的措施(通常终止程序是最佳选择)
您应该在某处声明并定义$message\u文件
。由于子例程访问外部变量不是一个好主意,因此您可能希望在子例程内部执行此操作
但你最大的问题是线路:
sub filemessage ($arg1)
传统上,Perl的子例程参数是在一个名为@
的数组中传递的,您需要自己提取它们
my ($arg1) = @_;
但是自从Perl5.20以来,有一个实验性的签名
特性,可以按照您所期望的方式工作
综合所有这些,我们最终得出以下结论:
# 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 "$arg1\n";
}
哦,你想要>
。您可能还想警告所有这些打开+关闭操作,改用刷新。@ikegami“>>”-我不确定OP是想在文件中添加一条消息还是附加一条消息。我将把这留给OP,但添加了一个注释。Args被传递到$j
?这不应该是$\uj]
?参数不作为$1
、$2
等传递。代码没有做它声称的事情<代码>$\u0]
应该在那里,而不是$1
。(或shift
)我以为你说他应该使用append>
。另外,die
消息中的换行符将防止错误打印发生死亡的行号,这很少是一个好主意。我不建议新手在普通功能使用起来非常简单的情况下使用实验功能。@TLP:The
是一个打字错误,我现在已经纠正了。我知道新线是干什么的,我是故意加上去的。在生产环境中,我可能会使用croak
而不是die
因为对于这样一个常用的子例程,调用子例程的位置通常比子例程中的行更有用。我认为这是一个实验性的特性,它使Perl的工作更加符合非Perl程序员的期望,因此我认为它非常值得推荐(另外,我相信它很快就会脱离实验状态)。
sub filemessage ($arg1)
my ($arg1) = @_;
# 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 "$arg1\n";
}