perl-oneline

############原文粘貼####################

用 Perl 實現(xiàn)的有用的單行程序 1 28 2012 | 版本 1.08

------------------------? ? ? ? ? ? ? ? ? ? -----------? ------------

由 Peteris Krumins 編譯 (peter@catonmat.net, @pkrumins on Twitter)

http://www.catonmat.net -- good coders code, great reuse

此文件最新版的總可以在下面的這個鏈接里獲得:

? ? http://www.catonmat.net/download/perl1line.txt

此文件也有其它語言的:

This file is also available in other languages:

中文: https://github.com/vinian/perl1line.txt

(如果您想翻譯的話, 請與我 peter@catonmat.net 聯(lián)系)

Github 上的 Perl 單行程序:

? ? https://github.com/pkrumins/perl1line.txt

你可以在 Github 上給我發(fā)送推送請求! 我接受問題修復,

新的單行代碼,翻譯和其它所有相關東西.

在這個文件的基礎上,我還寫了一本 "Perl 單行程序" 的電子書,

它對這個文件里的所有單行做了解釋.從下面這個鏈接里獲取它:

? ? http://www.catonmat.net/blog/perl-book/

這些單行程序可以同時在 UNIX 系統(tǒng)和 Windows 系統(tǒng)使用.很可能你的 UNIX 系統(tǒng)

已經安裝好了 Perl. 對 Windows 用戶,您可以從下面鏈接獲取草莓 Perl:

? ? http://www.strawberryperl.com/

目錄:

? ? 1. 文件 Spacing

? ? 2. 行號

? ? 3. 計算

? ? 4. 生成字符串和數(shù)組

? ? 5. 文本轉換和替換

? ? 6. 選擇性的打印和刪除某些行

? ? 7. 實用的正則

? ? 8. Perl 訣竅

文件 SPACING

------------

# 對一個文件的每行使用兩個換行符

perl -pe '$\="\n"'

perl -pe 'BEGIN { $\="\n" }'

perl -pe '$_ .= "\n"'

perl -pe 's/$/\n/'

# 除空行以外,對文件的每行使用兩個換行符

perl -pe '$_ .= "\n" unless /^$/'

perl -pe '$_ .= "\n" if /\S/'

# 對一個文件每行使用三個換行符

perl -pe '$\="\n\n"'

perl -pe '$_.="\n\n"'

# 給一個文件加入多個換行符

perl -pe '$_.="\n"x7'

# 給每一行都前加入一個空行

perl -pe 's//\n/'

# 去掉所有空行

perl -ne 'print unless /^$/'

perl -lne 'print if length'

perl -ne 'print if /\S/'

# 對于所有連續(xù)的空行,只保留一行空行,其它的全部去掉

perl -00 -pe ''

perl -00pe0

# 將所有的空行壓縮/展開為多個連續(xù)的空行

perl -00 -pe '$_.="\n"x4'

# 對一個文件的每 10 行,都使用 Tab 鍵分隔開

perl -lpe '$\ = $. % 10 ? "\t" : "\n"'

行號

--------------

# 給文件的每行都加上行號

perl -pe '$_ = "$. $_"'

# 給文件的非空行加上行號

perl -pe '$_ = ++$a." $_" if /./'

# 給非空白行加上行號并打印(丟掉空行)

perl -ne 'print ++$a." $_" if /./'

# 給所有行都加上行號,但只打印非空行的行號

perl -pe '$_ = "$. $_" if /./'

# 只給與某個正則匹配的行加上行號,打印其它未修改的

perl -pe '$_ = ++$a." $_" if /regex/'

# 打印只包含某個正則的行,并在它們行首順序添加行號

perl -ne 'print ++$a." $_" if /regex/'

# 給與正則匹配的行加上行號并打印

perl -pe '$_ = "$. $_" if /regex/'

# 給所有行使用指定的格式添加行號(模擬 cat -n)

perl -ne 'printf "%-5d %s", $., $_'

# 打印一個文件的總行數(shù)(模擬 wc -l)

perl -lne 'END { print $. }'

perl -le 'print $n=()=<>'

perl -le 'print scalar(()=<>)'

perl -le 'print scalar(@foo=<>)'

perl -ne '}{print $.'

perl -nE '}{say $.'

# 打印一個文件非空白行的總和

perl -le 'print scalar(grep{/./}<>)'

perl -le 'print ~~grep{/./}<>'

perl -le 'print~~grep/./,<>'

perl -E 'say~~grep/./,<>'

# 打印一個文件空白行的總和

perl -lne '$a++ if /^$/; END {print $a+0}'

perl -le 'print scalar(grep{/^$/}<>)'

perl -le 'print ~~grep{/^$/}<>'

perl -E 'say~~grep{/^$/}<>'

# 打印一個文件里匹配某個正則的行的總數(shù)(模擬 grep -c)

Print the number of lines in a file that match a pattern (emulate grep -c)

perl -lne '$a++ if /regex/; END {print $a+0}'

perl -nE '$a++ if /regex/; END {say $a+0}'

計算

------------

# 判斷一個數(shù)是否是質數(shù)

perl -lne '(1x$_) !~ /^1?$|^(11+?)\1+$/ && print "$_ is prime"'

# 對一行的所有字段求和

perl -MList::Util=sum -alne 'print sum @F'

# 對所有行的所有字段求和

perl -MList::Util=sum -alne 'push @S,@F; END { print sum @S }'

perl -MList::Util=sum -alne '$s += sum @F; END { print $s }'

# 打亂一行所有字段的順序

perl -MList::Util=shuffle -alne 'print "@{[shuffle @F]}"'

perl -MList::Util=shuffle -alne 'print join " ", shuffle @F'

# 打印一行中的最小的元素

perl -MList::Util=min -alne 'print min @F'

# 打印所有行最小的元素

perl -MList::Util=min -alne '@M = (@M, @F); END { print min @M }'

perl -MList::Util=min -alne '$min = min @F; $rmin = $min unless defined $rmin && $min > $rmin; END { print $rmin }'

# 打印一行中最大的元素

perl -MList::Util=max -alne 'print max @F'

# 打印所有行里最大的元素

perl -MList::Util=max -alne '@M = (@M, @F); END { print max @M }'

# 用每個字段的絕對值替換其當前值

perl -alne 'print "@{[map { abs } @F]}"'

# 打印每一行總的字段(單詞)個數(shù)

perl -alne 'print scalar @F'

# 在每行行首前打印該行總的字段和

perl -alne 'print scalar @F, " $_"'

# 計算所有行字段數(shù)的總和

perl -alne '$t += @F; END { print $t}'

# 打印匹配某個正則的字段總個數(shù)

perl -alne 'map { /regex/ && $t++ } @F; END { print $t }'

perl -alne '$t += /regex/ for @F; END { print $t }'

perl -alne '$t += grep /regex/, @F; END { print $t }'

# 打印匹配某個正則的總行數(shù)

perl -lne '/regex/ && $t++; END { print $t }'

# 打印圓周率,保留 n 位有效數(shù)字

perl -Mbignum=bpi -le 'print bpi(n)'

# 打印圓周率,保留 39 位有效數(shù)字

perl -Mbignum=PI -le 'print PI'

# 打印指數(shù),保留 n 位有效數(shù)字

perl -Mbignum=bexp -le 'print bexp(1,n+1)'

# 打印指數(shù),保留 39 位有效數(shù)字

perl -Mbignum=e -le 'print e'

# 打印系統(tǒng) UNIX 時間 (從 UTC 1970.1.1 00:00:00 到現(xiàn)在的秒數(shù))

perl -le 'print time'

# 打印格林威治時間和本機的系統(tǒng)時間

perl -le 'print scalar gmtime'

perl -le 'print scalar localtime'

# 以 小時:分鐘:秒 的格式打印本機系統(tǒng)時間

perl -le 'print join ":", (localtime)[2,1,0]'

