O que faz '(…)? = $ 1: $ 2 'faz em Perl?

3

Me deparei com essas duas linhas e, embora tenha tentado descobrir o que elas fazem, ainda tenho dúvidas sobre o significado delas no código. A parte do código de que estou falando é:

my $mapped_from = ($num_phones_in == 60)? = $1 : $2;
my $mapped_to = ($num_phones_out == 48)? = $2 : $3;

Eu realmente não entendo o que é uma variável entre parênteses seguida por um ponto de interrogação do () ?. E também não sei o que esses dois números com cifrão (como variáveis) separados por cólon significam.

Para dar mais detalhes sobre o código, nesta parte estou trabalhando com um arquivo assim:

ah X /
au u aU

Onde as colunas possuem 60, 48 e 39 linhas respectivamente. Eu realmente apreciaria se alguém pudesse me dar uma pista, já que estou um pouco perdido.

    
por little_mice 27.01.2018 / 12:35

3 respostas

14
my $mapped_from = ($num_phones_in == 60)? = $1 : $2;

Isso é um erro de sintaxe. O test ? val_true : val_false é o "operador ternário" , um formulário em linha de uma instrução if-else . Se test for true, ele será avaliado como val_true e se test for falso, ele será avaliado como val_false part. O ponto de interrogação não tem nada a ver com o parêntese. Mas = $1 não é uma expressão válida.

Sem o = extra, ($num_phones_in == 60)? $1 : $2; verificaria se $num_phones_in é sessenta e devolve $1 ou $2 em conformidade.

$1 e $2 (etc.) são variáveis que se referem ao conteúdo dos grupos de captura na regex anterior. Se você fez "afoob" =~ /a(.*)b/ , então $1 conteria foo . Veja Variáveis relacionadas a expressões regulares no perlvar .

    
por 27.01.2018 / 12:51
6

O ? : é chamado de operador ternário e é considerado um dos operadores mais abusados em qualquer linguagem moderna. (Operadores ternários aninhados, particularmente.) Essas duas linhas são equivalentes:

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

if ($a > 9) { $value = 10 } else { $value = 0 };

Os $1 e $2 que você também pergunta são o resultado de correspondências entre colchetes na Expressão Regular mais recente. Por exemplo,

$a = 'Hello world. 1+2 is 3';
$a =~ /(\w+).*?(\d+)/;
print "1=$1, 2=$2\n";.   # "1=Hello, 2=1"
    
por 27.01.2018 / 12:57
0

DIY

Meta-resposta: descubra por si mesmo.

Perl tem o modo de depuração muito bacana. Você pode entrar assim:

perl -de1

(Este é apenas um atalho prático para -d (modo de depuração) e -e 1 (executa a instrução "1"), que é um não-trivial com o benefício da quantidade mínima de caracteres para digitar).

Em seguida, você é solicitado com um depurador onde você pode inserir o código perl que será executado imediatamente. Tente isto:

$num_phones_in = 10;
my $mapped_from = ($num_phones_in == 60)? = $1 : $2;

Você receberá um erro de sintaxe imediatamente. O segundo = precisa desaparecer. E para uma boa legibilidade, remova todo o espaço para o operador ?: ou adicione espaços, o que você quiser. Perl não se importa, mas seus colegas vão.

my $mapped_from = ($num_phones_in == 60)?$1:$2;
my $mapped_from = ($num_phones_in == 60) ? $1 : $2;
    
por 28.01.2018 / 10:16

Tags