Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re^2: sed command with variable in perl

by AnomalousMonk (Archbishop)
on Aug 16, 2017 at 00:16 UTC ( [id://1197473]=note: print w/replies, xml ) Need Help??


in reply to Re: sed command with variable in perl
in thread sed command with variable in perl

Hi samira_saber. First things first: Please edit your reply to add code tags around your code! Please see Markup in the Monastery and Writeup Formatting Tips; also see How do I change/delete my post? for general node-editing etiquette.

Some comments (in no particular order):

  • ... it is not working ...
    This is almost useless as a problem description. What is "it"? Is it the code you have posted? How does it not work? Is there an error or warning message or messages? Under what conditions of input, etc., etc.? (Later in your reply you write "... before that i read the variable from the text file and print it and it worked." I don't understand this statement, especially in the context of your statement that "it" is not working.)
  • The code in your reply does not have the lines
        use warnings;
        use strict;
    at the start of the source code. These provide very important support and protection for a novice Perler — and for elder Monks as well; I rarely write write a Perl program without using them. See warnings and strict. Use of these modules (called pragmas by convention) is referred to as "enabling warnings and strictures."
  • Your code statement
        my $filename_in = "topol1.top";
    means you are hard-coding the input file name, whereas I was taking the file name from a command line argument. Indeed, the code still requires at least one command line argument (assumed to be the file name) to be present when the script is invoked; the statement
        die "usage: perl $0 file.name \n" unless @ARGV;
    enforces this (see perlvar for info on the  @ARGV array).
  • ... i omitted the line for the $sol.
    In my original code, the my variable  $sol1 holds the string to be substituted in the  s/// substitution operation.
        s{ (SOL) [^\n*] }{$1 $sol1}xmsg;
    I don't understand the point of the substitution operation without something to substitute. Further, if strictures had been enabled (again, see strict), the code would not even compile without this variable being defined and in scope. Even without strictures enabled, warnings would have complained (a run-time warning, not a fatal error) if an undeclared variable having an undefined value had been used — if warnings had been enabled.
  • ... it is not working ... I down know why ...
    This is always useful: Basic debugging checklist.

I hope these comments will be helpful. If you have any questions, please don't hesitate to ask.


Give a man a fish:  <%-{-{-{-<

Replies are listed 'Best First'.
Re^3: sed command with variable in perl
by samira_saber (Novice) on Aug 16, 2017 at 05:14 UTC
    Hi AnomalousMonk

    ....... using warning; first of all , i used that line before ( use strict; use warning;) at the top of my Perl code and for this reason I omit them. I think i should explain a little bit about my code. I have to m file (from matlab) and I just want to make them work automate as a software. I am very very new into Perl. For this reason I used linux shell commands and it worked fine. Now , There is problem with my code.

    .... File name argument I will put my file name in the correct place , thank you.

    ..... substitution operation without something to substitute As i mentioned before, I have two files each of them has spciefic SOL number which I used grep command to count them and then use it as a variable. $cmd =("grep -e HW1 myhalf1.pdb | wc -l > text1.txt") ; open FILE, "<text1.txt"; my $sol1= do {local $/; <FILE>}; print p ("sol1=$sol1"); As you see I have it before. in the code, which you had posted i just omit this line my $sol1 = 'my new stuff'; because i introduce my variable before. and the next line which have $sol1 is remained intact. s{ (SOL) ^\n* }{$1 $sol1}xmsg;

    ......about errors i ve added the code into my .pl file and run it. After that I check error_log file in the server and there is no warning. I have just changed the line into this my $filename_in = 'topol1.top'; no error.even not making another file. and i ve checked the file permission too.no problem about the permission.

      Try

      #!/usr/bin/perl use strict; use warnings; my $filename_pdb = 'myhalf1.pdb'; my $filename_in = "topol1.top"; my $filename_out = "$filename_in.new"; open my $fh_pdb, '<', $filename_pdb or die "opening '$filename_pdb': $!"; my $sol1 = grep /HW1/,<$fh_pdb>; close $fh_pdb; print "\$sol1 = $sol1\n"; open my $fh_in, '<', $filename_in or die "opening '$filename_in': $!"; open my $fh_out, '>', $filename_out or die "opening '$filename_out': $!"; print "processing '$filename_in' \n"; my $count = 0; while (<$fh_in>) { if ( s/SOL .*/SOL $sol1/g ){ # change as required ++$count; } print $fh_out $_; } close $fh_in; close $fh_out; print "$count lines changed\n";
      poj
        Dear AnomalousMonk, Yes it worked, and I am so happy. Thank you for your big help. I cant believe that it is solved finally. It is more than one week which I try different solutions and you did it.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1197473]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (3)
As of 2024-04-25 06:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found