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";
} 


以上是Perl将变量传递给子程序的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>