Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Perl line runs 30 times quicker with single quotes than with double quotes

Tags:

linux

bash

perl

We have a task to change some strings in binary files to lowercase (from mixed/upper/whatever). The relevant strings are references to the other files (it's in connection with an upgrade where we are also moving from Windows to linux as a server environment, so the case suddenly matters). We have written a script which uses a perl loop to do this. We have a directory containing around 300 files (total size of the directory is around 150M) so it's some data but not huge amounts.

The following perl code takes about 6 minutes to do the job:

for file_ref in `ls -1F $forms6_convert_dir/ | grep -v "/" | sed 's/\(.*\)\..*/\1/'` 
do
    (( updated++ ))
    write_line "Converting case of string: $file_ref "
    perl -i -pe "s{(?i)$file_ref}{$file_ref}g" $forms6_convert_dir/* 
done

while the following perl code takes over 3 hours!

for file_ref in `ls -1F $forms6_convert_dir/ | grep -v "/" | sed 's/\(.*\)\..*/\1/'` 
do
    (( updated++ ))
    write_line "Converting case of string: $file_ref "
    perl -i -pe 's{(?i)$file_ref}{$file_ref}g' $forms6_convert_dir/* 
done

Can anyone explain why? Is it that the $file_ref is getting left as the string $file_ref instead of substituted with the value in the single quotes version? in which case, what is it replacing in this version? What we want is to replace all occurances of any filename with itself but in lowercase. If we run strings on the files before and after and search for the filenames then both appeared to have made the same changes. However, if we run diff on the files produced by the two loops (diff firstloop/file1 secondloop/file1) then it reports that they differ.

This is running from within a bash script on linux.

like image 977
Adam Avatar asked Aug 05 '11 13:08

Adam


People also ask

What is the difference between single quoted string and double quoted string in Perl?

The String is defined by the user within a single quote (') or double quote (“). In Perl, strings can be put in between double-quotes (” “) or in between single-quotes (' '). However, strings defined in single-quotes and those defined in double-quotes are treated differently.

How do I escape a single quote in Perl?

This works because in Perl, the s/.../.../ notation supports backslash-escapes. \x27 is a hexadecimal escape ( ' being U+0027). Show activity on this post. This ends the quoted part, escapes a single quote as it would appear outside of quotes, and then begins the quoting again.

What is the difference between single and double quotation marks in coding?

As far as language syntax is concerned, there is no difference in single or double quoted string. Both representations can be used interchangeably. However, if either single or double quote is a part of the string itself, then the string must be placed in double or single quotes respectively.


1 Answers

The shell doesn't do variable substitution for single quoted strings. So, the second one is a different program.

like image 62
Karoly Horvath Avatar answered Oct 11 '22 14:10

Karoly Horvath