# 打印昨天的時間

perl -MPOSIX -le '@now = localtime; $now[3] -= 1; print scalar localtime mktime @now'

# 打印 14 個月 9 天 7 秒前的時間

perl -MPOSIX -le '@now = localtime; $now[0] -= 7; $now[4] -= 14; $now[7] -= 9; print scalar localtime mktime @now'

# 在每行的行首加上時間戳(格林威治時間,本地時間)

tail -f logfile | perl -ne 'print scalar gmtime," ",$_'

tail -f logfile | perl -ne 'print scalar localtime," ",$_'

# 計算 5 的階乘

perl -MMath::BigInt -le 'print Math::BigInt->new(5)->bfac()'

perl -le '$f = 1; $f *= $_ for 1..5; print $f'

# 計算最大公約數(shù)

perl -MMath::BigInt=bgcd -le 'print bgcd(@list_of_numbers)'

# 使用 Euclid 算法計算 20 和 35 的最大公約數(shù)

perl -le '$n = 20; $m = 35; ($m,$n) = ($n,$m%$n) while $n; print $m'

# 計算 35,20,8 的最小公倍數(shù)

perl -MMath::BigInt=blcm -le 'print blcm(35,20,8)'

# 使用 Euclid 公式( n*m/gcd(n,m) )計算 20 和 35 的最小公倍數(shù)

perl -le '$a = $n = 20; $b = $m = 35; ($m,$n) = ($n,$m%$n) while $n; print $a*$b/$m'

# 在 5-15 間生成 10 個隨機數(shù),不包含 15

perl -le '$n=10; $min=5; $max=15; $, = " "; print map { int(rand($max-$min))+$min } 1..$n'

# 找到并打印列表中所有的排列

perl -MAlgorithm::Permute -le '$l = [1,2,3,4,5]; $p = Algorithm::Permute->new($l); print @r while @r = $p->next'

# 產生冪集

perl -MList::PowerSet=powerset -le '@l = (1,2,3,4,5); for (@{powerset(@l)}) { print "@$_" }'

# 將 IP 地址轉換為無符號的數(shù)字

perl -le '$i=3; $u += ($_<<8*$i--) for "127.0.0.1" =~ /(\d+)/g; print $u'

perl -le '$ip="127.0.0.1"; $ip =~ s/(\d+)\.?/sprintf("%02x", $1)/ge; print hex($ip)'

perl -le 'print unpack("N", 127.0.0.1)'

perl -MSocket -le 'print unpack("N", inet_aton("127.0.0.1"))'

# 將一個無符號的數(shù)字轉換成 IP 地址

perl -MSocket -le 'print inet_ntoa(pack("N", 2130706433))'

perl -le '$ip = 2130706433; print join ".", map { (($ip>>8*($_))&0xFF) } reverse 0..3'

perl -le '$ip = 2130706433; $, = "."; print map { (($ip>>8*($_))&0xFF) } reverse 0..3'

生成字符串和數(shù)組

----------------------------------

# 生成并打印字母

perl -le 'print a..z'

perl -le 'print ("a".."z")'

perl -le '$, = ","; print ("a".."z")'

perl -le 'print join ",", ("a".."z")'

# 生成并打印所有 "a" 到 "zz" 間的字符

perl -le 'print ("a".."zz")'

perl -le 'print "aa".."zz"'

# 創(chuàng)建一個十六進制的數(shù)組

@hex = (0..9, "a".."f")

# 使用十六進制數(shù)組,將一個十進制數(shù)轉換為十六進制

perl -le '$num = 255; @hex = (0..9, "a".."f"); while ($num) { $s = $hex[($num%16)&15].$s; $num = int $num/16 } print $s'

perl -le '$hex = sprintf("%x", 255); print $hex'

perl -le '$num = "ff"; print hex $num'

# 隨機生成 8 個字符組成的密碼

perl -le 'print map { ("a".."z")[rand 26] } 1..8'

perl -le 'print map { ("a".."z", 0..9)[rand 36] } 1..8'

# 生成定長的字符串

perl -le 'print "a"x50'

# 創(chuàng)建一個重復的數(shù)組

perl -le '@list = (1,2)x20; print "@list"'

# 利用字符串生成數(shù)組

@months = split ' ', "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"

@months = qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/

# 使用數(shù)組生成字符串

@stuff = ("hello", 0..9, "world"); $string = join '-', @stuff

# 將字符串中的字符轉換成其 ASCII 碼對應的數(shù)字

perl -le 'print join ", ", map { ord } split //, "hello world"'

# 將一列 ASCII 數(shù)字轉換成一個字符串

perl -le '@ascii = (99, 111, 100, 105, 110, 103); print pack("C*", @ascii)'

perl -le '@ascii = (99, 111, 100, 105, 110, 103); print map { chr } @ascii'

# 使用 1 到 100 間的奇數(shù)生成一個數(shù)組

perl -le '@odd = grep {$_ % 2 == 1} 1..100; print "@odd"'

perl -le '@odd = grep { $_ & 1 } 1..100; print "@odd"'

# 使用 1 到 100 間的偶數(shù)生成一個數(shù)組

perl -le '@even = grep {$_ % 2 == 0} 1..100; print "@even"'

# 求字符串的長度

perl -le 'print length "one-liners are great"'

# 顯示數(shù)組中元素的個數(shù)

perl -le '@array = ("a".."z"); print scalar @array'

perl -le '@array = ("a".."z"); print $#array + 1'

文本轉換和替換

--------------------------------

# 對字符串做 ROT13 變換

'y/A-Za-z/N-ZA-Mn-za-m/'

# 對一個文件做 ROT13 變換

perl -lpe 'y/A-Za-z/N-ZA-Mn-za-m/' file

# 使用 Base64 編碼字符串

perl -MMIME::Base64 -e 'print encode_base64("string")'

perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)' file

# 使用 Base64 解碼字符串

perl -MMIME::Base64 -le 'print decode_base64("base64string")'

perl -MMIME::Base64 -ne 'print decode_base64($_)' file

# URL 轉義字符串

perl -MURI::Escape -le 'print uri_escape($string)'

# URL 反轉義一個字符串

perl -MURI::Escape -le 'print uri_unescape($string)'

# HTML 編碼一個字符串

perl -MHTML::Entities -le 'print encode_entities($string)'

# HTML 解碼一個字符串

perl -MHTML::Entities -le 'print decode_entities($string)'

# 將所有文本轉換為大寫格式

perl -nle 'print uc'

perl -ple '$_=uc'

perl -nle 'print "\U$_"'

# 將所有文本轉換為小寫格式

perl -nle 'print lc'

perl -ple '$_=lc'

perl -nle 'print "\L$_"'

# 對每一行的首字母大寫

perl -nle 'print ucfirst lc'

perl -nle 'print "\u\L$_"'

# 反轉字母的大小寫

perl -ple 'y/A-Za-z/a-zA-Z/'

# 使用駱駝規(guī)則處理每行

perl -ple 's/(\w+)/\u$1/g'

perl -ple 's/(?

# 丟掉行首的空白字符(空白符,制表符)

perl -ple 's/^[ \t]+//'

perl -ple 's/^\s+//'

# 丟掉行尾的空白字符(空白符,制表符)

perl -ple 's/[ \t]+$//'

# 丟掉行首和行尾的空白符

perl -ple 's/^[ \t]+|[ \t]+$//g'

# 將 UNIX 新行轉換成 DOS/Windows 格式新行

perl -pe 's|\n|\r\n|'

# 將 DOS/Windows 格式的新行轉換成 UNIX 格式的新行

perl -pe 's|\r\n|\n|'

# 轉換 UNIX 格式新行到 Mac 格式新行

perl -pe 's|\n|\r|'

# 使用 "bar" 替換(查找并替換)每行中最開始的 "foo"

perl -pe 's/foo/bar/'

# 使用 "bar" 替換(查找并替換)每行中所有的 "foo"

perl -pe 's/foo/bar/g'

# 當一行中出現(xiàn) "baz" 時,使用 "foo" 替換(查找并替換)最開始的一個 "bar"

perl -pe '/baz/ && s/foo/bar/'

# 修改文件中出現(xiàn) "baz" 的行使用 "foo" 替換(查找并替換)最開始的一個 "bar"

perl -i.orig -lpe 'BEGIN {$findstr = shift @ARGV; $str= shift @ARGV; $rep = shift @ARGV}; /$findstr/ && s/$str/$rep/;' 'baz' 'foo' 'bar' file

# 使用二進制對文件打補丁(查找指定的數(shù)組,將其替換為十六進制的數(shù))

perl -pi -e 's/\x89\xD8\x48\x8B/\x90\x90\x48\x8B/g' file

選擇性的打印和刪除某些行

------------------------------------------------

# 打印文件的第一行(模擬 head -1)

perl -ne 'print; exit'

# 打印文件的前十行(模擬 head -10)

perl -ne 'print if $. <= 10'

perl -ne '$. <= 10 && print'

perl -ne 'print if 1..10'

# 打印文件的最后一行(模擬 tail -1)

perl -ne '$last = $_; END { print $last }'

perl -ne 'print if eof'

# 打印文件的最后十行(模擬 tail -10)

perl -ne 'push @a, $_; @a = @a[@a-10..$#a]; END { print @a }'

# 只打印匹配某個正則的行

perl -ne '/regex/ && print'

# 只打印不匹配某個正則的行

perl -ne '!/regex/ && print'

# 打印匹配某個正則的前一行

perl -ne '/regex/ && $last && print $last; $last = $_'

# 打印匹配某個正則的后一行

perl -ne 'if ($p) { print; $p = 0 } $p++ if /regex/'

# 打印同時包含 AAA 和 BBB 的行

perl -ne '/AAA/ && /BBB/ && print'

# 打印既不包含 AAA 也不包含 BBB 的行

perl -ne '!/AAA/ && !/BBB/ && print'

# 打印順序包含 AAA, BBB, CCC 的行

perl -ne '/AAA.*BBB.*CCC/ && print'

# 打印長度不小于 80 個字符的行

perl -ne 'print if length >= 80'

# 打印長度小于 80 個字符的行

perl -ne 'print if length < 80'

# 只顯示第 13 行

perl -ne '$. == 13 && print && exit'

# 打印除了第 27 行外的所有行

perl -ne '$. != 27 && print'

perl -ne 'print if $. != 27'

# 只打印第 13,19,67 行

perl -ne 'print if $. == 13 || $. == 19 || $. == 67'

perl -ne 'print if int($.) ~~ (13, 19, 67)'

# 打印匹配兩個正則間的所有行(包括匹配行本身)

perl -ne 'print if /regex1/../regex2/'

# 打印第 17 到 30 行間的所有行

perl -ne 'print if $. >= 17 && $. <= 30'

perl -ne 'print if int($.) ~~ (17..30)'

perl -ne 'print if grep { $_ == $. } 17..30'

# 打印最長行

perl -ne '$l = $_ if length($_) > length($l); END { print $l }'

# 打印最短行

perl -ne '$s = $_ if $. == 1; $s = $_ if length($_) < length($s); END { print $s }'

# 打印包含數(shù)字的行

perl -ne 'print if /\d/'

# 查找只包含數(shù)字的行

perl -ne 'print if /^\d+$/'

# 打印只包含字母的行

perl -ne 'print if /^[[:alpha:]]+$/

# 從文件首行開始,每兩行打印一次

perl -ne 'print if $. % 2'

# 從第二行開始,每兩行打印一次

perl -ne 'print if $. % 2 == 0'

# 打印重復出現(xiàn)的行

perl -ne 'print if ++$a{$_} == 2'

# 打印所有唯一的行

perl -ne 'print unless $a{$_}++'

# 打印每行的第一個字段(模擬 cut -f 1 -d ' ')

