DIY

DIY

我遇到了这两行,尽管我一直试图弄清楚它们的作用,但我仍然对它们在代码中的含义感到怀疑。我正在谈论的代码是:

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;

相关内容