LoginSignup
0
1

More than 5 years have passed since last update.

第27回sedこわいシェル芸勉強会

Posted at

sed縛り回なのでPHPでやる意味はあんまりない。
普通の言語でやってみたことで普通っていいねという気持ちに。
しかし、PHP芸人であることを強いられているんだ。

問題

Q1

正規表現による置換だとこう。-Rで$argnに標準入力が1行分代入され、スクリプトが毎行実行される。

echo abcdefghijklmn | php -R 'echo preg_replace_callback("/../", function($s){return $s[0][0].strtoupper($s[0][1]);},$argn);'

インデックスで処理するとこうか。

echo abcdefghijklmn | php -R 'for($i=0;$i<strlen($argn);$i+=2) echo $argn[$i].strtoupper($argn[$i+1]);'

Q2

ふつうにFizzBuzz

seq 1 100 | php -R 'echo $argn%3?"":"Fizz",$argn%5?$argn%3?$argn:"":"Buzz","\n";'

Q3

$argiに行番号が入ってくるので、それを見て出力と変数格納を切り分けるだけ。

seq 1 10 | php -R 'if($argi==3)$x=$argn;else echo "$argn\n";if($argi==7)echo "$x\n";'

Q4

Q3とだいたい同じ。設定にもよるけど、手元だと未初期化変数で警告が出るので-Bで初期化する。-Bのコードはプロセス起動後、-Rのコードが実行され始まる前に、1回だけ実行される。

cat aho.cc | php -B '$x="";' -R 'if(4<$argi&&$argi<10)$x.=$argn;else echo "$argn\n";if($argi==14)echo "$x\n";'

Q5

Q3と似たのが続く。

seq 1 10 | php -B '$x=null;' -R 'if($x){echo "$argn\n$x\n";$x=null;}else $x=$argn;'

Q6

sed版よりわかりやすいと思う。というか、やはり基本的にsedは行単位で何かするためのツールだと思う……。

echo 1 | php -R 'for($s=$argn;strlen($s)<10;$s.=$argn){echo "$s\n";}'

Q7

ここはいわば緊縛プレイなのでPHPでやる意味はない。

php -r 'for($i=1;$i<=10;$i++) copy("a", "a$i");'

Q8

まあふつう。今回はsedのラベルへのジャンプとかホールド・パターンスペースでゴニョるとか、普通の言語にないところがテーマだったので、普通の言語だとまあ、普通になりますね。

echo 1 | php -R 'for($s=$argn,$t="";strlen($s)<=5;$s.=$argn){$u="$s\n";$t=$u.$t;echo $u;}echo $t;'

感想

sedで条件式はマゾい(小並感

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1