Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl chomp plus=~s产生非常奇怪的结果_Perl_Pipe_Substitution_Carriage Return_Chomp - Fatal编程技术网

Perl chomp plus=~s产生非常奇怪的结果

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不删除换行符? 更奇怪的

我正在编写一个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不删除换行符? 更奇怪的是,为什么“|”出现在每行的前面,而不是末尾

如果我用一个单词替换$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");