看着乔纳森的答案,我想出了一些奇怪的东西来发布一个新的答案。我想补充一点,这应该被视为一个练习示例(也许是混淆),而不是任何正确的代码。该解决方案的全部功劳归于 Jonathan。此外,如底部所述,这是一个危险的解决方案。
perl -ple 'open STDOUT, $_' yourfile.txt
这依赖于Jonathan发现>seq1
的旧 2-argument开头的行。例如将创建(覆盖)并打开文件进行写入。open
open $fh, ">seq1"
seq1
同时,任何没有有效“模式”符号的行—— <
,>
等|
——将默认打开以供阅读,如果我们押注其中不123 234 56
存在具有名称等的文件这一事实目录,我们可以依靠我们open
的静默失败并维护先前打开的STDOUT
文件句柄。
通过使用该-l
选项,我们不需要chomp
$_
使open
不会失败,也不需要在打印中添加换行符。同时,该-p
选项将负责创建while
循环并进行打印。
因为默认情况下打印到STDOUT
,所以我们需要做的就是重新打开STDOUT
文件句柄,输入文件的内容负责其余的工作。
这个单行代码的完整代码带有注释以表示哪些部分来自哪个开关:
BEGIN { $/ = "\n"; $\ = "\n"; } # -l, gives newlines to print
while (<>) { # -p
chomp $_; # -l
open STDOUT, $_; # our code
}
continue {
print STDOUT $_; # -p
}
注意:此代码将释放open
命令的全部功能,这很危险,因为在这种情况下,允许在您的文件系统上执行任意命令。这是允许使用 2-argument open 的副作用。