reading in arguments

Hi. I was wondering why the code below works but it won't work if I change the line

my $file = shift;

to

my $file = @_;

and also, if I run this code (using the name cat.pl) with a comma separated list of arguments why it skips the first argument. For example if I run
perl cat.pl SampleForGraphing.csv, second.csv

it only prints the file second.csv

Thanks.
#!/Perl/bin/perl
use strict;
#use warnings;

sub print_file {
my $file = shift;

open FILE, $file;
while (my $line = <FILE>) {
print $line;
}
}
sub cat {
	while (my $file = shift) {
			print_file $file;

}
}
cat @ARGV;

Open in new window

onyourmarkAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

ozoCommented:
If you evaluate an array in scalar context, it returns the length of the array.

You probably wanted
my $file = $_[0];
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
ozoCommented:
my($file) = @_;
also works, as it evaluates the array in list context.
0
TintinCommented:
If you change

my $file = shift;

Open in new window


to

my $file = @_;

Open in new window


then the later gets the length of the array in the scale context, eg: 1

You need to do

my ($file) = @_;

Open in new window


I would rewrite your code to be a little better layed out.


#!/usr/bin/perl
use strict;
use warnings;

sub print_file {
  my $file = shift;

  open my $filename, '<',$file or die "Can not open $file $!\n";
  print <$filename>;
  close $filename;
}

sub cat {
  while (my $file = shift) {
     print_file $file
  }
}

cat @ARGV;

Open in new window

0
Fundamentals of JavaScript

Learn the fundamentals of the popular programming language JavaScript so that you can explore the realm of web development.

onyourmarkAuthor Commented:
Thanks.

$_[0]
What is $_ reading? I thought @_ reads the arguments from the function from which it is called. How about $_   ?
0
ozoCommented:
perldoc perlvar
...
       @_      Within a subroutine the array @_ contains the parameters passed
               to that subroutine.  See perlsub.


$_[0] is the 0th element of the array @_
0
ozoCommented:
> How about $_
$_ was not used in any of the above code, (even implicitly) but since you ask:

perldoc perlvar
...
       $_      The default input and pattern-searching space.  The following
               pairs are equivalent:

                   while (<>) {...}    # equivalent only in while!
                   while (defined($_ = <>)) {...}

                   /^Subject:/
                   $_ =~ /^Subject:/

                   tr/a-z/A-Z/
                   $_ =~ tr/a-z/A-Z/

                   chomp
                   chomp($_)

               Here are the places where Perl will assume $_ even if you don't
               use it:

               ·  Various unary functions, including functions like ord() and
                  int(), as well as the all file tests ("-f", "-d") except for
                  "-t", which defaults to STDIN.

               ·  Various list functions like print() and unlink().

               ·  The pattern matching operations "m//", "s///", and "tr///"
                  when used without an "=~" operator.

               ·  The default iterator variable in a "foreach" loop if no
                  other variable is supplied.

               ·  The implicit iterator variable in the grep() and map()
                  functions.

               ·  The default place to put an input record when a "<FH>"
                  operation's result is tested by itself as the sole criterion
                  of a "while" test.  Outside a "while" test, this will not
                  happen.

               As $_ is a global variable, this may lead in some cases to
               unwanted side-effects.  As of perl 5.9.1, you can now use a
               lexical version of $_ by declaring it in a file or in a block
               with "my".  Moreover, declaring "our $_" restores the global $_
               in the current scope.

               (Mnemonic: underline is understood in certain operations.)
0
onyourmarkAuthor Commented:
Thank you!
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Perl

From novice to tech pro — start learning today.