On 4/25/05, [EMAIL PROTECTED]
<[EMAIL PROTECTED]> wrote:
> I wish to read input from a user that has multiple lines with carriage
> returns from <stdin> but not actually stop reading until a single # on a
> line by itself. Is there a module / package / function that will aid in
> this? I would like to do something like below:
>
> Until(<STDIN> = "#") {
>
> $incoming_lines = <STDIN>;
>
> }
>
> $storage_var = $incoming_lines;
>
> This is most like NOT working code, it is a logic example so that you
> might understand what I am trying to accomplish, so please no comments on
> the actual code shown.
>
> Chris Hood
>
>
Chris,
It really depends on what you want to do and how you want to get your input.
my @input = <STDIN>;
chomp @input;
is probably the simplest. It relys on your OS to supply EOF and
terminate stdin. On unix systems, that usually means pressinf Ctrl-D.
my @input;
while (<STDIN>) {
chomp;
push @input, $_;
}
Is another option. This lets you parse the text as it's entered, so
you can easily do things like create a custom EOF:
while (<STDIN>) {
chomp;
last if /^#$/;
push @input, $_;
}
You could also replace that push with:
$input .= " $_";
or something similar if you desperately wanted a scalar for some reason.
And finally, you could change the value of $/. Just make sure you've
properly localized it, and no other files will be read in the same
scope. Something like:
sub get_input {
local $/ = "\n#\n";
my $input = <STDIN>;
return $input
}
will work fine, but you can get into a lot of trouble very quickly by
doing something like:
$/ = "\n#\n";
my $input = <STDIN>;
open(FH, "<", "my/foo.txt");
while (<FH>) {
do something if ((/something/) and ($input =~ /something else/));
}
HTH,
--jay
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>