我已经使用Perl一段时间了,但今天我遇到了这段代码:
sub function1($$)
{
//snip
}
Run Code Online (Sandbox Code Playgroud)
这在Perl中意味着什么?
我最近开始学习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数组并使用<>运算符扫描各行,还是应该单独打开/扫描/关闭每个文件?如果这个处理存在于子程序而不是主函数中会有什么不同吗?
是否可以将两个列表传递给subPerl中的一个,例如:
sub Foo {
my(@list1,@list2) = @_;
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以制作@_两个列表,每个子列表都是所需的参数,我只是想知道是否有更清洁的方法
如何使用Perl将.wma和.wmv扩展名的驱动器上的所有文件重命名为.txt扩展名,无论它们在目录结构中有多深?
在我的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)
由于不了解这些风格,我只是停止使用它们.
但是,出于好奇,我想知道以下内容:
用一个例子更容易解释:
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进行了很长时间的编程,但直到最近我打开一个非常古老的Perl .plx文件时才会遇到这种语法
这些行阻止我升级到更现代的Perl版本.
sub help( $$ ){
}
Run Code Online (Sandbox Code Playgroud)
它影响我的原因是因为我收到一条错误消息,指出帮助函数在声明之前已被调用.知道如何在不删除($$)块的情况下解决这个问题吗?
我得到以下代码:
sub deg2rad ($;$) { my $d = _DR * $_[0]; $_[1] ? $d : rad2rad($d) }
谁能告诉我什么$;$意思?
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)
因为我在这里没有收到任何错误或警告.如果我可以阻止编译代码,那将是件好事.请指教.
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克服这个?