相关疑难解决方法(0)

函数声明"sub function($$)"是什么意思?

我已经使用Perl一段时间了,但今天我遇到了这段代码:

sub function1($$)
{
   //snip
}
Run Code Online (Sandbox Code Playgroud)

这在Perl中意味着什么?

perl prototype subroutine

6
推荐指数
2
解决办法
2845
查看次数

如果我手动设置Perl的@ARGV所以我可以使用<>打开,扫描,并关闭文件?

我最近开始学习Perl,我最近的任务之一就是搜索一堆特定字符串的文件.用户提供目录名作为参数,程序将搜索该目录中的所有文件以查找该模式.使用readdir()我已经设法构建了一个包含所有可搜索文件名的数组,现在需要搜索模式的每个文件,我的实现看起来像这样 -

sub searchDir($) {
    my $dirN = shift;
    my @dirList = glob("$dirN/*");
    for(@dirList) {
        push @fileList, $_ if -f $_;

    }
    @ARGV = @fileList;
    while(<>) {
        ## Search for pattern
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 如上所述,手动加载@ARGV数组并使用<>运算符扫描各行,还是应该单独打开/扫描/关闭每个文件?如果这个处理存在于子程序而不是主函数中会有什么不同吗?

perl file input

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

如何将两个列表传递给Perl子例程?

是否可以将两个列表传递给subPerl中的一个,例如:

sub Foo {
 my(@list1,@list2) = @_;

}
Run Code Online (Sandbox Code Playgroud)

我知道我可以制作@_两个列表,每个子列表都是所需的参数,我只是想知道是否有更清洁的方法

perl arguments function

5
推荐指数
2
解决办法
820
查看次数

使用Perl,如何重命名驱动器的所有子目录中的文件?

如何使用Perl将.wma和.wmv扩展名的驱动器上的所有文件重命名为.txt扩展名,无论它们在目录结构中有多深?

recursion perl rename

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

不鼓励的perl习语的起源:&x(...)和sub x($$){...}

在我的perl代码中,我之前使用过以下两种写作风格,我后来发现它们在现代perl中被劝阻:

# Style #1: Using & before calling a user-defined subroutine
&name_of_subroutine($something, $something_else);

# Style #2: Using ($$) to show the number of arguments in a user-defined sub
sub name_of_subroutine($$) {
  # the body of a subroutine taking two arguments.
}
Run Code Online (Sandbox Code Playgroud)

由于不了解这些风格,我只是停止使用它们.

但是,出于好奇,我想知道以下内容:

  • 这两种写作风格的起源是什么?(我敢肯定我自己没有想过这些款式.)
  • 为什么这两种写作风格在现代的perl中黯然失色?
  • 这些风格在某个时间点被认为是最佳实践吗?

perl coding-style

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

我可以将对象方法替换为不同对象上的不同方法吗?

用一个例子更容易解释:

my $o = SpecialEffects->new( "config" => 'a' );
my $p = SpecialEffects->new( "config" => 'b' );

$o->sound(); # aliased to fizz(); same as $o->fizz()
$p->sound(); # aliased to clonk(); same as $p->clonk()
Run Code Online (Sandbox Code Playgroud)

是否可以在Perl中执行此操作?也许使用一些typeglob或coderef技巧?

我试图保持SpecialEffects界面简单.我不想开始构建对象层次结构.该sound()方法是暴露的,只能稍微配置其行为.

我已经知道你可以使用别名,*sound = \&fizz;但据我所知,这是一个全局的东西,我希望它封装在对象中.

perl

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

子例程中的奇怪perl语法($$)

( $$ )这段代码做了多少剂量.我已经对Perl进行了很长时间的编程,但直到最近我打开一个非常古老的Perl .plx文件时才会遇到这种语法

这些行阻止我升级到更现代的Perl版本.

sub help( $$ ){

}
Run Code Online (Sandbox Code Playgroud)

它影响我的原因是因为我收到一条错误消息,指出帮助函数在声明之前已被调用.知道如何在不删除($$)块的情况下解决这个问题吗?

perl

4
推荐指数
2
解决办法
359
查看次数

$; $在Perl函数定义中意味着什么?

我得到以下代码:

sub deg2rad ($;$) { my $d = _DR * $_[0]; $_[1] ? $d : rad2rad($d) }

谁能告诉我什么$;$意思?

perl

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

是否可以在perl中阻止前向未声明的函数调用?

Perl对静态代码检查的支持有限,特别是它可以检查我们是否将适当数量的参数传递给函数.例如,这将导致错误:

use strict;
use warnings;
sub f($) {}
f(2, 3)

Too many arguments for main::f
Run Code Online (Sandbox Code Playgroud)

如果我们过早地调用f,我们会得到另一个有用的警告:

use strict;
use warnings;
f(2, 3)
sub f($) {}

main::f() called too early to check prototype
Run Code Online (Sandbox Code Playgroud)

这将导致错误:

use strict;
use warnings;
sub f($) {}
sub g() { f(2, 3) }

Too many arguments for main::f
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我们能够得到以下情况的消息:

use strict;
use warnings;
sub g() { f(2, 3) }
sub f($) {}
Run Code Online (Sandbox Code Playgroud)

因为我在这里没有收到任何错误或警告.如果我可以阻止编译代码,那将是件好事.请指教.

perl prototype

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

如何实现Perl中的map函数?

mapPerl中的函数是用Perl编写的吗?我只是无法弄清楚如何实现它.这是我的尝试:

use Data::Dumper;

sub Map {
    my ($function, $sequence) = @_;

    my @result;
    foreach my $item (@$sequence) {
        my $_ = $item;
        push @result, $function->($item);
    }
    return @result
}

my @sample = qw(1 2 3 4 5);
print Dumper Map(sub { $_ * $_ }, \@sample);
print Dumper map({ $_ * $_ } @sample);
Run Code Online (Sandbox Code Playgroud)

$_in $function是未定义的,但是如何map克服这个?

perl map

3
推荐指数
2
解决办法
1207
查看次数

标签 统计

perl ×10

prototype ×2

arguments ×1

coding-style ×1

file ×1

function ×1

input ×1

map ×1

recursion ×1

rename ×1

subroutine ×1