[an error occurred while processing this directive]
[an error occurred while processing this directive]$|=1; print "hoge";これで、printの後に一々flushしてくれるようになります。
sub rand_str(){ $s = ""; foreach(0..10){ $s .= chr(rand()*26 + ord('a')); } return $s; }
while (<>) {print "$1 " if(m/$(.+)\s*:/) }
$SIG{ALRM} = sub { die "timeout" };
$a = "he"; @a = ("he", "she"); @a = grep {$_ ne $a} @a; print @a;
sub gen_str(){ $s = ""; foreach(0..1000){ $s .= chr(int(rand() * 26)+ord("a")); } return $s; } $t[0] = time(); @A; foreach(0..100000){ push(@A, gen_str()); } $t[1] = time() - $t[0]; @B = sort @A; $t[2] = time() - $t[1]; print "To generate: " . $t[2] . " sec, to sort: " . $t[1] . " sec\n";
"は\"みたいにエスケープしなくてもいい (しても実害ないみたいだけど)
複数行にわたるパターンを置換したい場合、 改行文字にもマッチさせたい場合、.だけではだめ。[\s\S]ってするのがお手軽。
edit.phpへのリンク及び、<form></form>にで囲まれた部分をすべて削除。 [s\S]*?で最短一致になっている。$s=""; while(<>){ $s .= $_; } $_=$s; s/<a href="edit\.php.[^>]*?">([^<>]+?)<\/a>/$1/g; s/<form [\s\S]+?<\/form>/ /g; print;
while(<>){ $before .= $_; last if (m/<ul/); } while(<>){ last if (m/<\/ul/); $li = $_; while(<>){ $li .= $_; last if(m/<\/li/); } push(@list_items, $li); } $after = $_; $after .= $_ while(<>); print $before; print foreach(reverse(@list_items)); print $after;
if (opendir(DIR, 'text/')){ @utexts = readdir(DIR); closedir(DIR); }こうすると、text/内のファイル一覧が@utextsという配列に入ります。
@texts = sort { $a cmp $b} @utexts;とするといいです。$aと$bは{}内だけで通用する変数で、いつも同じです。ソートを降順にしたければ、$aと$bを入れ替えます。ソートされた結果は@textsに代入されます。
foreach $file (@texts){ next if($file =~ /^([0-9]{2})\.txt$/); # 例えば、??.txtというファイル名にマッチしなければ捨てる open IN, "text/" . $file; #ファイル開く
perl -e "コマンド"で、コマンドが実行されます。シェルで一行スクリプトを実行するのに便利。
ls | perl -e '@A=<>;for($i=$#A;$i!=-1;$i--){print $A[$i]}'
perl -e "print int(rand(2)) ? 'hi' : 'bye';"
perl -e "print 1 << 31 "最後の;は無くても動きますね。ということはperlの;は"文の区切り"であって、"文の終端"ではないのか!?
perl -e "while(<>){s/hoge/fuga/g;print} "
ps | perl -e '<>;while(<>){@a=split; print "$a[0]\t$a[3]\n"} '
cat 変換前のファイル名 | perl -e 'while(<>){s|<br />|\n|g;print}'
#!/usr/bin/perl use LWP::Simple; $thres = 3; sub get_com($$){ my ($str, $depth ) = @_; if($depth == $thres){ print "Trying : $str ... "; my $page; eval { local $SIG{ALRM} = sub { die "timeout" }; alarm 5; $page = LWP::Simple::get("http://www.$str.com/favicon.ico"); alarm 0; }; alarm 0; if($@) { if($@ =~ /timeout/) { print "Timeout\n"; next; } } if( $page eq undef() ){ print "Undef\n"; next; } $_= substr($page, 0, 200); if(m/<html/i){ print "Html\n"; next; } open OUT, "<favicon/$str.ico"; print OUT $page; close OUT; print "Wrote\n"; } else { my $i; for($i = ord('a'); $i <= ord('z'); $i++){ get_com($str . chr($i), $depth + 1); } } } get_com("", 0);
#!/usr/bin/perl $dir = "."; print "Content-type:text/html\n\n<html><body>"; if (opendir(DIR, $dir)) { foreach(readdir(DIR)) { image($_) if(/.+\.(png|jpg|jpeg)$/i); } closedir(DIR); } print "</body></html>\n"; sub image { print "<a href='$_[0]'><img src='$_[0]' /></a><br />";}超簡易スクリプト。$dirで指定されたディレクトリ内の画像ファイルをリスト表示します。
@A = `ls -F`; foreach (@A){ chomp(); next unless(m/.*\/$/); $new_fn = int(rand(1000000)); $cmd = "mv $_ $new_fn"; # print $cmd . "\n"; (いちおう出力確認) `$cmd`; }
sub getDateStr(){ ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $year += 1900; $mon++; $ret = sprintf("%d_%02d%02d_%02d%02d_%02d", $year, $mon, $mday, $hour, $min, $sec); return $ret; }
open ERR, ">>err.dat";print ERR "status = $status\n" ;close ERR;みたいな一行をコピー&ペーストして、エラーファイルを使うと便利。
sub err { open ERR, ">>err.dat"; print ERR join(';',@_)."\n"; close ERR; chmod 0666, "err.dat"; }
@temp = <IN>;みたく読み込んだとき、各要素($temp[0], $temp[1]...)には改行コード(普通は\n)がぶら下がってるから注意。
print OUT "value = $HASH{'name'}"みたいに。
if ($str) {とすると、$str = "0"の時も弾かれるので注意。はまりました。
for ($i = 1; $i <= 5; $i++ ){って書いたとき、ループ終了後のiの値は6。(これはCも同じ) 何となくBASICの
for i = 1 to 5のノリで書くと失敗します。
for($i = 0; $i <= $#list; $i++){です。ま、foreach使えば関係ないけど...
if (opendir(DIR, ~/imgs)) { @list = readdir(DIR); foreach(@list){ ($_にファイル名が入る) closedir(DIR); }
use Time::Local; ($year,$mon,$mday,$hours,$min,$sec)=split(","); $time = timelocal($sec, $min, $hours, $mday, $mon - 1, $year); print "$time\n";
open OUT ">hoge.dat"; chmod 0666 hoge.dat;
if(index == 3) printf("Hello\n");となるのは、
print "Hello\n" if($index == 3);となる。これを使うと
print while <>;とかいう怪しい文も書ける。
my $dir = 'icon/'; my @files; if (opendir(DIR, $dir)){ @files = readdir(DIR); closedir(DIR); } my @imgs; my $j = rand($#files + 1); foreach $i (0..3){ do{ $_ = $files[($j++) % ($#files + 1)]; } while(! /\.png$/); $imgs[$i] = $dir . $_; if(!-e $imgs[$i]){ $imgs[$i] = '';} }普通にディレクトリをオープンすると、.と..もリストに含まれるので注意。
open(IN, $ARGV[0]); for($fn = 0; ; $fn++){ open(OUT, ">". $ARGV[0] . $fn); print "wrote file $fn\n"; $count = 0; while($count++ < 500){ $tmp =; if($tmp eq ''){ close IN; close OUT; exit(0); } print OUT $tmp; } close OUT; }
@A = (1,2..4,8..10);
print pal($ARGV[1]) . "\n"; sub pal{ $_ = $_[0]; return (2 > length()) ? 'true' : (m/^(.).*$/ && m/^.(.*)$1$/) ? pal($1) : 'false'; }と書いたんだけど、実はCでもたいしたことないし。
int pl(char *s, char *e){ return (2 > e - s) ? 1 : (*s == *e) ? pl(s + 1, e - 1) : 0; } int main(int argc, char *argv[]){ char *cp = argv[1]; if(pl(cp, cp + strlen(cp) - 1)) printf("true\n"); else printf("false\n"); return 0; }多くの場合、これでも正しく動作する。
int pl(char *s, char *e){ return (2 > e-s) || ((*s==*e) && pl(s+1, e-1)); } int main(int argc, char *argv[]){ char *cp = argv[1]; if(pl(cp, cp + strlen(cp) - 1)) printf("true\n"); else printf("false\n"); return 0; }
$a = {0=>2}; @A = (0, 2); $b = [0, 2];