我听说人们不应该&用来调用Perl subs,即:
function($a,$b,...);
# opposed to
&function($a,$b,...);
Run Code Online (Sandbox Code Playgroud)
我知道一个参数列表变成可选的,但在某些情况下哪些是适合使用的,&以及你绝对不应该使用它的情况?
当省略时,性能增加如何发挥作用&呢?
对于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)
有人可以从编译器的角度解释错误输出吗?我不明白为什么抱怨缺少操作员.
谢谢
我有一个在安装了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?
在我的一个脚本中,我使用了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示例是长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) 我正在将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中接下来的两行之间有什么区别:
PopupMsg("Hello");
&PopupMsg("Hello");
...
sub PopupMsg
{
subroutines code here...
}
Run Code Online (Sandbox Code Playgroud)
请注意,在某些情况下,我必须使用第一行,在某些情况下,第二行,其他方面,我得到一个错误.