Perl将变量传递给子例程

Perl将变量传递给子例程,perl,scripting,subroutine,Perl,Scripting,Subroutine,我正在尝试对现有的Perl脚本进行更改。我试图添加一个子程序,它在不同的地方被多次调用,并根据调用的位置打印不同的输出 基本上,它创建一个文件并为业务团队编写一些业务消息(我是其中的一员,因此我第一次使用Perl编写代码) 我想要/正在努力的是 Sub filemessage ($arg1) { open(fh, '>', $message_file); print fh "$arg1/n"; close fh; } 现在我想在很多地方(在其他子例程中)调

我正在尝试对现有的Perl脚本进行更改。我试图添加一个子程序,它在不同的地方被多次调用,并根据调用的位置打印不同的输出

基本上,它创建一个文件并为业务团队编写一些业务消息(我是其中的一员,因此我第一次使用Perl编写代码)

我想要/正在努力的是

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