Domanda

Qual è lo scalare ".." operatore di utilizzo tipico? E 'selezionando solo i blocchi di testo?

Interessante esempio da me:

sub get_next {
    print scalar($$..!$$), "\n";
}

get_next for 1 .. 5;  # prints numbers from 1 to 5
get_next for 1 .. 5;  # prints numbers from 6 to 10
È stato utile?

Soluzione

La gente difficilmente sembrano sapere su di esso sulla base di domande qui, ma, sì, direi che l'utilizzo tipico è la selezione di blocchi di testo, sia con

while (<>) {
  print if /BEGIN/ .. /END/;
}

o

while (<>) {
  print if 3 .. 5; # prints lines 3 through 5
}

Quest'ultimo è zucchero sintattico per controllare contro l'ingresso di linea-numero ($.)

... if $. == 3 .. $. == 5;

che suggerisce lo strano aspetto

#! /usr/bin/perl -l

for ($_ = 1; $_ <= 10; ++$_) {
  print if $_ == 4 .. $_ == 7;
}

L'output del programma di cui sopra è

4
5
6
7

Se si dispone di una sorta di condizione bracketing, prova per essa in subs:

for (...) {
  do_foo($x,$y,$z) if begin($x) .. end($z);
}

Altri suggerimenti

Al di fuori di perl -e davvero non dovrebbe. E 'esoterica e funky. Vedere il mio post non nemmeno 24 ore fa su di esso su come si mantiene lo stato con chiamando contesto . Questo mi punse in un'applicazione reale del mondo, perché stavo cercando di essere intelligente e ha trovato quello che pensavo fosse un buon caso d'uso per esso.

Ecco un luogo in cui è necessario essere molto attenti a uso non intenzionale dell'operatore gamma scalare:. Rendimenti sottoprogramma

sub range {
     my $start = shift;
     my $end   = shift;

     return $start .. $end;
}

@foo = range( 1, 5 );  # ( 1, 2, 3, 4, 5 )
$foo = range( 1, 5 );  # False or maybe true.  Who knows.

Se si chiama questa subroutine in un contesto scalare, vi troverete in una sorpresa.

Dopo essere stato morso da qualche variante di questo problema, ora sempre assicurarsi assegno un ritorno lista in un array, ottenendo in tal modo comportamenti contesto array come per i miei sottomarini. Se ho bisogno di altro comportamento specifico contesto (molto raramente) che uso wantarray.

sub range {
     my $start = shift;
     my $end   = shift;

     my @result = $start .. $end;
     return @result;
}

Un altro utilizzo è contatori semplici come questo: perl -e 'foreach ( 1 .. 100 ){print"$_\n"}'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top