我有一個temp
包含內容的檔案:
a
b
c
d
e
當我從命令列運行sed 's#b#batman\nRobin#' temp
時,我得到:
a
batman
Robin
c
d
e
但是,當我從 Perl scriptL 運行命令時
#!/usr/bin/perl
use strict;
use warnings;
`sed 's#b#batman\nRobin#' temp`
它產生錯誤:
sed:-e 運算式 #1,字符 10:未終止的 `s' 命令
我究竟做錯了什么?
uj5u.com熱心網友回復:
sed
為什么要像在 Perl 程式中一樣運行另一個工具?如果有的話,現在您擁有更多的工具和功能,所以只需使用 Perl 即可。
做你sed
的事的一種簡單方法
use warnings;
use strict;
die "Usage: $0 file(s)\n" if not @ARGV;
while (<>) {
s/b/batman\nRobin/;
print;
}
temp
通過在命令列上提供檔案 ( ) 來運行該程式。該die
行僅用于支持/強制執行此類使用;它對腳本的操作是無關緊要的。
那么這個程式就是一個簡單的過濾器
<> 運算子逐行讀取命令列上提交的所有檔案
將一行分配給$_ 變數,這是 Perl 中許多事物的默認值
s///
運算子默認系結到 ,$_
它會改變(如果模式匹配)print
默認列印$_
變數在正則運算式中使用幾乎任何你想要的分隔符,請參閱m//和s///運算子
這也可以這樣做
while (<>) {
print s/b/batman\nRobin/r
}
With/r
修飾符 s///
回傳更改后的字串(或原始如果模式不匹配)
最后那也只是
print s/b/batman\nRobin/r while <>;
但我希望你真的想做更多的腳本,然后這可能不是它。
另一方面,您可以更正確地撰寫它
use warnings;
use strict;
use feature qw(say);
die "Usage: $0 file(s)\n" if not @ARGV;
while (my $line = <>) {
chomp $line;
$line =~ s/b/batman\nRobin/;
say $line;
}
在詞法變數中的一行很好地chomp -ed 這已準備好進行更多作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/467174.html