簡體   English   中英

Perl chomp plus =〜s產生非常奇怪的結果

[英]Perl chomp plus =~s Yielding very strange results

我正在編寫一個創建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);

感謝那些給我一些提示的人。

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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM