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?
 
ozoCommented:
If you evaluate an array in scalar context, it returns the length of the array.

You probably wanted
my $file = $_[0];
0
 
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
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

 
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.