Perl 6 - MAIN 中的冒號

假如我有多個文本文件, 我要寫一段腳本來進行替換操作。在命令行中提供一些列選項供配置。文本格式如下:

Perl 6 很靈活
Perl 6 很強大
Perl 6 很復雜

I 123 Love Perl Six
盡管它456還很稚嫩789
對了, 它的 logo 是一個可愛的456花蝴蝶。

我想把每行中第一次出現的 3 位數字替換為 "在木星"。

@蘑菇 的腳本:

use v6;
use MONKEY-SEE-NO-EVAL;

sub MAIN(Str :$regex, Str :$substr, Str :$ext = '.out', Int :$ignore-line = 0, *@files) {
    for @files -> $file {
        my $out = open $file ~ ".out", :w; # 寫入文件

        for $file.IO.lines.kv -> $index, $line is copy {
            next if $index <= $ignore-line; # 忽略前 $ignore-line幾行
            $line ~~ EVAL "s/" ~ $regex ~ "/" ~ $substr ~ "/"; # 根據正則表達式進行替換
            say $/;
            $out.say($line);
        }
        $out.close;
    }
}

查看本腳本的用法

perl6 colon_in_signature.p6 --help

Usage:
colon_in_signature.p6 [-r|--regex=<Str>] [-s|--substr=<Str>] [-e|--ext=<Str>] [-i|--ignore-line=<Int>] [<files> ...]

可以看出命令行選項有短名稱(如 -r)和長名稱(如 --regex)。我們使用的時候可以使用短名稱:

> perl6 colon_in_signature.p6  -r="\d ** 3" -s="在木星" -i=2 1.txt 2.txt 3.txt

也可以使用長名稱:

> perl6 colon_in_signature.p6  --regex="\d ** 3" --substr="在木星" --ignore-line=2 1.txt 2.txt 3.txt

也可以只使用長名稱, 但是我們需要修改下 MAIN 函數:

sub MAIN(Str :$regex, Str :$substr, Str :$ext = '.out', Int :$ignore-line = 0, *@files)

再次查看幫助:

perl6 colon_in_signature.p6 --help

Usage:
colon_in_signature.p6 [--regex=<Str>] [--substr=<Str>] [--ext=<Str>] [--ignore-line=<Int>] [<files> ...]

方括號表示該選項是可選的。但是現在只有長名稱:

> perl6 colon_in_signature.p6 --regex="\d ** 3" --substr="在木星" 1.txt 2.txt 3.txt

也能既有長名又有短名:

sub MAIN(Str :r(:$regex), Str :$substr, Str :$ext = '.out', Int :$ignore-line = 0, *@files) 

這其中的原理是什么呢? MAIN 在處理命令行參數時, 是把選項當作散列來用的:

  • 帶短名稱
> my $regex = '\d ** 3' #->  \d ** 3
> :r(:$regex)           #->  r => regex => \d ** 3
  • 不帶短名稱
> (:$regex)            #->   regex => \d ** 3

:r(:$regex) 擁有一長一短兩個鍵, (:$regex) 只擁有一個長鍵。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,224評論 2 33
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,924評論 18 139
  • 建立一個腳本 Linux中有好多中不同的shell,但是通常我們使用bash (bourne again shel...
    某人在閱讀 2,026評論 0 0
  • 翻譯自 perl6maven.com exit,warn,die exit die Hello World Hel...
    焉知非魚閱讀 2,547評論 2 7
  • 今天是小光棍,既是周末開始得加班當然還要值班,中午莫名其妙在網上訂了個山和故人的電影……現在在侯影廳一個人等待中,...
    875c806c96aa閱讀 421評論 0 0