Perl - CAPTURE query


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl - CAPTURE query
# 1  
Old 04-30-2010
Question Perl - CAPTURE query

When i run script with option 1 it works, however if I assign path to variable $tmpfile and try to use that it writes to $tmpfile and not /var/tmp/abc.tmp, what am I missing?

1.
open (CAPTURE, '>>tmpfile');
print CAPTURE "$T1,$T2,$T3";
close (CAPTURE);

2.
my $tmpfile='/var/tmp/abc.tmp';
open (CAPTURE, '>>$file');
print CAPTURE "$T1,$T2,$T3";
close (CAPTURE);
# 2  
Old 04-30-2010
What do you mean "with option 1 and 2" ?
Assuming that are two different scripts, than I guess the open line of the second script need to be adjusted to:
Code:
open (CAPTURE, '>>$tmpfile');

# 3  
Old 04-30-2010
Quote:
Originally Posted by gefa
When i run script with option 1 it works, however if I assign path to variable $tmpfile and try to use that it writes to $tmpfile and not /var/tmp/abc.tmp, what am I missing?

1.
open (CAPTURE, '>>tmpfile');
print CAPTURE "$T1,$T2,$T3";
close (CAPTURE);

2.
my $tmpfile='/var/tmp/abc.tmp';
open (CAPTURE, '>>$file');
print CAPTURE "$T1,$T2,$T3";
close (CAPTURE);
Change the single quotes ' ' in option 2 to double quotes " "

In Perl, no variable interpolation takes place inside single quotes but does in double quotes. In single quotes, open is trying to open a file literally called '$file" and of course fails.

You will solve your own problem on something like this if you check the return of open like so:

Code:
open (CAPTURE, ">>$file") || die "can't open $file cause $!"

Also, the for of open you are using there is being deprecated for a three argement form with a scalar handle. It allows the Perl interpreter to give you more meaningful error and compile errors if you use the 3 arg form of open:

Read about it here
# 4  
Old 05-04-2010
Many thanks for that.

Just another question how is possible to split a field within perl

for example in a file I might have something like these fields seperated by a space;

this is a test
again this is a test
...

I want to read the file line by line and split each line so that I have a variable containing field one and a second variable containing all other fields?

I can do this in awk but being new to perl I'm not sure how to do it in perl.
# 5  
Old 05-04-2010
The Perl operator split will split fields on whitespace or any other regular expression in one go.

Here is the documentation for that. (Or $ perldoc -f split at the command prompt) The part you want specifically is:

Code:
If EXPR is omitted, splits the $_ string.  If PATTERN is also
omitted, splits on whitespace (after skipping any leading
whitespace).

Here are some Perl resources:

Books:
Learning Perl

Programming Perl AKA The Camel Book

There are also tremendous resources on the web:

Each and every Perl tutorial These are also part of your Perl install in most cases. Type $ perldoc perlreftut at the command prompt for example.

Perlmonks and Perlmonks Tutorials

Perl Circus

Perl.com

IBM Perl One Liners

Perl 1 liners

Jaffe's regex tutorial

tye's ref reference

And once you know a bit of Perl, read the Perldoc site front to back

Last edited by drewk; 05-04-2010 at 11:17 AM..
# 6  
Old 05-05-2010
Thanks for the info, is it possible do do something like the following awk statement in perl as a one liner?
to split and populate the variable $acmodel with contents of field 19 which has more than word, the file $acfilename is seperated by comma however field 19 I'd like to put a comma after the the first word to effectively make two fields out of it.

e.g this is a test would become this, is a test

Code:
my $acmodel=`cat $acfilename |awk -F, '{print $19}' |awk '{ for (i=2 ; i<=NF ; i++) print $1,$i}'


Last edited by Scott; 05-05-2010 at 05:25 AM.. Reason: Code tags
# 7  
Old 05-05-2010
Quote:
Originally Posted by gefa
... is it possible do do something like the following awk statement in perl as a one liner?
to split and populate the variable $acmodel with contents of field 19 which has more than word, the file $acfilename is seperated by comma however field 19 I'd like to put a comma after the the first word to effectively make two fields out of it.

e.g this is a test would become this, is a test

Code:
my $acmodel=`cat $acfilename |awk -F, '{print $19}' |awk '{ for (i=2 ; i<=NF ; i++) print $1,$i}'

I am not sure if your awk script works the way you say it does.

Code:
$
$ ## the awk script, for the 4th field instead of the 19th
$ echo "abc,def,456,the good bad ugly,xyz" |awk -F, '{print $4}' |awk '{ for (i=2 ; i<=NF ; i++) print $1,$i}'
the good
the bad
the ugly
$
$

You may want to show us what the line in the file pointed at by the variable $acfilename looks like.

In any case, a Perl equivalent is as follows:

