I found a solution that works, but to gain more understanding (and I'm stubborn that way) I want to know why my first solution does not work.
I'm parsing a file, looking for a single line to replace 2 characters.
Line in question:
__msr2f6: data8 0b00000000000000000000000000_1_0_000000000000001
My initial search/replace was this:
$line =~ s/^(__msr2f6:\s+data8 0b+_)_(_+_+)/$10_0$
This causes an error to be printed:
Use of uninitialized value in concatenation (.) at myscript.pl line 33
+, <FILE> line 915.
A co-worker suggested a change, but didn't know why it might work:
$line =~ s/^(__msr2f6:\s+data8 0b+)___(+_+)/$1_0_0
So I moved the leading and trailing underscore out of the parens and put them in the replace string.
Here are some things I think I understand, but then again maybe not...
1. Backrefrences are 1-9, only a single digit.
2. Underscores are valid variable name components.
So what changes between these two examples? If the first variable is being treated as $10_0, then why is the second not being treated as $1_0_0_?
This solution also works:
$line =~ s/^(__msr2f6:\s+data8 0b+_)_(_+_+)/$1."0_
But it is probably slower than the other working solution.
Thanks for the enlightenment!
Are you posting in the right place? Check out Where do I post X? to know for sure.
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
Want more info? How to link or
or How to display code and escape characters
are good places to start.