初めて自分の家と他人の家が違う、と意識した時

初めて質問します。
Perlを使って下記のようにテキストを変換したいんですけど、やり方を教えてください><

【変換前】
A 1234
A 2345
B 3456
B 4567

【変換後】
>Af
>1234
>As
>2345
>Bf
>3456
>Bs
>4567

というふうに並び変えたいんですけど、なにぶんプログラミング初心者なもので、
よろしくお願いいたします。

A 回答 (5件)

>#2


なるほど、出力は同じでも意味合いが全然違ったんですね・・・
添削有難うございます!

訂正版:
http://ideone.com/fPiHR
    • good
    • 0
この回答へのお礼

回答してくださってありがとうございます。
無事に解決することができました。
他の方にも回答していただいていろいろと勉強になりました。

お礼日時:2011/08/10 21:37

#2 をベースに one-liner化:



perl -pe 's/^(.)\s*/">$1" . [qw(s f)]->[$. % 2] . "\n>"/e'
    • good
    • 0

あんまり、かわらんか。

空白2文字を全角空白にしていることに注意。

use strict;
use warnings;

my %work = ();
while ( my $line = <DATA> ) {
  $line =~ s/\x0D?\x0A?$//;
  if ( $line =~ m/([^\s]+)\s+(.+)/ ) {
    my ( $key, $val ) = ( $1, $2 );
    if ( !exists $work{$key} ) {

      # first match
      print '>', $key, "f\n>", $val, "\n";
      $work{$key} = 1;
    }
    else {

      # second match
      print '>', $key, "s\n>", $val, "\n";
      delete $work{$key};
    }
  }
}

__DATA__
A 1234
A 2345
B 3456
B 4567
    • good
    • 0

試してませんが, Perl の方で print は


print ">$mark$suffixes[$. % 2]\n>$number";
とすべきではないかと>#1. 配列 @suffixes の特定の 1要素であるスカラを参照しているので, sigil は @ ではなく $ でしょう.

本題は要件がわからん (「どう変換するのか」がわからん) ので無視.
    • good
    • 0

いろいろ解法ありそうですけど、自分がまっさきに思い浮かんだのは次のやり方です。



・一行ずつ処理
・行番号の偶奇判定によって、fかsか振り分ける

<おまけ>
取り敢えず動いたレベルですが・・・
Perlは見よう見まねなので、自分も添削が欲しいです。

http://ideone.com/ItAlw
http://ideone.com/pogvK
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!