我正在编写一个创建procmailrc文本文件的perl程序。
输出procmail要求如下所示: (部分IP地址以“ |”分隔)
\(\[54\.245\.|\(\[54\.252\.|\(\[60\.177\.|
这是我的perl脚本:
open (DEAD, "$dead");
@dead = <DEAD>;
foreach $line (@dead) { chomp $line; $line =~s /\./\\./g;
print FILE "\\(\\[$line\|\n"; }
close (DEAD);
这是我得到的输出:
|(\[54\.245\.
|(\[54\.252\.
|(\[60\.177\.
为什么chomp不删除换行符? 还是陌生人,为什么是“ |”出现在每行的开头,而不是结尾?
如果我用一个单词替换$ line,(打印FILE“ \(\ [test \ |”;}) 输出看起来像我期望的样子:
\(\[test|\(\[test|\(\[test|\(\[test|
我在这里想念什么?
因此,我找到了不使用chomp的解决方法: 答案在这里:https://www.perlmonks.org/?node_id=504626
我的新代码:
open (DEAD, "$dead");
@dead = <DEAD>;
foreach $line (@junk) {
$line =~ s/\r[\n]*//gm; $line =~ s/\./\\./g; $line =~ s/\:/\\:/g;
print FILE "\\(\\[$line \|"; }
close (DEAD);
感谢那些给我一些提示的人。
答案 0 :(得分:2)
chomp
删除$/
的值,该值默认设置为"\n"
产生的字符串。
但是,您可以输入
@dead = (
"54.245\.\r\n",
"54.252\.\r\n",
"60.177\.\r\n",
);
这个简单的解决方法:
open(my $dead_fh, '<', $dead_qfn)
or die("Can't open \"$dead_qfn: $!\n");
while (my $line = <$dead_fh>) {
$line =~ s/\s+\z//;
$line =~ s/\./\\./g
print($out_fh "\\(\\[$line\|");
}
print($out_fh "\n");
(另一种方法是将:crlf
层添加到输入句柄。)
使用quotemeta
更有意义
open(my $dead_fh, '<', $dead_qfn)
or die("Can't open \"$dead_qfn: $!\n");
while (my $line = <$dead_fh>) {
$line =~ s/\s+\z//;
print($out_fh quotemeta("([$line|"));
}
print($out_fh "\n");