[MEGOLDVA]perl változók hatóköre

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);

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

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.)

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é,

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.

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...

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,

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!

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/