ã¯ããã«
åäžè¡ã®Perlããã°ã©ã ã«ã€ããŠã話ããŸãã 1è¡ã®Perlãç¿åŸããã°ãå€ãã®æéãç¯çŽã§ããŸãïŒç¯çŽã§ããŸãïŒã
ãã®æçš¿ã®ç®çã¯ãfindãgrepãawkãsedã®ä»£ããã«Perlã䜿çšããæ¹æ³ã瀺ãããšã§ãã æçš¿ã®æåŸã«ããªããããå¿
èŠãªã®ããæžãããŠããŸãã
ãŸãããŸãæåã«ã
æ
ãã©ã°-eãã®ãã©ã°ã䜿çšãããšãã³ã³ãœãŒã«ã§çç ã³ãŒããçŽæ¥å®è¡ã§ããŸãããã®æ©èœã䜿çšããŠãäœããã®ãã¹ãã³ãŒãããã¹ãããŸãã
16鲿°ã®0xFA23Bã®10鲿°å€ãç¥ããããšããŸãã
perl -e "print 0xFA23B"
ãæ³šæ Windowsããåäžè¡ã®ããŒã«ããŒã³ãŒããå®è¡ããå Žåãã³ãŒããäºéåŒçšç¬Šã§å²ãå¿
èŠããããŸãã
perl -e "print 0xFA23B"
ãLinux / Unixã®å Žåãã³ãŒãã¯äºéåŒçšç¬ŠãšäžéåŒçšç¬Šã®äž¡æ¹ã«ããããšãã§ããŸãããUnix / Linuxã§ã¯ãäºéåŒçšç¬Šã®å Žåã¯èšå·ã$ãã§ãšã¹ã±ãŒãããå¿
èŠããããŸã
perl -e "\$i = 0;print \$i"
ãæ³šæ -eãã©ã°ã®åŸãã³ãŒãã¯ããã«ç¶ããŸã ã
ãã©ã°-lãã®ãã©ã°ã¯ã倿°$ /ããã³$ \ãå€ "\ n"ã§åæåããŸãã
$ /倿°ã¯ãå
¥åãã£ãŒã«ãã®åºåãæåãèšå®ããŸãã
$ \倿°ã¯ãå°å·ã³ãã³ãã®åŸã«äœãå°å·ãããããæå®ããŸãã
ããã°ã©ã ïŒ
perl -le "print 1"
以äžãšåçïŒ
BEGIN { $/ = "\n"; $\ = "\n"; } print 1;
ãããã£ãŠãæåŸã«print "\ n"ãšæžãå¿
èŠã¯ãããŸããã
ãã©ã°-nããããæ¥œãã¿ãå§ãŸããŸãã
次ã®ã³ãŒãïŒ
perl -ne 'print 1'
ãããšåçïŒ
LINE: while (defined($_ = <ARGV>)) { print 1; }
ããã¯ã©ãã§äœ¿çšã§ããŸããïŒ
ãããŠããã§ã¯ãããšãã°ãååãæ°åã§å§ãŸããã¡ã€ã«ã®ååã«æ¡åŒµåãbakãã远å ããå¿
èŠããããŸãã
åºæ¥äžããïŒ
ls | perl -lne 'rename $_, "$_.bak" if /^\d+/'
ãããŠãWindowsçšïŒ ãé¡ãïŒ
dir /b | perl -lne "rename $_, \"$_.bak\" if /^\d+/"
çµæã®ããã°ã©ã ãèŠãŠã¿ãŸãããïŒ
BEGIN { $/ = "\n"; $\ = "\n"; } LINE: while (defined($_ = <ARGV>)) { chomp $_; rename $_, "$_.bak" if /^\d+/; }
ã ã·ã£ã ã·ã£é£ã¹ã$ _;
-lãã©ã°ããååŸïŒ
-nãšãšãã«ãBEGIN {$ / = "\ n";ã ãã§ãªããchomp $ _;ã远å ããŸãã $ \ = "\ n"; }
ãã©ã°-a-aãã©ã°ã䜿çšãããšãPerlãawkãšããŠäœ¿çšã§ããŸãã
次ã®ã³ãŒãïŒ
perl -nae "print 1"
ãšåçïŒ
LINE: while (defined($_ = <ARGV>)) { our(@F) = split(" ", $_, 0); print 1; }
ã€ãŸããåè¡ã¯ã¹ããŒã¹ã«åå²ãããŠåå²ãããçµæã®ãã£ãŒã«ãã¯@Fé
åã«å
¥ããããŸãã
ãã£ãŒã«ãåºåãæåã¯ã
-Fãã©ã°ã䜿çšããŠå€æŽã§ããŸãã
/ etc / passwdãã¡ã€ã«ããããŒã ãã£ã¬ã¯ããªãå«ããŠãŒã¶ãŒåãåºåãããšããŸãã
less /etc/passwd | perl -F: -nlae 'print "$F[0]:$F[4]"'
ãŸããããšãã°Windowsã®å Žåã2009幎9æã«æåŸã«å€æŽãããã©ã«ããŒå
ã®ãã¡ã€ã«ã®ååã調ã¹ãããšæããŸãã
dir /TW | perl -nale "print $F[$#F] if $F[0] =~ /\.09\.2009/"
-Pãã©ã°ãŸãããã®ãã©ã°ã¯
-nããprint $ _ãã§å¥ã®continueãããã¯ã远å ããã ãã§ãã
次ã®ã³ãŒãïŒ
perl -pe "print 1"
ãšåçïŒ
LINE: while (defined($_ = <ARGV>)) { print 1; } continue { print $_; }
ãã¡ã€ã«/ etc / passwdãåºåããåæã«3ã6ã«çœ®ãæãããšããŸãã
ãã®ã³ãŒãã®ä»£ããã«ïŒ
less /etc/passwd | perl -ne "s/3/6/;print \$_"
ç§ãã¡ã¯æžãããšãã§ããŸãïŒ
less /etc/passwd | perl -pe "s/3/6/"
ãã©ã°-iiãã©ã°ã䜿çšãããšããã¡ã€ã«ã倿Žã§ããŸãã
次ã®ããã°ã©ã ïŒ
perl -i.bak -pe "s/foo/bar/"
ãããšåçïŒ
BEGIN { $^I = ".bak"; } LINE: while (defined($_ = <ARGV>)) { s/foo/bar/; } continue { print $_; }
ããã¯ãããšåçã§ãïŒ
$extension = '.bak'; LINE: while (<>) { if ($ARGV ne $oldargv) { if ($extension !~ /\*/) { $backup = $ARGV . $extension; } else { ($backup = $extension) =~ s/\*/$ARGV/g; } rename($ARGV, $backup); open(ARGVOUT, ">$ARGV"); select(ARGVOUT); $oldargv = $ARGV; } s/foo/bar/; } continue { print;
perl -i.bak -peâ codeâ <file name>ãšããè¡ãåŒã³åºããããšãã«äœãèµ·ããããç°¡åã«èª¬æããŸãã ããšãã°ã次ã®ããã«åŒã³åºããŸãã
perl -i.bak -pe "s/foo/bar/" test.txt
test.txtãã¡ã€ã«ã®ååãtest.txt.bakãã¡ã€ã«ã«å€æŽãããæ°ããtest.txtãã¡ã€ã«ãäœæãããŸãã æ¬¡ã«ããœãŒã¹ãã¡ã€ã«ã®åè¡ã§ãfooãbarã«çœ®ãæããããæ°ããtest.txtãã¡ã€ã«ã«æžã蟌ãŸããŸãïŒæããã«ããã¡ã€ã«ã®ååã倿Žãããå Žåã§ãããã®è¡ã«ã¢ã¯ã»ã¹ã§ããŸããïŒïŒ
ãã¡ã€ã«å
ã®\ r \ nã\ nã«çœ®ãæããããšããŸãïŒ
perl -i.bak -pe 's/\r\n/\n/' test.txt
ãã®ã³ãŒãã®çµæã2ã€ã®ãã¡ã€ã«ãååŸãããŸãã1ã€ã¯ãœãŒã¹ã®ã³ããŒã§ããtest.txt.bakããã1ã€ã¯\ r \ nã\ nã«çœ®ãæããããtest.txtã§ãã
ãæ³šæ äžèšã®ããã°ã©ã ã詳现ã«èŠããšïŒ$ extension = '.bak'; ...ïŒãperl -ibak_ * ...ã®ããã«åŒã³åºããšãããã¯ã¢ãããã¡ã€ã«ããbak_test.txtããšåŒã°ããããšãããããŸãããã©ã¡ãŒã¿iã®å€ã«ã¢ã¹ã¿ãªã¹ã¯ãå«ãŸããŠããå Žåããã®å€ã¯æ¡åŒµåã§ã¯ãªããã³ãã¬ãŒããšèŠãªãããŸããã¢ã¹ã¿ãªã¹ã¯ã¯ãã¡ã€ã«åã瀺ããŸãã
ãã©ã°-M-Mãã©ã°ã䜿çšãããšãã¢ãžã¥ãŒã«ãæ¥ç¶ã§ããŸã
ããšãã°ãç§ã¯CGIã¢ãžã¥ãŒã«ãã©ãã«ããããç¥ãããïŒ
Windowsã®å ŽåïŒ
perl -MCGI -le "print $INC{'CGI.pm'}"
Linuxã®å ŽåïŒ
perl -MCGI -le "print \$INC{'CGI.pm'}"
æè¿ãæ¡åŒµåã.cgiããæã€ãã¹ãŠã®ãã¡ã€ã«ã«å¯ŸããŠchmod a + xãäœæããå¿
èŠããããŸããã
ãããããµãŒããŒäžã§äœããã®çç±ã§chmodã®-Rãã©ã°ãæ©èœããªãã£ãããããããç§ãããããšã§ãã
perl -MFile::Find -e 'finddepth(sub {print $File::Find::name . "\n"}, "."})' | grep -P '\.cgi$' | perl -nle '`chmod a+x $_`'
ãã®ã³ãŒãã§ã¯ããperl -MFile :: Find -e 'finddepthïŒsub {print $ File :: Find :: nameãâ \ Nâ}ãâã "}ïŒ'ã 'FileïŒFindã¢ãžã¥ãŒã«ã®finddepth颿°ãåŒã³åºããŸãããçŸåšã®ãã£ã¬ã¯ããªãååž°çã«ãã€ãã¹ããå®å
šãªãã¡ã€ã«ãã¹ã衚瀺ããŸããã
次ã«ãã°ãªããã䜿çšããŠãããcgiãã§çµãããã¡ã€ã«ã®ã¿ãåããŸããïŒ-Pã¯ããŒã«å€§éºŠã®æ£èŠè¡šçŸã䜿çšãããããšãæå³ããŸãïŒã次ã®ããã°ã©ã ãperl -nle '' chmod a + x $ _``ãã§å®è¡æš©ãäœããŸããèŠã€ãã£ããã¡ã€ã«ã
ãã®ã³ãŒãã¯æ¬¡ã®ããã«æžãããšãã§ããŸããïŒ
perl -MFile::Find -e 'finddepth(sub {$n = $File::Find::name;`chmod a+x $n` if $n =~ /\.cgi$/}, ".")'
$ _ã«ã\ nãã®ãªããã¡ã€ã«åãå«ãŸããªãããã«ã-lãã©ã°ã䜿çšããå¿
èŠãããããšã«æ³šæããŠãã ããã
ãããããã©ã°ã€ã³ããã±ãŒãžããã¡ã€ã³ããã±ãŒãžã«ããã€ãã®å€æ°ãŸãã¯ã«ãŒãã³ãæ¥ç¶ããå¿
èŠãããå Žåã¯ã©ãã§ããããã
次ã«ãæžãå¿
èŠããããŸãïŒ
perl -MModule=foo,bar -e '...';
ãŸãã¯
perl '-Mmodule qw(foo bar)' -e '...';
BEGINããã³END
awkãšåæ§ã«ãæåãšæåŸã«çºçããå¿
èŠãããã¢ã¯ã·ã§ã³ã«BEGINãšENDã䜿çšã§ããŸãã
perl -e 'BEGIN{< >};<>;END{ }';
ããšãã°ãã¬ããŒãã®æåãšæåŸã«40åã®ã=ãèšå·ã§æ§æãããç·ãæç»ããŸãã
dir /b | perl -pe "sub line {print '=' x 40 . \"\n\"};BEGIN{line();};END{line()}"
ãããã°ãã
åäžè¡ã®ããã°ã©ã ããããã°ããã«ã¯ãB :: Deparseã¢ãžã¥ãŒã«ãæ¥ç¶ããå¿
èŠããããŸãã
å®è¡ããå ŽåïŒ
perl -MO=Deparse -ne "print 1"
åºåãåŸãããŸãïŒ
LINE: while (defined($_ = <ARGV>)) { print 1; } -e syntax OK
B :: Deparseã¢ãžã¥ãŒã«ã¯ãã-MO = Deparseãã®ããã«æ¥ç¶ããå¿
èŠããããŸãããã-MB :: Deparseãã®ããã«æ¥ç¶ããå¿
èŠã¯ãããŸããã ã©ãããããã¯ãããã°ã©ã ã§ã¡ãœããã䜿çšããã ãã§ãªãããã®ã¢ãžã¥ãŒã«ã䜿çšããŠããã°ã©ã ã®ãœãŒã¹ã³ãŒãã衚瀺ããããšãæç¢ºã«å®çŸ©ããããã«è¡ãããããã§ãã
ããã¯ãB :: Deparseã¢ãžã¥ãŒã«ãéåžžã®ã¢ãžã¥ãŒã«ãšããŠäœ¿çšãããæ¹æ³ã§ããã³ãŒãåºåã¯ãããŸããã
perl -MB::Deparse -e "print 1"
äžèšã®äŸã§ã¯ãMO = Deparseã䜿çšããŠããã°ã©ã ã³ãŒããåºåããŸããã
åäžè¡ããã°ã©ã ã®äŸ
ãã¡ã€ã«ã®è¡æ°ãåºåããŸãïŒUnix wc -lã®ã¢ããã°ïŒ perl -ne '}{ print $.' abc.txt
åçã®ããã°ã©ã ïŒ
LINE: while (defined($_ = <ARGV>)) { (); } { print $.; }
ããã§ã¯ãããªãããŒãªããªãã¯ã} {ãã䜿çšãããŠããŸãã ç§ãã¡èªèº«ããµã€ã¯ã«ãéããŸããã
ãã€ããªåºå perl -e "printf '%b', shift" 200
ãã¡ã€ã«å
ã®\ r \ nã\ nã§çœ®ãæãã perl -i.bak -pe 's/\r\n/\n/' file.txt
ãæ³šæ äœããã®çç±ã§ãWindowsã§ã¯åæ§ã®ã³ãŒãã¯æ©èœããŸããïŒããã¯æ°žç¶çã«\ r \ nã远å ããbinmode ARGVãè¡ããŸããã
binmode $ ARGVãbinmode * ARG {FILEHANDLE}ããããäœã圹ã«ç«ããªãã£ãã®ã§ãããã«æŠããŸãã Windowsã§\ r \ nã\ nã«çœ®ãæããæ¹æ³ãæžããŠããã ããã°å¹žãã§ãã
IPã¢ãã¬ã¹ãæ°åãããããã«å€æããïŒ perl -e "print unpack('N', pack('C4', split /\./, shift))" 127.0.0.1
çŸåšã®ãã©ã«ããŒãšãã®ãµããã©ã«ããŒå
ã®.svnãã©ã«ããŒãïŒååž°çã«ïŒåé€ãã perl -MFile::Find -MCwd -e '$path = getcwd;finddepth(sub {print $File::Find::name."\n"}, "$path")' | grep '\.svn$' | perl -ne 'system("rm -rf $_")';
Windowsã§ãåãããšïŒ
perl -MFile::Find -e "finddepth(sub{ print $File::Find::name . \"\n\"; }, '.')" | perl -ne "print if /.svn$/" | perl -pe "s|/|\\|g" | perl -ne "system(\"rd /s /q $_\");"
16é²IPã¢ãã¬ã¹åºå perl -e "printf '%02x' x 4, split /\./, shift" 127.0.0.1
ãã¡ã€ã«ã®å
é ã«ãïŒïŒ/ Usr / bin / perlããšããè¡ã远å ããŸã perl -i.bak -pe "print \"#!/usr/bin/perl\n\" if $. == 1" abc.pl
Linux / Unixã®å ŽåïŒ
perl -i.bak -pe 'print "#!/usr/bin/perl\n" if $. == 1' abc.pl
ãªããããå¿
èŠãªã®ã§ããïŒ
çŽæããããã«ããªãããããã¹ãŠå¿
èŠãªã®ããæžããŸãã findãawkãgrepãsedããããšèšããŸããããªãåäžè¡ã®Perlãªã®ã§ããããïŒ
ãŸããWindowsã§ã¯ãããã©ã«ãã§grepãšawkã¯ãããŸããã ã¯ãããã¡ããgrepã䜿çšããŠè¡ãéžæããæ¹ãé«éã§ãããããšãã°ãã¡ã€ã«ã®ååã倿Žãããªã©ãããå°ãè¡ãå¿
èŠãããå Žåã¯ã©ãã§ããããã çµå±ããããšèšããããã§ãã ããã§ã¯ãåç·çç ãå®ãããã«äœãšèšããŸããïŒ
ãããŠããã«äœããããŸãïŒ
ãŸããPerlã§ããã°ã©ãã³ã°ããå ŽåãPerlãéåžžã«ããèŠããŠããã®ã§ã人ãèŠãã«ããã«åäžè¡ã®ããã°ã©ã ã®äœæãéå§ã§ããŸãã ïŒãã ããæåã¯å°ãçãããããããŸããããåå ãããšç°¡åã«ãªããŸãïŒ
第äºã«ãPerlã䜿çšãããšäŸ¿å©ã§ãã ããšãã°ãPerlã®åã§awkã®é¡äŒŒç©ïŒ-aãã©ã°ãåç
§ïŒãå¿
èŠãªå ŽåïŒããšãã°ãåäžè¡ããã°ã©ã ã§packãunpackããŸãã¯Perlæ£èŠè¡šçŸã䜿çšãããïŒ
第äžã«
Perlã¯åŒ·åãªèšèªã§ãã åäžè¡ã®perlããã°ã©ã ã¯ãã³ãã³ãã©ã€ã³ã®ã¿ã®éåžžã®Perlããã°ã©ã ã§ãã ãããã£ãŠãåäžè¡ã®çç ããã°ã©ã ã¯ããŸããŸãªã¿ã¹ã¯ã«äœ¿çšã§ããŸãïŒ ïŒãã ããé·ãåäžè¡ã®ããã°ã©ã ãäœæããªãæ¹ãè¯ããšæããŸããéåžžã®çç ã®ã¹ã¯ãªãããäœæããæ¹ãè¯ãã§ãããïŒã
ãããã«
grepãfindãsedããŸãã¯awkãæåŠããããšã匷ããå§ãããã ãã ãšã¯æããªãã§ãã ããã ç§ã¯ä¿ããŸããïŒ ç§èªèº«ãgrepã䜿ãç¶ããŠããŸãã Perlã§ããã°ã©ãã³ã°ãã人ã«ãšã£ãŠäŸ¿å©ãªã1è¡ã®çç ããšããŠå¥ã®äŸ¿å©ãªããŒã«ã«ã€ããŠã話ããããã£ãã®ã¯ã1ïŒäººãèªãå¿
èŠããªãïŒãã§ã«ãã¹ãŠãèŠããŠããïŒã2ïŒPerlã®åã䜿çšãããŠãããã
ãæž
èŽããããšãããããŸããã èå³ããã人ã¯ããã«éã£ãŠãã ããïŒ
perldoc.perl.org/perlrun.html-perldocããã¹ãŠã®ãã©ã°ã®èª¬æã
sial.org/howto/perl/one-liner-ããŸããŸãªäŸ
ç§ã¯ããªãã«åèªã䜿ã£ãŠçç ã®åäžè¡ããã°ã©ã ãã°ãŒã°ã«ã«ããããšãå§ããŸãïŒã¯ã³ã©ã€ããŒ
æŽæ°ïŒWindowsã§\ r \ nã\ nã«çœ®ãæããã«ã¯ã次ã®ããã«æžãã ãã§ãã
perl -i.bak -ple "s/\r|\n//g;binmode ARGVOUT" file.txt
ã¢ã³ãã³ã»ã·ã§ã«ããã³ãå°é
ããæŽæ°ïŒAntonShcherbininã®ã³ãŒãã«è¿œå ãããã
s / \ r | \ n // g; ãããã以å€ã®å Žåã¯Linuxã§binmodeãããŒã«ããªãã ãã§ããã®ã³ãŒãã¯æ®éçã§ãïŒWindowsãšLinuxã®äž¡æ¹ã§åäœããŸãã
ã¢ããããŒãïŒ2012幎8æ26æ¥ïŒïŒ<source lang = "Perl"> </ source>ã¿ã°ã®äžã®ã³ãŒãäŸãæžãçŽããŸãã