Portál AbcLinuxu, 12. května 2025 06:20

Dotaz: Perl a uninitialized value

David Watzke avatar 2.12.2006 13:39 David Watzke | skóre: 74 | blog: Blog... | Praha
Perl a uninitialized value
Přečteno: 170×
Odpovědět | Admin
Zdravím. Mám v Perlu takovou funkci:
sub check_pkgname($) {
	($_[0] =~ m/^\w+(|(\-|\w)*\w)(|\/\w+(|(\-|\w)*\w))$/)
	? $pkg = $_[0]
	: die "Not a valid package name: $_[0]!";
}
a teď když spustím check_pkgname("něco"), tak to proběhne. Když to regexpu neodpovídá, tak vypíše:
Not a valid package name: (whatever)! at ./test.pl line 7.
Proč tam píše "at ./test.pl line 7"? To nechci.

Ovšem horší je tohle: jakmile se pokusím o check_pkgname($_[0]), tak hodí:
Use of uninitialized value in pattern match (m//) at ./test.pl line 7.
Use of uninitialized value in concatenation (.) or string at ./test.pl line 7.
Not a valid package name: ! at ./test.pl line 7.
Napadlo mě zkusit ještě check_pkgname(int $_[0]), to hodí:
Use of uninitialized value in int at ./test.pl line 12.
Co dělám špatně?
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

David Watzke avatar 2.12.2006 13:53 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Perl a uninitialized value
Odpovědět | | Sbalit | Link | Blokovat | Admin
Když to regexpu neodpovídá, tak vypíše:
Not a valid package name: (whatever)! at ./test.pl line 7.
Proč tam píše "at ./test.pl line 7"? To nechci.
Sorry, nevěděl jsem, že je to běžný chování funkce die(), jsem trouba :-D
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
4.12.2006 09:13 mlz
Rozbalit Rozbalit vše Re: Perl a uninitialized value
V pripade, ze je u die "\n", tak at xxx.pl line N nevypise tedy die "Not a valid package name: (whatever)!\n";
David Watzke avatar 4.12.2006 14:36 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Perl a uninitialized value
Aha, díky.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
David Watzke avatar 2.12.2006 22:43 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Perl a uninitialized value
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zjevně jsem dělal pěknou blbost. Ve funkci je asi nutný přiřadit si argumenty do proměnných pomocí shiftu, že?
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
3.12.2006 00:15 amnesiac
Rozbalit Rozbalit vše Re: Perl a uninitialized value
Prirazovani paramteru do promennych s tim nema nic spolecneho. Zrejme volas check_pkgname($_[0]), kdyz $_[0] obsahuje nedefinovanou hodnotu.

Pokud volam $pkgname="nazev-1-2/balicku-xyz-321"; check_pkgname($pkgname);, tak mi to probehne korektne.

Btw. moc jsem nepochopil proc je v tom regularnim vyrazu ^\w+(|(\-|\w)*\w)(|\/\w+(|(\-|\w)*\w))$ to \w za (\-|\w)* ;-)

David Watzke avatar 3.12.2006 00:18 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Perl a uninitialized value
Btw. moc jsem nepochopil proc je v tom regularnim vyrazu ^\w+(|(\-|\w)*\w)(|\/\w+(|(\-|\w)*\w))$ to \w za (\-|\w)* ;-)
Protože chci aby to prošlo jen tehdy, když string bude končit na '\w' a ne '-'.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
4.12.2006 11:15 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Perl a uninitialized value
A nebylo by čitelnější
/^\w(?:[-\w]*\w)?(?:\/\w(?:[-\w]*\w)?)?$/
To (?:) místo () je jen kvůli rychlosti - neplní se $n registry. Pokud by ty slova nikdy nebyli méně než dvouznakové, tak by se dokonce dalo napsat
/^\w[-\w]*\w(?:\/\w[-\w]*\w)?$/
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
David Watzke avatar 4.12.2006 14:41 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Perl a uninitialized value
Díky, určitě bylo. Co je $n registr?
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
4.12.2006 15:00 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Perl a uninitialized value
Viz perlvar
       $<digits>
               Contains the subpattern from the corresponding set of capturing
               parentheses from the last pattern match, not counting patterns
               matched in nested blocks that have been exited already.
               (Mnemonic: like \digits.)  These variables are all read-only
               and dynamically scoped to the current BLOCK.
Jinak \1..\9 by se mělo používat jen v m-regexpu nebo na levé straně (první parametr) s-regexpu.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.