日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Perl Learning (5) —— 输入与输出

發布時間:2025/5/22 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Perl Learning (5) —— 输入与输出 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(1) 讀取標準輸入
(2) 鉆石操作符輸入
(3) 調用參數
(4) 輸出到標準輸出
(5) 使用printf格式化輸出
(6) 數組和printf
(7) 文件句柄
(8) 打開和關閉文件句柄
(9) 用die處理嚴重錯誤
(10) 使用warn輸出警告信息
(11) 使用文件句柄
(12) 改變默認的文件輸出句柄
(13) 使用say來輸出


(1) 讀取標準輸入
“行輸入”<STDIN>操作符
【1】在標量上下文中
調用“行輸入”操作符,將會返回標準輸入中的一行。
$line = <STDIN>;??? # 讀取下一行
chomp($line);??? # 截掉最后的換行符
簡寫:
chomp($line = <STDIN>);# 習慣用法,效果同上
注意:如果讀到文件結尾(end-of-file),“行輸入”操作符就會返回undef —— 這樣的設計是為了配合循環使用,可以自然地跳出循環。

view plain
  • #!/usr/bin/perl??
  • while?(defined($line?=?<STDIN>))?{??
  • ????print?"I?saw?$line";??
  • }??
  • #簡寫:??
  • #!/usr/bin/perl??
  • while?(<STDIN>)?{#?條件簡寫??
  • ????print?"I?saw?$_";#?老地方$_??
  • }??
  • 注意:
    [1] 只有當while循環的條件表達式里只有“行輸入”操作符的前提下,這個簡寫才起作用。假如條件表達式里放了其他的東西,它就無法按你的預期運行了。
    [2] “行輸入”操作符(<STDIN>)和Perl的“老地方”變量($_)之間并沒有什么關聯。只是在這個簡寫里,輸入的內容會恰好存儲在$_變量中而已。
    【2】在列表上下文中
    調用“行輸入”操作符,它會返回一個列表,其中包含(其余)所有的輸入內容,每個列表的元素代表一行輸入內容。

    view plain
  • #!/usr/bin/perl??
  • #while?(<STDIN>)?{#?簡寫??
  • #???print?"I?saw?$_";#?老地方S_??
  • #}??
  • foreach?(<STDIN>)?{??
  • ????print?"I?saw?$_";??
  • }??
  • 注意:while循環和foreach循環的區別
    兩者不同之處在于它們背后的運作方式。
    在while循環里,Perl會讀取一行輸入,把它存入某個變量并且執行循環的主體。接下來,它會回頭去尋找其他的輸入行。
    在foreach循環里,“行輸入”操作符會在列表上下文中執行(因為foreach需要逐項處理列表的內容)。為此,在循環能夠開始執行之前,它必須先將輸入全部讀進來。
    建議:最好的做法,對于大文件,通常是盡量使用while循環的簡寫,讓它每次處理一行。

    (2) 鉆石操作符輸入
    還有另一種讀取輸入的方法,就是使用鉆石操作符<>。
    它能讓程序在處理調用參數的時候,提供類似于標準Unix工具程序的功能。
    程序的調用參數(invocation arguments)通常是命令行上跟在程序名后面的幾個“單詞”。
    注意:
    [1] 連字符(-)當作參數,代表標準輸入。
    [2] 讓程序以這種方式運行的好處,就是你可以在運行時指定程序的輸入源。

    view plain
  • #!/usr/bin/perl??
  • #while?(<STDIN>)?{#?簡寫??
  • #???print?"I?saw?$_";#?老地方S_??
  • #}??
  • #foreach?(<STDIN>)?{??
  • #???print?"I?saw?$_";??
  • #}??
  • while?(defined($line?=?<>))?{??
  • ????chomp($line);??
  • ????print?"It?was?$line?that?I?saw!/n";??
  • }??
  • #簡寫:??
  • while?(<>)?{??
  • ????chomp;#?使用chomp的默認用法:不加參數時,chomp會直接作用在$_上。??
  • ????print?"It?was?$_?that?I?saw!/n";??
  • }??

  • 注意:
    [1] 鉆石操作符是“行輸入”操作符的特例。不過它并不是從鍵盤取得輸入,而是從用戶指定的位置讀取。
    [2] 鉆石操作符只有在碰到所有輸入的結尾時,才會返回undef。(然后就會跳出while循環)
    [3] 由于鉆石操作符通常會處理所有的輸入,所以當它在程序里出現好幾次時,通常是錯誤的。

    (3) 調用參數
    鉆石操作符其實不會去檢查調用參數,它的參數其實是來自@ARGV數組。
    注意:
    [1] 這個數組是由Perl解釋器事先建立的特殊數組,其內容就是由調用參數組成的列表。在程序開始運行時,@ARGV里就已經塞滿了調用參數。
    [2] 如果@ARGV是空列表,就會改用標準輸入流。
    [3] 只要尚未使用鉆石操作符,你就可以對@ARGV動點手腳。

    view plain
  • foreach?(@ARGV)?{??
  • ????print?"$_/n";??
  • }??
  • @ARGV?=?qw#?filename?#;#?強制讓鉆石操作符讀取我們指定的文件??
  • while?(<>)?{??
  • ????chomp;??
  • ????print?"It?was?$_?that?I?saw!/n";??
  • }??
  • ?

    (4) 輸出到標準輸出
    print操作符會讀取一個列表里的所有值,并把每一項依次送到標準輸出。
    print @array;# 元素之間沒有空格
    print "@array";# 數組所有元素之間用空格分開
    注意:因為Perl把數組內插到字符串中時,會在每個元素之間加上空格。
    由于print處理的是待打印的字符串列表,因此它的參數會在列表上下文中執行。而鉆石操作符(“行輸入”操作符的特殊形式)在列表上下文中會返回由許多輸入行組成的列表,所以它們彼此可以配合工作。
    print <>;# 和Unix下的'cat'命令功能差不多
    print sort <>;# 和Unix下的'sort'命令功能差不多
    注:現在你可以用Perl重寫所有的Unix工具程序。
    注意:print后面的括號可有可無 —— 除非這樣做會改變表達式的意義,否則Perl里的括號可以省略。
    print (2+3)*4;# 輸出5
    print ( (2+3)*4 )# 輸出20

    (5) 使用printf格式化輸出

    view plain
  • $user?=?wcdj;??
  • $days_to_die?=?30;??
  • printf?"Hello,?%s;?your?password?expires?in?%d?days!/n",?$user,?$days_to_die;??
  • 常用的轉換(conversion):

    view plain
  • %g?——?要輸出恰當的數值形式,它會按需求自動選擇浮點數、整數、指數形式??
  • printf?"%g?%g?%g/n",?5/2,?51/17,?51**17;#?2.5?3?1.0683e+29??
  • %d?——?輸出十進制的整數,它會舍去小數點之后的數字(注意:它會無條件舍去,而非四舍五入)??
  • printf?"in?%d?days!/n",?17.85;#?in?17?days!??
  • %f?——?輸出浮點數,會按需要四舍五入??
  • printf?"%12f/n",?6*7+2/3;???????#?^^^42.666667??
  • printf?"%12.3f/n",?6*7+2/3;????#?^^^^^^42.667??
  • printf?"%12.0f/n",?6*7+2/3;????#?^^^^^^^^^^43??
  • %s?——?字符串內插??
  • printf?"%10s/n",?"wcdj";#?^^^^^^wcdj?("^"表示空格)??
  • 注意:
    [1] 對齊方向:負數(左對齊);正數(右對齊)。
    [2] %%,不會輸出(參數)列表中的任何元素。

    (6) 數組和printf
    動態產生格式字符串。

    view plain
  • my?@items?=?qw(?wcdj?gerry?yj?);??
  • my?$format?=?"The?items?are:/n"?.?("%10s/n"?x?@items);#?x操作符??
  • print?"the?format?is?>>$format<</n";#?用于調試??
  • printf?$format,?@items;??
  • 注意:在標量上下文中,用了一次@items以取得它的長度,然后又在列表上下文中用了它一次以取得它的內容。(上下文的重要性)

    (7) 文件句柄
    建議:使用全大寫字母來命名文件句柄。
    【六個特殊文件句柄】(Perl保留的)
    STDIN、STDOUT、STDERR、DATA、ARGV和ARGVOUT。

    (8) 打開和關閉文件句柄
    Perl提供的三種文件句柄STDIN、STDOUT和STDERR,都是由產生Perl進程的父進程(可能是shell)自動打開的文件或設備。
    當你需要其他的文件句柄時,請使用open操作符。
    open CONFIG, "filename";
    open CONFIG, "<filename";# 從文件中輸入
    open BEDROCK, ">filename";#輸出到文件(“>”會重新創建文件)
    open LOG, ">>logfile";#輸出到文件(“>>”追加的方式)
    在Perl 5.6之后,open另有一種使用三個參數的寫法。
    open CONFIG, "<", "filename";

    不正確的文件句柄
    open的返回值來判斷句柄是否正確:
    my $success = open LOG, ">>logfile";# 捕獲返回值
    if (! $success) {
    ??? # open操作失敗
    ??? # ...
    }

    關閉文件句柄
    當你不再需要某個文件句柄時,可以用close操作符來關閉它。
    close CONFIG;
    建議:請為每個open搭配一個close。最好是在每個文件句柄用完之后就立刻關閉它,哪怕程序馬上就結束了。
    注:
    關閉文件句柄會:[1] 刷新輸出緩沖 [2] 釋放該文件上的任何鎖。

    (9) 用die處理嚴重錯誤
    當Perl遇到嚴重錯誤(fatal error)時,程序應該終止運行,并用錯誤信息告知原因。
    die函數會輸出你指定的信息(到為這類信息預留的標準錯誤流中),并且讓你的程序立刻終止,并返回不為零的退出碼。
    if (! open LOG, ">>logfile") {
    ??? die "Cannot create logfile: $!";
    }
    注意:
    [1] $! 代表:可讀的系統出錯信息。當系統拒絕我們所請求的服務時,$! 會給我們一個理由。—— 即,解釋性的系統錯誤信息就保存在Perl的特殊變量$!中。
    [2] 只有在系統服務請求失敗后的瞬間,$! 的值才會有用。如果操作成功了,就不會在$!里留下任何有用的信息。
    [3] die還會自動將Perl程序名和行號附加在錯誤信息的后面。

    (10) 使用warn輸出警告信息
    warn函數和die函數的區別:不同之處在于最后一步,warn不會終止程序的運行。

    (11) 使用文件句柄
    當文件句柄以讀取模式打開后,可以從它讀取一行數據,就像從STDIN讀取標準輸入流一樣。

    view plain
  • if?(!?open?FILE,?"<filename")?{??
  • ????die?"Cannot?read?file:?$!";??
  • }??
  • while?(<FILE>)?{??
  • ????chomp;??
  • ????print?"$_/n";??
  • }??
  • 寫入或是添加模式打開的文件句柄可以在print或printf函數中使用。—— 使用時,請直接將它放在關鍵字之后、參數列表之前。

    view plain
  • if?(!?open?LOG,?">>logfile")?{??
  • ????die?"Cannot?create?logfile:?$!";??
  • }??
  • $name?=?"wcdj";??
  • print?LOG?"2011-2-1/n";??
  • printf?LOG?"My?name?is?%s./n",?$name;??
  • ?

    (12) 改變默認的文件輸出句柄
    默認情況下,假如不為print或是printf指定文件句柄,它的輸出就會送到STDOUT。
    不過,你可以使用select操作符來改變默認的文件句柄。

    view plain
  • if?(!?open?LOG,?">>logfile")?{??
  • ????die?"Cannot?create?logfile:?$!";??
  • }??
  • $name?=?"wcdj";??
  • print?"2011-2-1/n";??
  • printf?"My?name?is?%s./n",?$name;??
  • select?LOG;#?改變默認的文件句柄??
  • print?"select?used/n";??
  • print?"2011-2-1/n";??
  • printf?"My?name?is?%s./n",?$name;??
  • select?STDOUT;#?恢復默認句柄??
  • print?"select?used/n";??
  • print?"2011-2-1/n";??
  • printf?"My?name?is?%s./n",?$name;??
  • ?

    建議:當你所指定的默認文件句柄使用完畢之后,最好把它設回原先的默認值STDOUT來。
    注意:將特殊變量$| 設定為1,就會使當前的默認文件句柄在每次進行輸出操作后,立刻刷新緩沖區。

    (13) 使用say來輸出
    Perl 5.10從正在開發的Perl 6 中借來了say這個函數。
    它的功能和print函數差不多,但是會在每行輸出的結尾自動加上換行符。
    use 5.010;
    say "Hello!";# 比print和/n省掉4次按鍵
    等價于:
    print "Hello/n";

    轉載于:https://www.cnblogs.com/salious/archive/2011/10/27/2226104.html

    總結

    以上是生活随笔為你收集整理的Perl Learning (5) —— 输入与输出的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。