Re: [Rio-pm] Percorrendo array
O ".." não cria uma lista temporária, então você não precisa do "while" no código abaixo. 09:09 < GabrielVieira> mantovani: "In the current implementation, no temporary array is created when the range operator is used as the expression in foreach loops" GabrielVieira++ 2013/1/29 Daniel de Oliveira Mantovani : > 2013/1/12 Thiago Glauco : >> 1-> de onde sua função tirou o @data? >> >> mas faça isso: >> >> my $i = 0; >> while($i <= $#data) { >> $i = 1 if $data[$i] eq $gi; >> ... >> > > Thiago, seu código é incompatível com o do autor acima. > > >> Evite usar labels. > Porque labels é uma má prática em Software Engineer ? Label é uma > feature poderosa que a linguagem oferece. > > sub array_find_position{$g=shift;return$_ if $f[$_]==$g for 0..$# } > > Se a lista for muito grande, > > sub array_find_position{$g=shift;$i=0;return$i if $f[$i]==$g while $i<=$# } > > []'s > >> >> regards. >> >> >> Em Sáb, 2013-01-12 às 20:37 +, Aureliano Guedes escreveu: >>> Era sim, mas resolvi tomar outro metodo. >>> >>> sub array_find_position{ >>> my $gi = shift; >>> my $position = 0; >>> LINE: foreach (@data){ >>> if ($_ eq $gi){ >>> last LINE; >>> } >>> else{ >>> $position++; >>> } >>> } >>> return $position; >>> } >>> >>> >>> > From: bla...@gmail.com >>> > Date: Sat, 12 Jan 2013 18:20:16 -0200 >>> > To: rio-pm@pm.org >>> > Subject: Re: [Rio-pm] Percorrendo array >>> > >>> > perl -E '@array=(1..10); for(my $i = 0; $i < 10; $i >>> ++){ if($array[$i] >>> > == 2){ $i = 5} if($array[$i] == 7) {$i = 10} say $array[$i]}' >>> > >>> > Tipo isso? >>> > >>> > 2013/1/12 Tiago Peczenyj : >>> > > nao use foreach. use for ou while p indice e altere-o qdo quiser p >>> avancar >>> > > ou voltar >>> > > >>> > > Em 12/01/2013 15:53, "Aureliano Guedes" >>> escreveu: >>> > >> >>> > >> Ola Monges, >>> > >> >>> > >> Me surgiu uma duvida nesse momento. >>> > >> >>> > >> Imagine que temos um array de 10 posições: >>> > >> my @a = qw(0 1 2 3 4 5 6 7 8 9); >>> > >> >>> > >> Então este array esta em um loop, no caso um foreach: >>> > >> >>> > >> foreach my $i (@a){ >>> > >> ... >>> > >> } >>> > >> >>> > >> Mas eu quero que se o valor dessa posição seja 6, por exemplo, o >>> array >>> > >> volte para segunda posição. >>> > >> >>> > >> Não sei se minha pergunta ficou estranha ou difícil de entender, >>> mas como >>> > >> eu faria isso?? >>> > >> >>> > >> ___ >>> > >> Rio-pm mailing list >>> > >> Rio-pm@pm.org >>> > >> http://mail.pm.org/mailman/listinfo/rio-pm >>> > > >>> > > >>> > > ___ >>> > > Rio-pm mailing list >>> > > Rio-pm@pm.org >>> > > http://mail.pm.org/mailman/listinfo/rio-pm >>> > ___ >>> > Rio-pm mailing list >>> > Rio-pm@pm.org >>> > http://mail.pm.org/mailman/listinfo/rio-pm >>> >>> ___ >>> Rio-pm mailing list >>> Rio-pm@pm.org >>> http://mail.pm.org/mailman/listinfo/rio-pm >> >> >> ___ >> Rio-pm mailing list >> Rio-pm@pm.org >> http://mail.pm.org/mailman/listinfo/rio-pm > > > -dom > > -- > > IBM - Business Analytics Optimization Consultant > Daniel Mantovani +5511 8538-9897 > XOXO -- -dom -- IBM - Business Analytics Optimization Consultant Daniel Mantovani +5511 8538-9897 XOXO ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Percorrendo array
2013/1/12 Thiago Glauco : > 1-> de onde sua função tirou o @data? > > mas faça isso: > > my $i = 0; > while($i <= $#data) { > $i = 1 if $data[$i] eq $gi; > ... > Thiago, seu código é incompatível com o do autor acima. > Evite usar labels. Porque labels é uma má prática em Software Engineer ? Label é uma feature poderosa que a linguagem oferece. sub array_find_position{$g=shift;return$_ if $f[$_]==$g for 0..$# } Se a lista for muito grande, sub array_find_position{$g=shift;$i=0;return$i if $f[$i]==$g while $i<=$# } []'s > > regards. > > > Em Sáb, 2013-01-12 às 20:37 +, Aureliano Guedes escreveu: >> Era sim, mas resolvi tomar outro metodo. >> >> sub array_find_position{ >> my $gi = shift; >> my $position = 0; >> LINE: foreach (@data){ >> if ($_ eq $gi){ >> last LINE; >> } >> else{ >> $position++; >> } >> } >> return $position; >> } >> >> >> > From: bla...@gmail.com >> > Date: Sat, 12 Jan 2013 18:20:16 -0200 >> > To: rio-pm@pm.org >> > Subject: Re: [Rio-pm] Percorrendo array >> > >> > perl -E '@array=(1..10); for(my $i = 0; $i < 10; $i >> ++){ if($array[$i] >> > == 2){ $i = 5} if($array[$i] == 7) {$i = 10} say $array[$i]}' >> > >> > Tipo isso? >> > >> > 2013/1/12 Tiago Peczenyj : >> > > nao use foreach. use for ou while p indice e altere-o qdo quiser p >> avancar >> > > ou voltar >> > > >> > > Em 12/01/2013 15:53, "Aureliano Guedes" >> escreveu: >> > >> >> > >> Ola Monges, >> > >> >> > >> Me surgiu uma duvida nesse momento. >> > >> >> > >> Imagine que temos um array de 10 posições: >> > >> my @a = qw(0 1 2 3 4 5 6 7 8 9); >> > >> >> > >> Então este array esta em um loop, no caso um foreach: >> > >> >> > >> foreach my $i (@a){ >> > >> ... >> > >> } >> > >> >> > >> Mas eu quero que se o valor dessa posição seja 6, por exemplo, o >> array >> > >> volte para segunda posição. >> > >> >> > >> Não sei se minha pergunta ficou estranha ou difícil de entender, >> mas como >> > >> eu faria isso?? >> > >> >> > >> ___ >> > >> Rio-pm mailing list >> > >> Rio-pm@pm.org >> > >> http://mail.pm.org/mailman/listinfo/rio-pm >> > > >> > > >> > > ___ >> > > Rio-pm mailing list >> > > Rio-pm@pm.org >> > > http://mail.pm.org/mailman/listinfo/rio-pm >> > ___ >> > Rio-pm mailing list >> > Rio-pm@pm.org >> > http://mail.pm.org/mailman/listinfo/rio-pm >> >> ___ >> Rio-pm mailing list >> Rio-pm@pm.org >> http://mail.pm.org/mailman/listinfo/rio-pm > > > ___ > Rio-pm mailing list > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm -dom -- IBM - Business Analytics Optimization Consultant Daniel Mantovani +5511 8538-9897 XOXO ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Percorrendo array
1-> de onde sua função tirou o @data? mas faça isso: my $i = 0; while($i <= $#data) { $i = 1 if $data[$i] eq $gi; ... Evite usar labels. regards. Em Sáb, 2013-01-12 às 20:37 +, Aureliano Guedes escreveu: > Era sim, mas resolvi tomar outro metodo. > > sub array_find_position{ > my $gi = shift; > my $position = 0; > LINE: foreach (@data){ > if ($_ eq $gi){ > last LINE; > } > else{ > $position++; > } > } > return $position; > } > > > > From: bla...@gmail.com > > Date: Sat, 12 Jan 2013 18:20:16 -0200 > > To: rio-pm@pm.org > > Subject: Re: [Rio-pm] Percorrendo array > > > > perl -E '@array=(1..10); for(my $i = 0; $i < 10; $i > ++){ if($array[$i] > > == 2){ $i = 5} if($array[$i] == 7) {$i = 10} say $array[$i]}' > > > > Tipo isso? > > > > 2013/1/12 Tiago Peczenyj : > > > nao use foreach. use for ou while p indice e altere-o qdo quiser p > avancar > > > ou voltar > > > > > > Em 12/01/2013 15:53, "Aureliano Guedes" > escreveu: > > >> > > >> Ola Monges, > > >> > > >> Me surgiu uma duvida nesse momento. > > >> > > >> Imagine que temos um array de 10 posições: > > >> my @a = qw(0 1 2 3 4 5 6 7 8 9); > > >> > > >> Então este array esta em um loop, no caso um foreach: > > >> > > >> foreach my $i (@a){ > > >> ... > > >> } > > >> > > >> Mas eu quero que se o valor dessa posição seja 6, por exemplo, o > array > > >> volte para segunda posição. > > >> > > >> Não sei se minha pergunta ficou estranha ou difícil de entender, > mas como > > >> eu faria isso?? > > >> > > >> ___ > > >> Rio-pm mailing list > > >> Rio-pm@pm.org > > >> http://mail.pm.org/mailman/listinfo/rio-pm > > > > > > > > > ___ > > > Rio-pm mailing list > > > Rio-pm@pm.org > > > http://mail.pm.org/mailman/listinfo/rio-pm > > ___ > > Rio-pm mailing list > > Rio-pm@pm.org > > http://mail.pm.org/mailman/listinfo/rio-pm > > ___ > Rio-pm mailing list > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Percorrendo array
mas vc vai retornar o ultimo elemento se não encontrar o valor desejado? Eu vejo 2 problemas na sua abordagem: 1 - vc não precisa do last LINE, de fato apenas last seria suficiente mas vc poderia colocar um return $position no lugar e retornar undef ou -1 (ou die "nao encontrei") como caso default. 2- vc pode usar a subrotina first do pacote List::Util (built in) use List::Util qw(first); my @a = (1,2,9,3,4); print first { $a[$_] == 9 } 0.. scalar @a; para ser mais sucinto vc poderia usar first_index do List::MoreUtils (cpan) 2013/1/12 Aureliano Guedes : > Era sim, mas resolvi tomar outro metodo. > > sub array_find_position{ > my $gi = shift; > my $position = 0; > LINE: foreach (@data){ > if ($_ eq $gi){ > last LINE; > } > else{ > $position++; > } > } > return $position; > } > >> From: bla...@gmail.com >> Date: Sat, 12 Jan 2013 18:20:16 -0200 >> To: rio-pm@pm.org >> Subject: Re: [Rio-pm] Percorrendo array > >> >> perl -E '@array=(1..10); for(my $i = 0; $i < 10; $i++){ if($array[$i] >> == 2){ $i = 5} if($array[$i] == 7) {$i = 10} say $array[$i]}' >> >> Tipo isso? >> >> 2013/1/12 Tiago Peczenyj : >> > nao use foreach. use for ou while p indice e altere-o qdo quiser p >> > avancar >> > ou voltar >> > >> > Em 12/01/2013 15:53, "Aureliano Guedes" >> > escreveu: >> >> >> >> Ola Monges, >> >> >> >> Me surgiu uma duvida nesse momento. >> >> >> >> Imagine que temos um array de 10 posições: >> >> my @a = qw(0 1 2 3 4 5 6 7 8 9); >> >> >> >> Então este array esta em um loop, no caso um foreach: >> >> >> >> foreach my $i (@a){ >> >> ... >> >> } >> >> >> >> Mas eu quero que se o valor dessa posição seja 6, por exemplo, o array >> >> volte para segunda posição. >> >> >> >> Não sei se minha pergunta ficou estranha ou difícil de entender, mas >> >> como >> >> eu faria isso?? >> >> >> >> ___ >> >> Rio-pm mailing list >> >> Rio-pm@pm.org >> >> http://mail.pm.org/mailman/listinfo/rio-pm >> > >> > >> > ___ >> > Rio-pm mailing list >> > Rio-pm@pm.org >> > http://mail.pm.org/mailman/listinfo/rio-pm >> ___ >> Rio-pm mailing list >> Rio-pm@pm.org >> http://mail.pm.org/mailman/listinfo/rio-pm > > ___ > Rio-pm mailing list > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm -- Tiago B. Peczenyj Linux User #405772 http://about.me/peczenyj ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Percorrendo array
Era sim, mas resolvi tomar outro metodo. sub array_find_position{ my $gi = shift; my $position = 0; LINE: foreach (@data){ if ($_ eq $gi){ last LINE; } else{ $position++; } } return $position; } > From: bla...@gmail.com > Date: Sat, 12 Jan 2013 18:20:16 -0200 > To: rio-pm@pm.org > Subject: Re: [Rio-pm] Percorrendo array > > perl -E '@array=(1..10); for(my $i = 0; $i < 10; $i++){ if($array[$i] > == 2){ $i = 5} if($array[$i] == 7) {$i = 10} say $array[$i]}' > > Tipo isso? > > 2013/1/12 Tiago Peczenyj : > > nao use foreach. use for ou while p indice e altere-o qdo quiser p avancar > > ou voltar > > > > Em 12/01/2013 15:53, "Aureliano Guedes" escreveu: > >> > >> Ola Monges, > >> > >> Me surgiu uma duvida nesse momento. > >> > >> Imagine que temos um array de 10 posições: > >> my @a = qw(0 1 2 3 4 5 6 7 8 9); > >> > >> Então este array esta em um loop, no caso um foreach: > >> > >> foreach my $i (@a){ > >> ... > >> } > >> > >> Mas eu quero que se o valor dessa posição seja 6, por exemplo, o array > >> volte para segunda posição. > >> > >> Não sei se minha pergunta ficou estranha ou difícil de entender, mas como > >> eu faria isso?? > >> > >> ___ > >> Rio-pm mailing list > >> Rio-pm@pm.org > >> http://mail.pm.org/mailman/listinfo/rio-pm > > > > > > ___ > > Rio-pm mailing list > > Rio-pm@pm.org > > http://mail.pm.org/mailman/listinfo/rio-pm > ___ > Rio-pm mailing list > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Percorrendo array
perl -E '@array=(1..10); for(my $i = 0; $i < 10; $i++){ if($array[$i] == 2){ $i = 5} if($array[$i] == 7) {$i = 10} say $array[$i]}' Tipo isso? 2013/1/12 Tiago Peczenyj : > nao use foreach. use for ou while p indice e altere-o qdo quiser p avancar > ou voltar > > Em 12/01/2013 15:53, "Aureliano Guedes" escreveu: >> >> Ola Monges, >> >> Me surgiu uma duvida nesse momento. >> >> Imagine que temos um array de 10 posições: >> my @a = qw(0 1 2 3 4 5 6 7 8 9); >> >> Então este array esta em um loop, no caso um foreach: >> >> foreach my $i (@a){ >> ... >> } >> >> Mas eu quero que se o valor dessa posição seja 6, por exemplo, o array >> volte para segunda posição. >> >> Não sei se minha pergunta ficou estranha ou difícil de entender, mas como >> eu faria isso?? >> >> ___ >> Rio-pm mailing list >> Rio-pm@pm.org >> http://mail.pm.org/mailman/listinfo/rio-pm > > > ___ > Rio-pm mailing list > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Percorrendo array
nao use foreach. use for ou while p indice e altere-o qdo quiser p avancar ou voltar Em 12/01/2013 15:53, "Aureliano Guedes" escreveu: > Ola Monges, > > Me surgiu uma duvida nesse momento. > > Imagine que temos um array de 10 posições: > my @a = qw(0 1 2 3 4 5 6 7 8 9); > > Então este array esta em um loop, no caso um foreach: > > foreach my $i (@a){ > ... > } > > Mas eu quero que se o valor dessa posição seja 6, por exemplo, o array > volte para segunda posição. > > Não sei se minha pergunta ficou estranha ou difícil de entender, mas como > eu faria isso?? > > ___ > Rio-pm mailing list > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm > ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
[Rio-pm] Percorrendo array
Ola Monges, Me surgiu uma duvida nesse momento. Imagine que temos um array de 10 posições: my @a = qw(0 1 2 3 4 5 6 7 8 9); Então este array esta em um loop, no caso um foreach: foreach my $i (@a){ ... } Mas eu quero que se o valor dessa posição seja 6, por exemplo, o array volte para segunda posição. Não sei se minha pergunta ficou estranha ou difícil de entender, mas como eu faria isso?? ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm