我有perl功能我不知道它做什么? 我的perl是什么? @ARVG是什么意思?
sub getArgs
{
my $argCnt=0;
my %argH;
for my $arg (@ARGV)
{
if ($arg =~ /^-/) # insert this entry and the next in the hash table
{
$argH{$ARGV[$argCnt]} = $ARGV[$argCnt+1];
}
$argCnt++;
}
return %argH;}
答案 0 :(得分:2)
这是正确执行缩进的代码的重新格式化版本。这使它更容易阅读。我可以很容易地告诉我if
和循环的开始和结束位置:
sub getArgs {
my $argCnt = 0;
my %argH;
for my $arg ( @ARGV ) {
if ( $arg =~ /^-/ ) { # insert this entry and the next in the hash table
$argH{ $ARGV[$argCnt] } = $ARGV[$argCnt+1];
}
$argCnt++;
}
return %argH;
}
@ARGV
是传递给程序的内容。它是传递的所有参数的数组。例如,我有一个程序foo.pl
,我称之为:
foo.pl one two three four five
在这种情况下,$ARGV
设置为值("one", "two", "three", "four", "five")
列表。该名称来自C编程语言中的类似变量。
作者试图解析这些论点。例如:
foo.pl -this that -the other
会导致:
$arg{"-this"} = "that";
$arg{"-the"} = "other";
我没有看到min
。你的意思是my
?
这是一个复杂的讨论,通常涉及包变量与词汇范围变量,以及Perl如何存储变量。为了使事情变得更容易,我将给你一个不正确的,但在技术上错误的答案:如果你使用(严格)编译指示,你应该,你必须在my
之前声明你的变量可以使用。例如,这是一个简单的双线程序,这是错误的。你能看到错误吗?
$name = "Bob";
print "Hello $Name, how are you?\n";
请注意,当我将$name
设置为“Bob”时,$name
使用小写n
。但是,我在$Name
语句中使用了print
(大写 N )。现在看来,现在。 Perl将打印出“你好,你好吗?”我没注意到我使用了错误的变量名。如果在双线程序中很难发现这样的错误,想象一下在1000行程序中它会是什么样子。
通过使用 strict 并强制我使用my
声明变量,Perl可以捕获该错误:
use strict;
use warnings; # Another Pragma that should always be used
my $name = "Bob";
print "Hello $Name, how are you doing\n";
现在,当我运行程序时,出现以下错误:
全局符号“$ Name”需要显式包名称(
)
这意味着未定义$Name
,Perl指向该错误的位置。
当你定义这样的变量时,它们是在范围中,在块中定义它。块可以是包含在一组花括号中的代码,也可以是while
,if
或for
语句。如果您在这些变量之外定义my
的变量,则将其定义到文件的末尾。
因此,通过使用my
,变量仅在此子例程中定义。并且,$arg
变量仅在for
循环中定义。
还有一件事:
写这篇文章的人应该使用Getopt::Long模块。他们的代码中存在一个主要错误:
例如:
foo.pl -this that -one -two
在这种情况下,我的哈希看起来像这样:
$args{'-this'} = "that";
$args{'-one'} = "-two";
$args{'-two'} = undef;
如果我这样做了:
if ( defined $args{'-two'} ) {
...
}
我不会执行if
声明。
此外:
foo.pl -this=that -one -two
也会失败。
答案 1 :(得分:1)
@ARGV
是一个特殊变量(请参阅perldoc perlvar):
@ARGV
数组@ARGV包含用于的命令行参数 脚本。 $#ARGV通常是参数的数量减去1,因为 $ ARGV [0]是第一个参数,而不是程序的命令名本身。 请参阅$ 0获取命令名称。
Perl文档也可以从命令行获得:
perldoc -v @ARGV