hello
ezen kódrészlet nem ad vissza nekem semmit pedig szerintem kéne:
my $var = '';
$var++ while ($var lt 10 );
print $var until ($var-- gt 0);
mi lehet a gond? a $var az elején globális változó azt frissíti az első $var++ növeli majd a második $var-- pedig csökkenti.
vagy tévedek és a második ciklus is az üres stringet látja?
ez alapján: http://perlmaven.com/scope-of-variables-in-perl (Variable scope: visible everywhere)
menni e kéne.
UPDATA
A megoldás:
my $var = 0;
print "$var\n";
$var++ while ($var < 10 );
print $var."\n" until ($var-- == 0);
- 5363 megtekintés
Hozzászólások
Bár perlben lehet mindent máshogy is, de nem rémlik, hogy a while hajlandó végrehajtani az előtte álló blokkot, így:
$var++ while ($var lt 10 );
Legalábbis azt feltételeztem a (számomra egyébként ismeretlen) szándékodról, hogy a while ciklusban szeretnéd végrehajtani a $var++ -t.
http://perldoc.perl.org/perlsyn.html#Loop-Control
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
De, hajlando, sot ilyeneket is lehet:
$i++ if(feltetel);
meg ilyenek:
$i++ unless(feltetel);
- A hozzászóláshoz be kell jelentkezni
ettől féltem :)
Legalább nem okozott csalódást! :)
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Ennek milyen konkrét előnye van a postfix megadási módhoz képest?
- A hozzászóláshoz be kell jelentkezni
Csak annyi, hogy lehetőséget ad a programnyelvet közelíteni az emberi nyelvhez*, amelyben így is, úgy is fogalmazhatunk.
Ne feledjük, hogy Larry Wall civilben nyelvész!
Ezzel ki lehet hangsúlyozni, hogy az adott kódrészlet nagy valószínűséggel le fog futni, mert jó eséllyel teljesül a feltétel. Vagy éppen ellenkezőleg: egy rendkívüli eseményt kezelő
die if (...)
sor jobban elkapja az olvasó szemét, mint a szokásos szintaxis.
*(Más kérdés, hogy egy "igazi" perl kódról nem hogy emberi, de programnyelvek se nagyon jutnak az ember eszébe.)
- A hozzászóláshoz be kell jelentkezni
Most mi bajod a perl kóddal? ;-)
$_[0] =~ /[ |\t|\r|\n]*\"?([^\"]+\"?@[^ <>\t]+\.[^ <>\t][^ <>\t]+)[ |\t|\r|\n]*/;
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!
- A hozzászóláshoz be kell jelentkezni
Ez inkább regexp nem annyira Perl, bezzeg az alábbi! :)
http://perlmaven.com/symbolic-reference-in-Perl
Na aki ezt olvassa, az a legény a gáton! :)
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
az, hogy ez egy erőltetett példa(?),
tfh. egyáltalán nem ismerem a Perlt, de a reguláris kifejezésekhez valamicskét konyítok, és sejteném, hogy jobboldalt valami ilyesmiről van szó: egyből feltűnne, hogy a minta vége vélhetőleg teljesen felesleges, nem?
hiszen a * az 0 vagy többszörös illeszkedést ír elő, nem?
nyilván, ha mohó illesztés van, és tudok utána hivatkozni az illeszkedett/illesztett darabokra, akkor van/lehet értelme, de mivel itt az utóbbit nem használjuk, ezért szerintem teljesen felesleges, nem?
hoppá, a + meg legalább egyszerest, de ezek szerint a csukó zárójel előtti rész is egyszerűsíthető, mert csak van valamiféle olyan lehetőség, amivel a legalább kétszeres ismétlődés leírható, nem? (persze, hogy van),
és így tovább...
kíváncsi vagyok, hogy bármilyen más nyelvben mennyire átláthatóbb egy reguláris kifejezés, ha az megengedett nyelvi elem?
azt persze aláírom, hogy a Perl kódok értelmezése sokak számára (nekem is) általában "nagyobb kihívás", mint más elterjedtebb nyelveken megírté,
- A hozzászóláshoz be kell jelentkezni
Sajnos a probléma ennél alapvetőbb:
[ |\t|\r|\n]
Pár hét alatt másodszor látok olyat, hogy valaki keveri a karakterlista és a vagylagosság nyelvi elemeit.
A fenti rész szinte biztosan annak van szánva, hogy
szóköz VAGY tab VAGY kocsivissza VAGY újsor
ezzel szemben azt jelenti, hogy
szóköz VAGY pipe VAGY tab VAGY pipe VAGY kocsivissza VAGY pipe VAGY újsor
ami aztán ilyenre vezethet:
$ perl -e 'print "ciki\n" if ( "xxx|yyy" =~ /[a|b]/)'
ciki
Szóval a fenti kód nem tipikus perl, hanem regexp, de annak túlspilázott és hibás.
- A hozzászóláshoz be kell jelentkezni
Az lt es gt a string-ek osszehasonlitasara valo (abc-rend szerinti).
Szoval az elso while-nal:
0 lt 10 => true
1 lt 10 => true
2 lt 10 => false
szoval $var=2;
Masodik while:
print 1; 2 gt 0 => true
print 0; 1 gt 0 => true;
print -1; 0 gt 0 => false
Vagyis ezert irja azt ki, hogy 10-1. Esetleg tegyel par ujsort a kiirasokhoz, jobban lathato.
Remelem ertheto...
- A hozzászóláshoz be kell jelentkezni
alapvetően igazad van, de a másodiknál ugye until-t használt, és nem while-t, és a -1-et akkor sem írná ki, hiszen (ahogyan írtad) akkor már hamis a feltétel (0 gt 0 => false), nem?
szerkesztés: értelemszerűen, ahogyan levezetted a másodiknál a feltétel egyből igaz, ezért az until miatt nem fog a print végrehajtódni,
- A hozzászóláshoz be kell jelentkezni
Igazad van, a tegnap kicsit piszkalgatam a kodon mielott a valaszt irtam, s nem vettem eszre, hogy nem pont ugyanazt csinalja mint a topic felvetoe...
- A hozzászóláshoz be kell jelentkezni
use strict;
my $var = 0;
$var++ while ( $var < 10 );
print $var until ( $var-- == 0 );
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!
- A hozzászóláshoz be kell jelentkezni
Szuper én is ezt akartam mondani.
Továbbá akkor már
use warnings;
sort is érdemes beszúrni, mint best practice.
- A hozzászóláshoz be kell jelentkezni
hello
nos átírtam erre:
print "\n";
my $var = 0;
print "$var\n";
$var++ while ($var < 10 );
print "$var\n";
print $var until ($var-- == 0);
és ez az eredmény:
0
10
még mindig nem értem miért nem printel az utolsó sor....
u.i.
a use strict and use warnings alapból benne van minden scriptemben.
--
A legértékesebb idő a pillanat amelyben élsz.
https://sites.google.com/site/jupiter2005ster/
- A hozzászóláshoz be kell jelentkezni
Dejszen printel az...
Csak nincs utána soremelés, és a kimenet beáll a prompt elé. Ha neaggyisten még kocsivisszát is tartalmaz a prompt, akkor alá.
- A hozzászóláshoz be kell jelentkezni
0
10
9876543210polesz[~]$
Ha átírod a kérdéses sort:
print $var."\n" until ($var-- == 0);
0
10
9
8
7
6
5
4
3
2
1
0
polesz[~]$
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!
- A hozzászóláshoz be kell jelentkezni
ááááá, igazad van. csak nem látok.
--
A legértékesebb idő a pillanat amelyben élsz.
https://sites.google.com/site/jupiter2005ster/
- A hozzászóláshoz be kell jelentkezni