gpt4 book ai didi

Perl 将变量传递给子程序

转载 作者:行者123 更新时间:2023-12-05 08:25:12 25 4
gpt4 key购买 nike

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

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

我想要/正在努力的是

Sub filemessage ($arg1) {
open(fh, '>', $message_file);
print fh "$arg1/n";
close fh;
}

现在我想在许多地方(在其他子例程内)调用这个子例程,就像这样(已经有一个失败条件基于它被调用):

filemessage ("failed due to reason1")
filemessage ("failed due to reason2")

最佳答案

Sub filemessage ($arg1) {
open(fh, '>', $message_file);
print fh "$arg1/n";
close fh;
}

你们非常亲密。

在 Perl 中,子例程是使用 sub 关键字创建的(注意小写的“s”)。

换行转义序列是\n,不是/n

如今,我们喜欢使用词法变量作为文件句柄(除其他优点外,这将在变量超出范围时自动关闭文件)。

使用 > 作为文件模式将在您每次打开文件时创建一个新的空文件。所以它只会包含最后添加的消息。切换到 >>> 将附加消息。

您应该检查调用 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 "$arg1\n";
}

关于Perl 将变量传递给子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67666794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com