http://www.perlmonks.org?node_id=1026454


in reply to regex pattern match

A quick addition to the problem .. I have a separate part of text that i need to replace .. for eg: I/p(read from a file) is of the form:
"ABC","DEF","This is a test","Hello";
and the o/p needs to look something like :
"ABC","DEF","This is a substitution","Hello";
In short i need to replace pattern within quotes in a line .. I need help with the pattern match .. please help ..!!! Update:
Could some one please help me debug this code..??
#!/usr/bin/perl -w my $variable; my @fields; my $line =0 ; use vars qw($current_path $filename); print "Enter the desired path: "; my $path = <STDIN>; chomp( $path ); my $in_file = "test.txt"; my $out_file = "testout.txt"; open (DATA, "<$in_file") or die "Can't open $in_file: $!\n"; open (OUT, ">$out_file") or die "Can't open $out_file: $!\n"; while ( <DATA> ) { chomp; my ($first, $last ) = /(.+",)(.+)/; $last =~ s//"\n$first"/g; my @parameters = split /"\s*,\s*"/, $first; $parameters[1] =~ tr/"//d; my $path = "$path\\"; my $new_path = $path.$parameters[1]; @array = split(/,/,$last); foreach $entry(@array) { $entry =~ tr/"//d; $entry =~ s|(.+)\\|$1::|; ($current_path,$filename) = split/::/,$entry; $last =~s/$current_path/$new_path/ig; #rename the last entry which con +tains a path to folder name with the new path print "$last\n"; } print "\n"; } close DATA; close OUT;

Replies are listed 'Best First'.
Re^2: regex pattern match
by AnomalousMonk (Archbishop) on Apr 01, 2013 at 23:00 UTC
    my ($first, $last ) = /(.+",)(.+)/; $last =~ s//"\n$first"/g;

    I second hdb's reply in general.

    Let me add that the
        $last =~ s//"\n$first"/g;
    statement from the posted code quoted above is very unlikely to do what you want: it will match the  // null regex pattern globally and do a substitution against what is matched. If there has been a previous successful regex match (e.g., the match in the preceding line), the  // regex matches using the previously matched regex. (If there has been no previous successful regex match, the  // regex matches anything!) As it stands, this substitution seems to be a no-op. If it is part of some carefully thought out strategy, I advise you to abandon it immediately: it has 'maintenance nightmare' written all over it! (In the code example below,  \x22 stands in for an unbalanced  " (double-quote) character.)

    >perl -wMstrict -le "$_ = qq{\"ABC\",\"DEF\",\"This is a test\",\"Hello\"}; ;; my ($first, $last ) = /(.+\x22,)(.+)/; print qq{'$last'}; ;; $last =~ s//\"\n$first\"/g; print qq{'$last'}; " '"Hello"' '"Hello"'
Re^2: regex pattern match
by hdb (Monsignor) on Apr 01, 2013 at 12:33 UTC

    Your question is not easy to understand. Would it be possible to provide:

    • A sample input file, just a couple of lines,
    • the desired output file, and
    • some more ideas what you want to match and replace?
    Also, it seems, as your example grows more complex, you should be using Text::CSV, which allows you to first split your line properly along the commata, and then to split any entry along commata.