linux - 使用单引号的 Perl 行运行速度比使用双引号快 30 倍

标签 linux perl bash

我们的任务是将二进制文件中的一些字符串更改为小写(从混合/大写/其他)。相关的字符串是对其他文件的引用(它与我们也从 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/

相关文章:

git - 从 Github checkout 分支,无需克隆整个仓库,也无需 Git

bash - 将波浪号回显到文件而不在 Bash 中扩展它

c - Ptrace - 与子进程的通信

php - 停止向浏览器打印 php 错误消息

php - 在 mysql 中组织更改字段值

Perl 不能在具有 32 GB RAM 的 Snow leopard Mac 服务器上分配超过 1.1 GB

linux - KASAN 在调用 copy_from/to_user 时提示

linux - 如何测试系统重启时间是否超过一年?

objective-c - 从 Objective-C cocoa 调用 Perl 库

linux - 为什么 `read -t` 在 RHEL 上的 bash 中没有超时?