Solved

Why is my $1 variable empty after successful match in Perl?

Posted on 2014-11-13
8
201 Views
Last Modified: 2014-11-14
This should be a no-brainer, but clearly I'm missing something obvious. Why doesn't this work? I'm just trying to get the contents of the matched portion of a string. It should be $1 right? Obviously, this is a very simple test -- my bigger application is much more complicated, so please tell me what I'm doing wrong.

Perl script:

my $var1 = "Hello";
print "original string: $var1";
if ($var1 =~ /Hello/ ) {print "<br>found";}
print "<br>matched string: $1";

Output:

original string: Hello
found
matched string:
0
Comment
Question by:datastarstar
  • 3
  • 3
  • 2
8 Comments
 
LVL 28

Assisted Solution

by:FishMonger
FishMonger earned 334 total points
ID: 40440959
You forgot to capture the match i.e., you forgot the parens.

if ($var1 =~ /(Hello)/ ) {print "<br>found";}

Open in new window

0
 

Author Comment

by:datastarstar
ID: 40441156
Duh, that worked! Hope you don't mind a follow-up question. What I'm really trying to do is to get the full contents of a file and load it into a hash using eval. This worked fine until I turned tainting on (-T switch). Since taint doesn't like eval unless using $1, I tried to regex match the entire contents like this. But even with the ()'s like you suggested $1 seems empty (print $1 yields nothing)...

my $filecontents=<INFILE>;  # the file contains a text representation of a hash definition
close FILE;
$filecontents =~ /(.*)/ )
print $1;
my %myHash = (eval($1));
0
 
LVL 84

Expert Comment

by:ozo
ID: 40441172
Is the entire file just one line?
0
 
LVL 28

Expert Comment

by:FishMonger
ID: 40441303
Ouch.  Given that small amount of info, it appears to me that you are using an awkward if not ugly approach to storing and retrieving your hash.  The Storable module or one of the config modules would be a better method.

Unless your file only has one line, you'll need to adjust how you're reading it into the scalar, which as written only reads in 1 line.
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 

Author Comment

by:datastarstar
ID: 40441570
This line might be important for you to see:

undef $/;
my $filecontents=<INFILE>;
...

The file is actually very large -- hundreds of lines of hash defs.  If there's a better way to create a hash from a file, I'd love to hear it.

Thanks!
0
 
LVL 84

Assisted Solution

by:ozo
ozo earned 166 total points
ID: 40441688
Maybe
do "filename";
or
$filecontents =~ /(.*)/s
0
 
LVL 28

Accepted Solution

by:
FishMonger earned 334 total points
ID: 40441727
I would need to see a sample of your file to see if we can parse it directly with one of the config modules without altering how it gets created.

Here's an example how you can use the Storable module to store the hash in a file for later retrieval either in the same script or some other script.

#!/usr/bin/perl

use strict;
use warnings;
use Storable qw(store retrieve freeze thaw dclone);

my %orig_hash = (
    foo => 'foo',
    bar => 'bar',
    baz => 'baz'
);

store(\%orig_hash, 'hash.cfg');


# you can retrieve the hash data as a regular hash or as a hash_ref
my %retrieved_hash = %{ retrieve('hash.cfg') };

foreach my $key (keys %retrieved_hash) {
    print "$retrieved_hash{$key}\n";
}

Open in new window


If the file defines multiple hashes, then the Storable module may not best solution.  In that case, I'd go with one of the other config modules.

If the file is setup correctly, then the do "filename" as ozo suggests would be the shortest/easiest solution, but is not the approach I would personally use in a production script.
0
 

Author Comment

by:datastarstar
ID: 40443000
Thanks to you both. I'm using Ozo's fix initially but plan to adopt FishMonger's suggestion moving forward. Since FM answered the original question, I did a 2/3 - 1/3 split of the points. Hope that's fair.

Thanks again!
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
perl exit code 2 243
Shell Script to find a string in server(s) log file 2 258
perl script help 12 101
perl split by | 2 80
On Microsoft Windows, if  when you click or type the name of a .pl file, you get an error "is not recognized as an internal or external command, operable program or batch file", then this means you do not have the .pl file extension associated with …
In the distant past (last year) I hacked together a little toy that would allow a couple of Manager types to query, preview, and extract data from a number of MongoDB instances, to their tool of choice: Excel (http://dilbert.com/strips/comic/2007-08…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now