'(...) 是什么意思?= $1 : $2' 用 Perl 做什么?

lit*_*ice 4 perl

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

my $mapped_from = ($num_phones_in == 60)? = $1 : $2;
my $mapped_to = ($num_phones_out == 48)? = $2 : $3;
Run Code Online (Sandbox Code Playgroud)

我真的不明白括号之间的变量是什么,后跟问号 do ()?。而且我也不知道这两个用冒号分隔的美元符号(作为变量)是什么意思。

为了向您提供有关代码的更多详细信息,在这一部分中,我正在处理一个如下所示的文件:

ah X /
au u aU
Run Code Online (Sandbox Code Playgroud)

其中列分别有 60、48 和 39 行。如果有人能给我一个线索,我真的很感激,因为我有点迷失了。

ilk*_*chu 14

my $mapped_from = ($num_phones_in == 60)? = $1 : $2;
Run Code Online (Sandbox Code Playgroud)

那是语法错误。该test ? val_true : val_false“三元运算符”,一个的内联形式if-else声明。如果test为真,则对val_true零件求值,如果test为假,则对val_false零件求值。问号与括号无关。但= $1不是一个有效的表达。

如果没有额外的=($num_phones_in == 60)? $1 : $2;将检查是否$num_phones_in为六十,并相应地返回$1或返回$2

$1$2(等)是引用前一个正则表达式中捕获组内容的变量。如果你这样做了"afoob" =~ /a(.*)b/,那么$1将包含foo. 请参阅perlvar 中与正则表达式相关的变量


roa*_*ima 6

? :被称为三元运算符,并且被认为是在任何现代语言滥用最多的运营商之一。(特别是嵌套的三元运算符。)这两行是等价的:

$value = ($a > 9) ? 10 : 0;

if ($a > 9) { $value = 10 } else { $value = 0 };
Run Code Online (Sandbox Code Playgroud)

$1$2你还问是在最近的正则表达式匹配括起来的结果。例如,

$a = 'Hello world. 1+2 is 3';
$a =~ /(\w+).*?(\d+)/;
print "1=$1, 2=$2\n";.   # "1=Hello, 2=1"
Run Code Online (Sandbox Code Playgroud)

  • @JeffSchaller,Perl 子程序在`@_` 数组中使用它们的参数,在`@ARGV` 中使用脚本。 (2认同)