/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
die "-p destination: $!\n" unless print $_~
Fra : Peter Makholm


Dato : 12-03-03 14:11

Jeg sad lang tid og undrede mig over at

brother@mac$ perl -e 'print "$_\n" for (1..5)' | perl -pe 'print <>'
brother@mac$ perl -e 'print "$_\n" for (1..5)' | perl -pe '$f=<>;print $f'

Gav forskellige resultater (egenlig klart, jeg må have siddet og
sovet). Jeg nåede dog at undersøge om de deparsede til væsentligt
forskellige ting:

brother@mac$ perl -MO=Deparse -pe 'print <>'
LINE: while (defined($_ = <ARGV>)) {
print <ARGV>;
}
continue {
print $_;
}
-e syntax OK
brother@mac$ perl -MO=Deparse -pe '$f=<>;print $f'
LINE: while (defined($_ = <ARGV>)) {
$f = <ARGV>;
print $f;
}
continue {
die "-p destination: $!\n" unless print $_;
}
-e syntax OK
brother@mac$

Er der nogen der kan forklare hvorfor den laver det die-udtryk?

--
Peter Makholm | The four letter word beginning with L?
peter@makholm.net | It's life, love, libc or lisp
http://hacking.dk | -- Depending on you point of view

 
 
Adam Sjøgren (12-03-2003)
Kommentar
Fra : Adam Sjøgren


Dato : 12-03-03 14:37

On Wed, 12 Mar 2003 14:11:11 +0100, Peter Makholm wrote:

> brother@mac$ perl -MO=Deparse -pe 'print <>' LINE: while
> (defined($_ = <ARGV>)) { print <ARGV>;
> }
> continue { print $_;
> }
> -e syntax OK
> brother@mac$ perl -MO=Deparse -pe '$f=<>;print $f'
> LINE: while (defined($_ = <ARGV>)) { $f = <ARGV>; print $f;
> }
> continue { die "-p destination: $!\n" unless print $_;
> }
> -e syntax OK brother@mac$

> Er der nogen der kan forklare hvorfor den laver det die-udtryk?

Opførslen er dokumenteret i 'perldoc perlrun'.

Måske er det fordi "-p" betyder "skriv" og hvis den ikke kan skrive
(gøre hvad du beder om), så er det rimeligt at give en fejlmeddelelse?

Mens uden "-p", så er det dig, der er en doven programmør, når du ikke
checker print's returværdi i programmet?


Mvh.

--
"Så skal man bare huske at netværk bliver lavet af Adam Sjøgren
ingeniører, RAM af computerfolk og harddiske af fjolser." asjo@koldfront.dk

Peter Makholm (12-03-2003)
Kommentar
Fra : Peter Makholm


Dato : 12-03-03 14:52

spamtrap@koldfront.dk (Adam Sjøgren) writes:

> Mens uden "-p", så er det dig, der er en doven programmør, når du ikke
> checker print's returværdi i programmet?

Bemærk at jeg bruger -p begge steder og at den pænt pakker det ind i
en while-løkke begge gange. Den eneste forskel er håndteringen i
continue-delen.

perl -pe 'printf "%5d: ", $i++'

Giver en continue-blok der bare skriver $_ ud

perl -pe 'printf "%5d: ", $.'

Giver en continue-blok der laver ovenstående 'die unless print
$_'. Det er godt nok den opførelse som manualsiden dokumenterer, så
fejlen er nok nærmere hvorfor jeg ikke får den i første tilfælde.

--
Peter Makholm | What if:
peter@makholm.net | Tannenbaum had convinced Linus that his
http://hacking.dk | operating system really was obsolete

Adam Sjøgren (12-03-2003)
Kommentar
Fra : Adam Sjøgren


Dato : 12-03-03 16:01

On Wed, 12 Mar 2003 14:51:42 +0100, Peter Makholm wrote:

> Bemærk at jeg bruger -p begge steder

Argh, jeg skal have briller - sorry.

Mystisk!


Mvh.

--
"Så skal man bare huske at netværk bliver lavet af Adam Sjøgren
ingeniører, RAM af computerfolk og harddiske af fjolser." asjo@koldfront.dk

Adam Sjøgren (12-03-2003)
Kommentar
Fra : Adam Sjøgren


Dato : 12-03-03 16:35

On Wed, 12 Mar 2003 14:51:42 +0100, Peter Makholm wrote:

> en while-løkke begge gange. Den eneste forskel er håndteringen i
> continue-delen.

> perl -pe 'printf "%5d: ", $i++'

> Giver en continue-blok der bare skriver $_ ud

> perl -pe 'printf "%5d: ", $.'

> Giver en continue-blok der laver ovenstående 'die unless print
> $_'. Det er godt nok den opførelse som manualsiden dokumenterer, så
> fejlen er nok nærmere hvorfor jeg ikke får den i første tilfælde.

Her er et endnu kortere eksempel:

$ perl -MO=Deparse -pe '$i;'
LINE: while (defined($_ = <ARGV>)) {
$i;
}
continue {
print $_;
}
-e syntax OK
$ perl -MO=Deparse -pe '$i'
LINE: while (defined($_ = <ARGV>)) {
$i;
}
continue {
die "-p destination: $!\n" unless print $_;
}
-e syntax OK
$


Mvh.

--
Rogue: You don't know, or you don't care? Adam Sjøgren
Wolverine: Pick one. asjo@koldfront.dk

Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste