我们的任务是将二进制文件中的一些字符串更改为小写(从混合/大写/其他)。相关的字符串是对其他文件的引用(它与我们也从 Windows 迁移到 linux 作为服务器环境的升级有关,所以这种情况突然很重要)。我们已经编写了一个脚本,它使用 perl 循环来执行此操作。我们有一个包含大约 300 个文件的目录(目录的总大小约为 150M),所以它是一些数据,但不是很大。
以下 perl 代码大约需要 6 分钟来完成这项工作:
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
而下面的 perl 代码需要 3 个多小时!
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
谁能解释一下为什么? $file_ref 是否作为字符串 $file_ref 而不是替换为单引号版本中的值?在这种情况下,它在这个版本中取代了什么?我们想要的是将任何文件名的所有出现都替换为小写。如果我们在之前和之后的文件上运行字符串并搜索文件名,那么两者似乎都进行了相同的更改。但是,如果我们对两个循环生成的文件运行 diff (diff firSTLoop/file1 secondloop/file1),那么它会报告它们不同。
这是从 linux 上的 bash 脚本中运行的。
最佳答案
Shell 不会对单引号字符串进行变量替换。所以,第二个是一个不同的程序。
关于linux - 使用单引号的 Perl 行运行速度比使用双引号快 30 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6957087/