in reply to Re^5: handling tab delimited files
in thread handling tab delimited files
Just open an output file, and print to that file handle, instead of printing to (the default) STDOUT; that is:
Or, you could just use redirection on the shell command line, but for that to be effective, you want to use @ARGV for user input to the script, rather than printing a prompt to ask for input -- that is:... open OUT, ">", "outfile.name" or die "outfile.name: $!\n"; ... print OUT $DNA_conc; # and so on...
(The sanity check on the @ARGV value is not exactly a perfect one for checking that a string is a valid numeric -- e.g. it won't accept negative numbers -- but it's more than what you've been doing so far, and every little bit helps.)# don't do this: # print " Enter the number. \n"; # chomp ($df = <STDIN>); # do this instead: die "Usage: $0 multiplier_value\n" unless ( @ARGV == 1 and $ARG[0] =~ /([\d.]+)/ ); my $df = $1;
Doing it that way, your shell command line would go like this, to set the value (e.g. to "10.5") and redirect output to some other file:
As a rule, it makes sense to use @ARGV for the input file name too -- in fact, perl defaults to reading file names given as command-line args. I would do your script like this:your_script_name 10.5 > outfile.name
That also uses a better method of checking for numbers. Run it like this:#!/usr/bin/perl use strict; use Regexp::Common; die "Usage: $0 multiplier_number [input.file]\n" unless ( @ARGV and $ARGV[0] =~ /^$RE{num}{real}$/ ); my $df = shift; # take the numeric arg off @ARGV while (<>) # read from STDIN, or from file(s) named in @ARGV { if ( ! /^\s*(?:$RE{num}{real}\s+)+$/ ) { # if line has non-numer +ics print; } else { my @vals = map { $_ * $df * 50 } split; print join( "\t", @vals ), "\n"; } }
script_name 10 input.txt > 10_x_50_x_input.txt
|
|---|