0

我正在尝试制作一个类似于此 php 函数的 perl 子例程。

private function writeOutput($msg, $type) {
                  echo date("H\:i\:s") . " - [$type] .  > $msg\n";
          }

我需要一点帮助来定义$msgand $type

sub WriteOutput {
    $sec = sprintf ("%02d", $sum%60);
    $mins = sprintf("%02d", ($sum%3600)/60);
    $hrs = int($sum/3600);
    print "[$hrs:$mins:$sec]:[$type]>: $msg";
}
4

3 回答 3

3

据我了解,您的问题是关于将参数传递给 Perl 子例程。

Perl 将传递给子程序的参数存储在特殊变量@_中。在子例程的开头添加以下行。

my ($msg, $type) = @_;

并调用这个子程序

writeOutput("test", "type1");

Bdw,我希望您不要在这里尝试使用全局变量,因为my缺少。

除此之外,不清楚是什么$sum

于 2013-10-27T17:52:32.650 回答
2

让我们看一下您的 PHP 子例程:

private function writeOutput($msg, $type) {
    echo date("H\:i\:s") . " - [$type] .  > $msg\n";
}

首先,Perl 没有内置的日期格式化程序。相反,您必须使用模块来处理日期。此外,您在名为$msgand的函数中使用了两个参数$type。Perl 在函数调用中不使用函数参数。相反,您使用shift

use Time::Piece;      # A nice way to handle datetime. Included since Perl 5.10
use feature qw(say);  # Better than `print`. Included since Perl 5.10

sub write_output {
    my $msg        = shift;
    my $type       = shift;

    my $time = Time::Piece->new(localtime);
    say $time->hms . " - [$type] .  > $msg";
}

shift命令是获取函数输入参数的标准方式。Time::Piece是自 Perl 5.10 以来处理时间的标准 Perl 模块。这是一个面向对象的模块。->类似于大多数其他语言中的。根据当前时间my $time = Time::Piece->new(localtime);创建一个新对象。Time::Piece使用格式打印出时间$time->hms的方法。hmsHH:MM:SS

注意mywhich 声明和本地化变量的使用(PHP 没有真正拥有的东西)。您应该始终拥有use strict;use warnings;在您的所有 Perl 程序上。然后,您必须使用my.

请注意,在 Perl 中,变量的标准方式是使用全部小写并使用下划线作为分隔符。这取自Damian Conway 的Perl Best Practices。您可能同意也可能不同意 Conway 的所有编码标准,但标准的好处之一是每个人都使用它们,这使得与其他人的代码一起工作变得更好——无论您是否喜欢它们。

于 2013-10-27T18:01:12.413 回答
1

对于 PHP 中的这个函数:

private function writeOutput($msg, $type) {
   echo date("H\:i\:s") . " - [$type] .  > $msg\n";
}

Perl 提供了做同样事情的可能性:

use POSIX qw(strftime);

sub WriteOutput {
  my($msg, $type) = @_;
  my $date = strftime("[%H:%M:%S]", localtime);
  print "$date:[$type]>: $msg";
}

WriteOutput "Ok", "Not OK?";

给出:

[19:12:01][Not Ok?]>: Ok
于 2013-10-27T18:13:01.210 回答