Perl chomp plus=~s产生非常奇怪的结果
我正在编写一个perl程序,它创建一个procmailrc文本文件 procmail需要的输出如下所示: (部分IP地址以“|”分隔) 以下是我的perl脚本:Perl chomp plus=~s产生非常奇怪的结果,perl,pipe,substitution,carriage-return,chomp,Perl,Pipe,Substitution,Carriage Return,Chomp,我正在编写一个perl程序,它创建一个procmailrc文本文件 procmail需要的输出如下所示: (部分IP地址以“|”分隔) 以下是我的perl脚本: open (DEAD, "$dead"); @dead = <DEAD>; foreach $line (@dead) { chomp $line; $line =~s /\./\\./g; print FILE "\\(\\[$line\|\n"; } close (DEAD); 为什么chomp不删除换行符? 更奇怪的
open (DEAD, "$dead");
@dead = <DEAD>;
foreach $line (@dead) { chomp $line; $line =~s /\./\\./g;
print FILE "\\(\\[$line\|\n"; }
close (DEAD);
为什么chomp不删除换行符?
更奇怪的是,为什么“|”出现在每行的前面,而不是末尾
如果我用一个单词替换$line,(打印文件“\(\[test\\\”;})
输出的外观与我期望的相同:
\(\[test|\(\[test|\(\[test|\(\[test|
我错过了什么
所以我找到了一个不使用chomp的解决方案:
答案是:
我的新代码:
open (DEAD, "$dead");
@dead = <DEAD>;
foreach $line (@junk) {
$line =~ s/\r[\n]*//gm; $line =~ s/\./\\./g; $line =~ s/\:/\\:/g;
print FILE "\\(\\[$line \|"; }
close (DEAD);
open(死,“$DEAD”);
@死亡=;
foreach$行(@junk){
$line=~s/\r[\n]*//gm;$line=~s/\./\./g;$line=~s/\://\:/g;
打印文件“\\(\\[$line\\\\”;}
关闭(死);
感谢你们给了我一些提示。
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");
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");
我怀疑您的数据中有回车符和换行符,导致
字符出现在行首。这只是一个猜测。请尝试从$line
中删除所有空白字符。数据是一个包含回车符的IP地址列表(\r)。对于每一行数据,我都在尝试选择该回车符,然后它应该打印$line,并在处理下一个$line之前添加|字符。我希望所有输出都在一行上。s///函数似乎完成了我期望它完成的操作,但我对选择设置的方式感到不舒服。可能还有其他一些事情要做n使用我的打印命令。我很困惑!chomp删除了一个尾随的\n
,而不是\r
…将答案作为答案发布,即使是您自己的答案question@Shawn删除的当前值,默认情况下仅为\n
。我怀疑您的数据中存在回车符和换行符,导致
字符将显示在行首。这只是一个猜测。请尝试从$line
中删除所有空白字符。数据是带回车符的IP地址列表(\r)。对于每一行数据,我都在尝试选择该回车符,然后它应该打印$line,并在处理下一个$line之前添加|字符。我希望所有输出都在一行上。s///函数似乎完成了我期望它完成的操作,但我对选择设置的方式感到不舒服。可能还有其他一些事情要做n使用我的打印命令。我很困惑!chomp删除了一个尾随的\n
,而不是\r
…将答案作为答案发布,即使是您自己的答案question@Shawn删除的当前值,默认情况下仅为\n
。
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");