我的 Perl 程式只洗掉字串的最后三個字符。目前,我正在尋找一種方法來查找計數,包括 使用或洗掉substrPerl 中是否有任何內置函式。
open my $hfile, $ARGV[0] or die "Can't open $ARGV[0] for reading: $!";
while( my $line = <$hfile> ){
if ($line =~ / /){
$line = substr($line, -3);
print $line;
}
}
close $hfile;
輸入檔案
hello_aba 32
gaww_ajnd_arhb 176
ajnbjsdsjn 416
輸出檔案
hello_aba
gaww_ajnd_arhb
ajnbjsdsjn
uj5u.com熱心網友回復:
這是 perl 單行程式的經典任務。在控制字符之后洗掉時,我會謹慎行事。首先,將其錨定到行尾。其次,確保只洗掉預期的字符。
假設要洗掉的字符 1) 不包括加號 ,2) 不包括換行符,我會寫:
perl -pe' s/\ [^ \n]*$// ' file.txt
[^ ... ]是一個字符類,它被否定^以表示“匹配任何與內部內容不匹配的字符”。
雖然 不遵循任何可能被認為是文字加號而不是元字符,但我認為轉義它\ 是正確的,并且可以防止未來的更新錯誤。確保該行的其余部分不包含 確保任何額外的加號不會導致我們丟失資料,例如
if foo = 2, then foo bar = 4 123
# ^ first ^ second
添加$for end of line 會將匹配錨定到行尾。這將防止任何額外的 跡象擾亂我們的輸入。否則它將在找到的兩個第一個加號之間洗掉。
由于我們不洗掉行尾\n,因此檔案結構保持不變。
示范:
$ cat plus.txt
hello_aba 32
gaww_ajnd_arhb 176
ajnbjsdsjn 416
foo bar = 3 123
$ perl -pe' s/\ [^ \n]*$//' plus.txt
hello_aba
gaww_ajnd_arhb
ajnbjsdsjn
foo bar = 3
如果要更改輸入檔案,可以使用重定向:
$ perl -pe ..... > newfile.txt
或添加-i開關以執行就地編輯:
$ perl -pi.bak -e ....
(.bak將創建一個帶有擴展名的備份檔案.bak)。請注意,原始檔案已被覆寫,因此請謹慎使用。
uj5u.com熱心網友回復:
要洗掉行中“ ”之后的任何內容,請使用替換正則運算式:
$line =~ s/\ .*// && print $line;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516900.html
標籤:正则表达式perl
下一篇:在perl中使用變數呼叫sed
