What's the use of <> in Perl?

What's the use of <> in Perl. How to use it ? If we simply write

<>;

and

while(<>)

what is that the program doing in both cases?

Answers


The answers above are all correct, but it might come across more plainly if you understand general UNIX command line usage. It is very common to want a command to work on multiple files. E.g.

ls -l *.c

The command line shell (bash et al) turns this into:

ls -l a.c b.c c.c ...

in other words, ls never see '*.c' unless the pattern doesn't match. Try this at a command prompt (not perl):

echo *

you'll notice that you do not get an *.

So, if the shell is handing you a bunch of file names, and you'd like to go through each one's data in turn, perl's <> operator gives you a nice way of doing that...it puts the next line of the next file (or stdin if no files are named) into $_ (the default scalar).

Here is a poor man's grep:

while(<>) {
   print if m/pattern/;
}

Running this script:

./t.pl *

would print out all of the lines of all of the files that match the given pattern.

cat /etc/passwd | ./t.pl

would use cat to generate some lines of text that would then be checked for the pattern by the loop in perl.

So you see, while(<>) gets you a very standard UNIX command line behavior...process all of the files I give you, or process the thing I piped to you.


 <>;

is a short way of writing

 readline();

or if you add in the default argument,

 readline(*ARGV);

readline is an operator that reads a line from the specified file handle. Reading from the special file handle ARGV will read from STDIN if @ARGV is empty or from the concatenation of the files named by @ARGV if it's not.


As for

while (<>)

It's a syntax error. If you had

while (<>) { ... }

it get rewritten to

while (defined($_ = <>)) { ... }

And as previously explained, that means the same as

while (defined($_ = readline(*ARGV))) { ... }

That means it will read lines from (previously explained) ARGV until there are no more lines to read.


It is called the diamond operator and feeds data from either stdin if ARGV is empty or each line from the files named in ARGV. This webpage http://docstore.mik.ua/orelly/perl/learn/ch06_02.htm explains it very well.


In many cases of programming with syntactical sugar like this, Deparse of O is helpful to find out what's happening:

$ perl -MO=Deparse -e 'while(<>){print 42}'
while (defined($_ = <ARGV>)) {
    print 42;
}
-e syntax OK

Quoting perldoc perlop:

The null filehandle <> is special: it can be used to emulate the behavior of sed and awk, and any other Unix filter program that takes a list of filenames, doing the same to each line of input from all of them. Input from <> comes either from standard input, or from each file listed on the command line.


it takes the STDIN standard input:

> cat temp.pl
#!/usr/bin/perl

use strict;

use warnings;
my $count=<>;
print "$count"."\n";
>

below is the execution:

> temp.pl
3
3

>

so as soon as you execute the script it will wait till the user gives some input. after 3 is given as input,it stores that value in $count and it prints the value in the next statement.


Need Your Help

When was Javac StringBuilder/StringBuffer optimization introduced?

java javac stringbuilder stringbuffer jdk1.4

I know that Javac compiler is able to transform String concatenation + using StringBuilder/StringBuffer, and I'm curious to know starting from which version this change was introduced?

Inset border-radius with CSS3

css css3 css-shapes

Is there way to create inset border radius with css3? (Without images)