Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Magiczny parametr.

11 views
Skip to first unread message

KEyS

unread,
Sep 14, 2013, 10:00:30 AM9/14/13
to
Witam,
mam problem "jak napisać procedurę obsługującą parametr magiczny?"

ma działać jak np. chomp:
chomp -> modyfikuje $_
chomp($_) działa tak samo.

gdy zrobię:
sub X($){
my $S=shift;
print $S
}

i $_="Ala ma kota";

wywołanie:

X;

powinno wypisać "Ala ma kota".
sub X(\$){
my $S=shift;
$$S='x';
}
dla $_ j.w.

X;

print "$_" -> 'x'

pozdrawiam
Eustachy Kruczała

PS. Może ktoś wie, jak nazwać ten problem ,żeby w GOOGLE znaleźć?

Stachu 'Dozzie' K.

unread,
Sep 14, 2013, 11:52:39 AM9/14/13
to
On 2013-09-14, KEyS <key_s...@wp.pl> wrote:
> Witam,
> mam problem "jak napisać procedurę obsługującą parametr magiczny?"
>
> ma działać jak np. chomp:
> chomp -> modyfikuje $_
> chomp($_) działa tak samo.

No i w czym masz w ogóle problem? $_ to zmienna globalna.

--
Secunia non olet.
Stanislaw Klekot

KEyS

unread,
Sep 15, 2013, 5:37:35 PM9/15/13
to
Użytkownik Stachu 'Dozzie' K. napisał:
> On 2013-09-14, KEyS <key_s...@wp.pl> wrote:
>> Witam,
>> mam problem "jak napisać procedurę obsługującą parametr magiczny?"
>>
>> ma działać jak np. chomp:
>> chomp -> modyfikuje $_
>> chomp($_) działa tak samo.
>
> No i w czym masz w ogóle problem? $_ to zmienna globalna.
>
i co z tego?

dla

sub S(\$){
my $S=shift; #ref($PAR)
$$S=11; #$PAR=11
}


Jak napisać funkcję zwracającą wynik przez parametr. W powyższym
przykładzie próbowałem to zrobi przez prototyp (\$), ale kiedy nie podam
parametru - program czepia się.

Wywołanie:

X;

kończy się błędem.

Chcę żeby $_ po wywołaniu X miało wartość 11;

Przy funkcji nie prototypowanej (innej) też nie działa, np:

sub X{
my $S=shift;
print "$S\n";
}

$_=1111;


Wywołanie:

X;

powinno wypisać 1111, nie robi nic.

Stachu 'Dozzie' K.

unread,
Sep 15, 2013, 6:22:26 PM9/15/13
to
On 2013-09-15, KEyS <key_s...@wp.pl> wrote:
> U�ytkownik Stachu 'Dozzie' K. napisa�:
>> On 2013-09-14, KEyS <key_s...@wp.pl> wrote:
>>> Witam,
>>> mam problem "jak napisa� procedur� obs�uguj�c� parametr magiczny?"
>>>
>>> ma dzia�a� jak np. chomp:
>>> chomp -> modyfikuje $_
>>> chomp($_) dzia�a tak samo.
>>
>> No i w czym masz w og�le problem? $_ to zmienna globalna.
>>
> i co z tego?

Ano to, �e tej zmiennej u�ywa si� jak ka�dej innej.

> dla
>
> sub S(\$){
> my $S=shift; #ref($PAR)
> $$S=11; #$PAR=11
> }

Tak na boku: zdajesz sobie spraw� z tego, �e $_[0] jest aliasem
parametru wywo�ania i mo�na to wykorzysta�?

> Jak napisa� funkcj� zwracaj�c� wynik przez parametr. W powy�szym
> przyk�adzie pr�bowa�em to zrobi przez prototyp (\$), ale kiedy nie podam
> parametru - program czepia siďż˝.
>
> Wywo�anie:
>
> X;
>
> ko�czy si� b��dem.
>
> Chc� �eby $_ po wywo�aniu X mia�o warto�� 11;

No to czemu tej zmiennej nie ustawisz? Oczekujesz voodoo?

> Przy funkcji nie prototypowanej (innej) te� nie dzia�a, np:
>
> sub X{
> my $S=shift;
> print "$S\n";
> }
>
> $_=1111;
>
>
> Wywo�anie:
>
> X;
>
> powinno wypisaďż˝ 1111, nie robi nic.

No zgadza si� (opr�cz wypisania pustej linii). A u�ywasz w og�le w tej
funkcji $_?

KEyS

unread,
Sep 16, 2013, 9:24:25 AM9/16/13
to
U�ytkownik KEyS napisa�:
> U�ytkownik Stachu 'Dozzie' K. napisa�:
>> No i w czym masz w og�le problem? $_ to zmienna globalna.
>>

> i co z tego?
>
> dla
>
> sub S(\$){
> my $S=shift; #ref($PAR)
> $$S=11; #$PAR=11
> }
>
>
> Jak napisa� funkcj� zwracaj�c� wynik przez parametr. W powy�szym
> przyk�adzie pr�bowa�em to zrobi przez prototyp (\$), ale kiedy nie podam
> parametru - program czepia siďż˝.
>
> Wywo�anie:
>
> X;
>
> ko�czy si� b��dem.
>
> Chc� �eby $_ po wywo�aniu X mia�o warto�� 11;
>
> Przy funkcji nie prototypowanej (innej) te� nie dzia�a, np:
>
> sub X{
> my $S=shift;
> print "$S\n";
> }
>
> $_=1111;
>
>
> Wywo�anie:
>
> X;
>
> powinno wypisaďż˝ 1111, nie robi nic.
>
Ale si� wyg�upi�em ;)
Zapomnia�em w og�le o globalno�ci - za bardzo si� przej��em unikaniem
efekt�w ubocznych.

Dopiero, gdy w kt�rej� procedurze "zlokalizowa�em" $_ i u�wiadomi�em
sobie, �e przecie� ona musi by� local, �eby nie zmieni� globalnie :).
Procedura ~j.w.

sub X{
my $S=shift;
my $GLOBAL=(!$S);
$S=11;
$_=$S if($GLOBAL);
return $S;
}

Dzia�a .


0 new messages