Allen Pitts
asked on
Perl: Backslash found where operator expected
Hello expert,
This Perl code works when the path used for the target
file is in the same directory as the Perl executable.
But when I change to a shared drive on the network
open (MYFILE, '>>I:\Internal_Processes\S ervice_Now _Discovery \CMDB_data \data2.txt ');
I get
Backslash found where operator expected at open_ie4.pl line 18, near "Internal_Processes"
Obviously it doesn't like the the backslashes in the file path but how do I tell it
where the target file is without using backslashes in the file path?
Thanks
Allen
+++++++++++++++complete code+++++++++++++++++++++
#!/strawberry perl
use v5.10.0;
use warnings;
#use strict;
# go to url that is the table of servers in ServiceNow configuration
# read the table into variable $req
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$req = HTTP::Request->new(GET => 'https://lhphgtst.service-now.com/cmdb_ci_datacenter.do?XML');
$req->authorization_basic( 'allen.pit ts', 'password');
# write the table into a file on a local disk
open (MYFILE, '>>I:\Internal_Processes\S ervice_Now _Discovery \CMDB_data \data2.txt ');
print MYFILE $ua->request($req)->as_str ing;
close (MYFILE);
++++++++++++++++++++++end complete code++++++++++++++++++++++ ++
This Perl code works when the path used for the target
file is in the same directory as the Perl executable.
But when I change to a shared drive on the network
open (MYFILE, '>>I:\Internal_Processes\S
I get
Backslash found where operator expected at open_ie4.pl line 18, near "Internal_Processes"
Obviously it doesn't like the the backslashes in the file path but how do I tell it
where the target file is without using backslashes in the file path?
Thanks
Allen
+++++++++++++++complete code+++++++++++++++++++++
#!/strawberry perl
use v5.10.0;
use warnings;
#use strict;
# go to url that is the table of servers in ServiceNow configuration
# read the table into variable $req
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$req = HTTP::Request->new(GET => 'https://lhphgtst.service-now.com/cmdb_ci_datacenter.do?XML');
$req->authorization_basic(
# write the table into a file on a local disk
open (MYFILE, '>>I:\Internal_Processes\S
print MYFILE $ua->request($req)->as_str
close (MYFILE);
++++++++++++++++++++++end complete code++++++++++++++++++++++
Use forward slashes instead of back slashes.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Dr. FishMonger,
Awesome answer.
1) Commenting out the 'use strict; statement is a bad idea. Ignoring the errors that it would point out is never a good idea.
I get this. Sort of reminds of 'option explicit' in VB. It requires that variable be declared.
2a) You should use a lexical var for the filehandle instead of a bareword.
This one took some research
Lexical Variables
Lexical variables are those declared with my.
Lexical variables must be explicitly declared using the my qualifier.
Lexical variables belong to no package so cannot be fully qualified with a package name.
I think 'use strict' also disables the inappropriate use of barewords.
I think a bareword is an undeclared variable or filehandle.
Researched 'package' but could never get a clear explanation of what a package is.
2b) You should use the 3 arg form of open...
Again had to wrap my head around this but found
Three arguments: the filehandle to open or vivify, the mode of the filehandle, and the name of the file.
So in your excellent code: $MYFILE is the filehandle; >> is the mode, append; [could also be >, overwrite, other modes?] and $file is the name and path of the file
or die is a sort elegant way of handling an error
2c) You should always check the return code of an open call
die is a sort elegant way of handling an error
Thanks
Allen in Dallas (Perl noob)
Awesome answer.
1) Commenting out the 'use strict; statement is a bad idea. Ignoring the errors that it would point out is never a good idea.
I get this. Sort of reminds of 'option explicit' in VB. It requires that variable be declared.
2a) You should use a lexical var for the filehandle instead of a bareword.
This one took some research
Lexical Variables
Lexical variables are those declared with my.
Lexical variables must be explicitly declared using the my qualifier.
Lexical variables belong to no package so cannot be fully qualified with a package name.
I think 'use strict' also disables the inappropriate use of barewords.
I think a bareword is an undeclared variable or filehandle.
Researched 'package' but could never get a clear explanation of what a package is.
2b) You should use the 3 arg form of open...
Again had to wrap my head around this but found
Three arguments: the filehandle to open or vivify, the mode of the filehandle, and the name of the file.
So in your excellent code: $MYFILE is the filehandle; >> is the mode, append; [could also be >, overwrite, other modes?] and $file is the name and path of the file
or die is a sort elegant way of handling an error
2c) You should always check the return code of an open call
die is a sort elegant way of handling an error
Thanks
Allen in Dallas (Perl noob)
ASKER
excellent reply