相关疑难解决方法(0)

我何时应该使用&调用Perl子例程?

我听说人们不应该&用来调用Perl subs,即:

function($a,$b,...);
# opposed to
&function($a,$b,...);
Run Code Online (Sandbox Code Playgroud)

我知道一个参数列表变成可选的,但在某些情况下哪些是适合使用的,&以及你绝对不应该使用它的情况?

当省略时,性能增加如何发挥作用&呢?

perl subroutine

48
推荐指数
3
解决办法
3万
查看次数

为什么语法`&name arg1 arg2 ...`不能用来调用Perl子程序?

对于Perl子例程,如果传递0参数,我可以使用4个表单来调用它.但是如果传递一个或多个参数,有一个我不能使用的表单,请看下面:

sub name
{
    print "hello\n";
}
# 4 forms to call
name;
&name;
name();
&name();

sub aname
{
        print "@_\n";
}
aname "arg1", "arg2";
#&aname "arg1", "arg2"; # syntax error
aname("arg1", "arg2");
&aname("arg1", "arg2");
Run Code Online (Sandbox Code Playgroud)

错误输出是

String found where operator expected at tmp1.pl line 16, near "&aname "arg1""
    (Missing operator before  "arg1"?)
syntax error at tmp1.pl line 16, near "&aname "arg1""
Execution of tmp1.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

有人可以从编译器的角度解释错误输出吗?我不明白为什么抱怨缺少操作员.

谢谢

syntax perl invocation subroutine

8
推荐指数
1
解决办法
89
查看次数

Perl的$ |的范围是什么?(OUTPUT_AUTOFLUSH)设置?

我有一个在安装了Perl 5.8.8的旧CentOS 5.6服务器上运行的Perl脚本.不幸的是,我无法升级操作系统或在此服务器上运行的Perl版本.

当我从命令提示符运行此脚本时,尽管$| = 1;脚本顶部有一个语句(在全局范围内),它似乎仍然缓冲输出到控制台(通过ssh会话).

写入日志文件STDOUT并由函数执行,例如:

#!/usr/bin/perl
$| = 1;

&writelog("Started...");

# Do work with lots of writelog'ing

&writelog("...Done.");

exit(0);

sub writelog {

    # This is greatly simplified for the purpose of this question

    my ($logentry) = @_;
    my $logfile = "/var/log/thelog.log";
    my $logline = "$logentry\n";
    print $logline;
    open (LOGFILE, ">>$logfile");
    print LOGFILE, "$logline";
    close (LOGFILE);
}
Run Code Online (Sandbox Code Playgroud)

值是否$|仅影响当前范围中的输出,即在此情况下脚本的全局范围?或者,在上面的例子中,它是否应该立即刷新STDOUT/ LOGFILE通过print语句writelog

perl

7
推荐指数
3
解决办法
223
查看次数

Perl的Getopt :: Long如何发现缺少强制参数的参数?

在我的一个脚本中,我使用了Getopt :: Long库.在程序开始时我打电话:

&GetOptions ('help', 'debug', 'user=s' => \$GetUser);
Run Code Online (Sandbox Code Playgroud)

前两个论点很简单:我通过分别检查$opt_help和发现它们的存在$opt_debug.然而第三个参数很棘手,因为我需要区分没有选项($ GetUser未定义,这对我来说没问题),单独使用"--user"($GetUser也是未定义的,但这次我要显示一个错误消息)和"--user FooBar"($GetUser接收'FooBar',我可以在进一步处理中使用).

如何在没有用户名的情况下区分不使用"--user"选项和单独使用它?

perl getopt-long

2
推荐指数
1
解决办法
225
查看次数

Perl正则表达式和参数

以下Perl示例是长Perl脚本的一部分.

此脚本从中获取结果ifconfig -a并打印IP地址.

有人可以解释如何$1获取IP地址吗?

而正则表达式是什么

$RESULTS =~ /addr:(\S+)\s+/
Run Code Online (Sandbox Code Playgroud)

手段?

  my $COMMAND = "ifconfig -a | grep inet | grep -v 127.0.0.1 | head -1";
  my $RESULTS = `$COMMAND`;
  chomp $RESULTS;
  #          inet addr:106.13.4.9  Bcast:106.13.4.255  Mask:255.255.255.0
  #          inet 106.13.4.9 netmask ffffff80 broadcast 106.13.4.127


if ( $RESULTS =~ /addr:(\S+)\s+/ ) {
    $IpAddress = $1;
}
elsif ( $RESULTS =~ /inet\s+(\S+)\s+/ ) {
    $IpAddress = $1;
}

print "IpAddress = $IpAddress\n";
Run Code Online (Sandbox Code Playgroud)

linux perl

1
推荐指数
1
解决办法
332
查看次数

是否可以在Perl中使用具有相同名称的散列,数组,标量?

我正在将perl脚本转换为python.
我之前没有使用perl语言,perl中的很多东西让我很困惑.
例如,在下面,opt首先被声明为标量,但再次声明为哈希.%opt = ();
是否可以在perl中声明标量和具有相同名称的哈希?

据我所知,这foreach $opt (@opts)意味着标量opt逐个获取数组opts的值.
opt此时是一个数组???
另外,什么$opt{$opt}意思?
$ opt {$ opt} 之外选择是一个哈希,并且选择*opt { $ opt }是一个标量?
我很困惑,请帮帮我...

sub ParseOptions
{
    local (@optval) = @_;
    local ($opt, @opts, %valFollows, @newargs);

    while (@optval) {
        $opt = shift(@optval);
        push(@opts,$opt);
        $valFollows{$opt} = shift(@optval);
    }

    @optArgs = ();
    %opt = ();

    arg: while (defined($arg = shift(@ARGV))) {
        foreach $opt (@opts) {
            if ($arg eq $opt) {
                push(@optArgs, $arg);
                if ($valFollows{$opt}) {
                    if (@ARGV …
Run Code Online (Sandbox Code Playgroud)

perl

1
推荐指数
1
解决办法
403
查看次数

Perl子程序与"&"(和号)之间有什么区别

Perl中接下来的两行之间有什么区别:

PopupMsg("Hello");

&PopupMsg("Hello");

...

sub PopupMsg
{
    subroutines code here...
}
Run Code Online (Sandbox Code Playgroud)

请注意,在某些情况下,我必须使用第一行,在某些情况下,第二行,其他方面,我得到一个错误.

perl subroutine

0
推荐指数
1
解决办法
292
查看次数

标签 统计

perl ×7

subroutine ×3

getopt-long ×1

invocation ×1

linux ×1

syntax ×1