On Jan 27, Rob Dixon said:
>Sam wrote:
>>
>> sub print_lines_ok {
>> my ($output, $blank_lines) = @_;
>> if ($blank_lines) {
>> do {
>> print if $output;
>> $_ = <>;
>> } while (/^\s*$/ and not eof);
>> } else {
>> do {
>> print if $output;
>> $_ = <>;
>> } while (not /^\s*$/ and not eof);
>> }
>> }
>>
>>
>> sub print_lines_ideal {
>> my ($output, $blank_lines) = @_;
>> my $expr = $blank_lines ? '/^\s*$/' : 'not /^\s*$/';
>>
>> do {
>> print if $output;
>> $_ = <>;
>> } while (eval $expr and not eof); # works, but not fast.
>> # Can I move eval out of loop?
>> }
You could just say
do ... while (($blank ? /^\s*$/ : not /^\s*$/) and not eof);
which could be written with 'xor' as Rob shows below:
do ... while ($blank xor not /^\s*$/) and not eof;
and 'not /^\s*$/' can be written as /\S/, which results in Rob's code.
>I don't think you want what you've written, as the first call to 'print'
>is before anything has been read from the file. This should come close:
>
> sub print_lines {
> my ($output, $blank_lines) = @_;
> while (<>) {
> last if $blank_lines xor /\S/;
> print if $output;
> }
> }
That might work in this specific case, but if you want to be able to
change the course of events like that without constant re-evaluation, I'd
suggest using code references:
my $code = \&first;
sub first {
# code for the first case
if (some condition) { $code = \&second }
}
sub second {
# code for the second case
}
$code->();
--
Jeff "japhy" Pinyan [EMAIL PROTECTED] http://www.pobox.com/~japhy/
RPI Acacia brother #734 http://www.perlmonks.org/ http://www.cpan.org/
<stu> what does y/// stand for? <tenderpuss> why, yansliterate of course.
[ I'm looking for programming work. If you like my work, let me know. ]
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>