Code:
$
$ ## the Perl script
$ echo "abc,def,456,the good bad ugly,xyz" | perl -F, -lane '@x=split/ /,$F[3]; for($i=1; $i<=$#x; $i++){print "$x[0] $x[$i]"}'
the good
the bad
the ugly
$
$

tyler_durden

---------- Post updated at 09:35 AM ---------- Previous update was at 09:15 AM ----------

Quote:
Originally Posted by gefa
...
e.g this is a test would become this, is a test
...
On the other hand, if the 19th field in the comma-delimited file is:

Code:
this is a test

and you want to convert that to -

Code:
this, is a test

then here's an idea:

Code:
$
$
$ echo "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,this is a test,20" | perl -pe 's/(([^,]*,){18}\w+)/$1,/'
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,this, is a test,20
$
$

tyler_durden
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Capture output of open pipe to a file in perl

Hi, I am trying to capture the output of the an open pipe in perl. but I am not sure how to do this. can some one please help me do that? Below is the script I am using (2 Replies)
Discussion started by: ahmedwaseem2000
2 Replies

2. Programming

Perl Query

Hi , Im using the below script to find the Good and Bad for the file permission. $rc=`find /etc/security/opasswd -perm 0600 -print -ls`; if($rc == 1) { print "GOOD: AD.1.8.4.1: The file /etc/security/opasswd exists and had permission 0600\n\n"; ... (6 Replies)
Discussion started by: gsiva
6 Replies

3. Shell Programming and Scripting

Capture query returned values in file.

Hi All, I am connecting to Oracle DB from UNIX script. Want to capture all dates between start date and end date and store them in file. Once this is done, want to read dates one by one. How to achive this in UNIX and Oracle? Please let me know if you have any idea on the same. Thanks and... (4 Replies)
Discussion started by: Nagaraja Akkiva
4 Replies

4. Shell Programming and Scripting

Script to capture date/time in seconds in PERL... Cant understand errors

I'm Using this script to find the time of a file. I'm very much new to PERL and found this script posted by some one on this forum. It runs perfectly fine, just that it gives me following errors with the accurate output as well. I jus want the output to be stored in another file so that i can... (0 Replies)
Discussion started by: bankimmehta
0 Replies

5. Shell Programming and Scripting

[Perl] Capture system call error message.

Hi, I googled a bit, but could not find the answer to my problem. But I am sure it is a common issue. I have this code: #!/bin/perl -w #-d use strict; sub remsh_test() { my $host = $_; printf "\n----\n\n"; printf "remsh to $host with system call\n"; my $result = system... (3 Replies)
Discussion started by: ejdv
3 Replies

6. Shell Programming and Scripting

Perl Query Regarding format

Hello people. I have got the following script QM=ARGV; open (CHS_OUT, "echo 'DISPLAY QSTATUS(SYSTEM.CLUSTER.MY.QUEUE) all'|runmqsc $qm|"); while (<CHS_OUT>) { if ( /QUEUE\(/ ) { $QueueName = ValueParser("QUEUE", 6); } if ( /IPPROCS\(/ ) { $InpProcs = ValueParser("IPPROCS", 8); #print... (3 Replies)
Discussion started by: King Nothing
3 Replies

7. UNIX and Linux Applications

Perl - PostGreSql query

Guys, I guess, I posted something in the wrong forum. Here it is - https://www.unix.com/shell-programming-scripting/67395-perl-postgrepsql-question.html Can you please help me with this? Regards, garric (0 Replies)
Discussion started by: garric
0 Replies

8. UNIX for Dummies Questions & Answers

Query in perl

can any1 give me line by line explanation for the following perl script as i dunno perl .. n i have searched in google .. but still thn i wanna confirm my findings fro perl experts :mad: perl -e 'while (<>) { print; $num = 2 if /fail_halt/i; $num = 1 if (/failure/i && ($num < 1)); }... (2 Replies)
Discussion started by: Dana Evans
2 Replies

9. Shell Programming and Scripting

perl query

a file test.dat has the following David Veterinarian John Orthopedist Jeff Dentist perl -p -e "s/\s*(\w+).*/$1/;" test.dat ......will print David Jonh Jeff how does the part in double quotes work out.... (1 Reply)
Discussion started by: bishweshwar
1 Replies

10. Shell Programming and Scripting

lazy capture don't work (regexp in perl)

hello all im trying to capture only the first brackets but no matter what i do i keep capturing from the first brackets to the last one , here what i have : <% if (!Env.strLen(oidInvoice)); szDocumentTitle = Env.formatS("S",Env.getMsg("BP_INVOICE_ENUMERATION_CREATE_TITLE")) %> and... (1 Reply)
Discussion started by: umen
1 Replies
Login or Register to Ask a Question