我遇到了这两行,尽管我一直试图弄清楚它们的作用,但我仍然对它们在代码中的含义感到怀疑。我正在谈论的代码是:
my $mapped_from = ($num_phones_in == 60)? = $1 : $2;
my $mapped_to = ($num_phones_out == 48)? = $2 : $3;
我不太明白括号后面跟问号的变量是做什么的()?而且我也不知道这两个带有美元符号(作为变量)并用冒号分隔的数字意味着什么。
为了向您提供有关代码的更多详细信息,在这一部分中,我正在使用一个如下所示的文件:
ah X /
au u aU
其中列分别有 60、48 和 39 行。如果有人能给我一个线索,我真的很感激,因为我有点迷失了。
答案1
my $mapped_from = ($num_phones_in == 60)? = $1 : $2;
这是一个语法错误。是test ? val_true : val_false
“三元运算符”,语句的内联形式if-else
。如果test
为 true,则计算该val_true
部分,如果test
为 false,则计算该val_false
部分。问号与括号无关。但这= $1
不是一个有效的表达式。
如果没有额外的=
,($num_phones_in == 60)? $1 : $2;
将检查是否$num_phones_in
为 60,并相应地返回$1
或$2
。
$1
和$2
(等)是引用前面正则表达式中捕获组内容的变量。如果你这样做了"afoob" =~ /a(.*)b/
,那么$1
就会包含foo
。看perlvar 中与正则表达式相关的变量。
答案2
它? :
被称为三元运算符,据说是现代语言中最常被滥用的运算符之一。 (尤其是嵌套三元运算符。)这两行是等效的:
$value = ($a > 9) ? 10 : 0;
if ($a > 9) { $value = 10 } else { $value = 0 };
您$1
还$2
询问的是最新正则表达式中括号匹配的结果。例如,
$a = 'Hello world. 1+2 is 3';
$a =~ /(\w+).*?(\d+)/;
print "1=$1, 2=$2\n";. # "1=Hello, 2=1"
答案3
DIY
元答案:自己找出来。
Perl 有非常漂亮的调试模式。您可以这样输入:
perl -de1
(这只是-d
(调试模式)和-e 1
(执行语句“1”)的一个方便的快捷方式,这是一个简单的无操作,具有输入最少字符的优点)。
然后,系统会提示您使用调试器,您可以在其中输入将立即执行的 perl 代码。尝试这个:
$num_phones_in = 10;
my $mapped_from = ($num_phones_in == 60)? = $1 : $2;
您将立即收到语法错误。第二个=
需要离开。为了获得良好的可读性,可以删除?:
运算符的所有空格,也可以添加空格,无论您想要什么。 Perl 不在乎,但你的同事会在乎。
my $mapped_from = ($num_phones_in == 60)?$1:$2;
my $mapped_from = ($num_phones_in == 60) ? $1 : $2;