我有這個 perl 腳本:
use strict;
use warnings;
foreach my $line (" ^?[?12;12A", " ^?[A") {
print "$line\n";
$line =~ s/\s?[[:cntrl:]]\[(\?)?([0-9]{1,2}(;[0-9]{1,2})?)?[a-zA-Z]//g;
print "$line\n";
}
這是兩個以空格開頭的字串,然后是控制字符,然后是一些常規的 ascii 字符。結果是這個錯誤:
$ perl foo.pl
[?12;12A
Modification of a read-only value attempted at foo.pl line 6.
$
我究竟做錯了什么?
uj5u.com熱心網友回復:
在foreach回圈中,回圈變數(“topicalizer”)只是當前處理的串列元素的別名;通過改變它,我們真正改變了元素。
如果 LIST 的任何元素是左值,您可以通過修改回圈內的 VAR 來修改它。相反,如果 LIST 的任何元素不是左值,則任何修改該元素的嘗試都將失敗。換句話說,
foreach回圈索引變數是您正在回圈的串列中每個專案的隱式別名。
問題中的回圈遍歷字串文字串列,這些是只讀的。嘗試更改這是一個致命錯誤 (perldiag),并給出了這種 ( foreach) 情況作為一個示例。
Hameed 的回答中顯示了一些解決方法,首先將它們存盤在陣列中或分配給變數。或者在替換運算子上使用“非破壞性”修飾符s///r,它不會更改原始值,但會回傳更改后的值(如果沒有更改,則回傳原始值)。
uj5u.com熱心網友回復:
在您的情況下, $line 是一個只讀值。
您可以通過兩種方式解決此問題:
使用實際的陣列,例如
my @testarray = (" ^?[?12;12A", " ^?[A");將 $line 的值分配給另一個變數并修改它:
my $tmp = $line; $tmp =~ s/\s?[[:cntrl:]]\[(\?)?([0-9]{1,2}(;[0-9]{1,2})?)?[a-zA-Z]//g;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/504245.html
上一篇:Perltr替換但忽略前2個字符