perl -alne 'print $F[0]'

實用的正則

-------------------------

# 匹配像 IP 地址的

/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/

/^(\d{1,3}\.){3}\d{1,3}$/

# 判斷一個數(shù)字是否在 0 到 255 間

/^([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$/

# 匹配一個 IP 地址

my $ip_part = qr|([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|;

if ($ip =~ /^($ip_part\.){3}$ip_part$/) {

say "valid ip";

}

# 檢查一個字符串是否是電子郵箱地址

/\S+@\S+\.\S+/

# 檢測一個字符串是否是十進制數(shù)

/^\d+$/

/^[+-]?\d+$/

/^[+-]?\d+\.?\d*$/

# 檢測一個字符串是否是十六進制數(shù)

/^0x[0-9a-f]+$/i

# 檢測一個字符串是否是八進制數(shù)

/^0[0-7]+$/

# 檢測一個字符串是否是二進制數(shù)

/^[01]+$/

# 檢測一個單詞是否在字符串中出現(xiàn)兩次

/(word).*\1/

# 對字符串中的所有數(shù)字都加一

$str =~ s/(\d+)/$1+1/ge

# 從 HTTP 頭里取出 HTTP User-Agent

/^User-Agent: (.+)$/

# 匹配可打印的 ASCII 字符

/[ -~]/

# 匹配不可打印的 ASCII 字符

/[^ -~]/

# 匹配 HTML 標簽間的文本

m|([^<]*)|

m|(.*?)|

# 替換所有

$html =~ s|<(/)?b>|<$1strong>|g

# 存儲所有匹配的字符串到數(shù)組里

my @matches = $text =~ /regex/g;

PERL 訣竅

-----------

# 顯示 Perl 模塊的版本號

perl -MModule -le 'print $Module::VERSION'

perl -MLWP::UserAgent -le 'print $LWP::UserAgent::VERSION'

PERL 單行解釋電子書

--------------------------------

我(peter@catonmat.net)在這個文件的基礎上,寫了一本電子書,如果您希望

支持我的工作,同時也更多的了解單行代碼,您可以從下面的鏈接里獲得一份

該電子書的拷貝:

http://www.catonmat.net/blog/perl-book/

這本電子書以我在博客中寫的 7 篇系列文章為基礎.

在這本書里,我回顧了所有的單行程序,添加了更多的解釋,新增了單行代碼

同時也添加了兩章 - 介紹 Perl 單行程序和總結了常用的特殊變量.

您可以在這里閱讀原始的系列文章:

? ? http://www.catonmat.net/blog/perl-one-liners-explained-part-one/

? ? http://www.catonmat.net/blog/perl-one-liners-explained-part-two/

? ? http://www.catonmat.net/blog/perl-one-liners-explained-part-three/

? ? http://www.catonmat.net/blog/perl-one-liners-explained-part-four/

? ? http://www.catonmat.net/blog/perl-one-liners-explained-part-five/

? ? http://www.catonmat.net/blog/perl-one-liners-explained-part-six/

? ? http://www.catonmat.net/blog/perl-one-liners-explained-part-seven/

以下作者對本文做出貢獻

-----------------

Andy Lester? ? ? http://www.petdance.com

Shlomi Fish? ? ? http://www.shlomifish.org

Madars Virza? ? ? http://www.madars.org

caffecaldo? ? ? ? https://github.com/caffecaldo

Kirk Kimmel? ? ? https://github.com/kimmel

avar? ? ? ? ? ? ? https://github.com/avar

rent0n

發(fā)現(xiàn)了臭蟲? 添加其它的單行程序?

------------------------------------

給我的電子郵箱(peter@catonmat.net)發(fā)送臭蟲郵件或新的單行代碼!

祝你愉快

--------

我希望您覺得這些單行有用, 祝你愉快!

#---完結---

翻譯: veinian@gmail.com

感謝我的朋友 俊麗 幫忙校驗



###########################################

以上是原文內容粘貼,主要方便自己查找

原文鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容