68user's page 掲示板

Prev< No. 2689〜2694> Next  [最新発言に戻る] [過去ログ一覧]
No. 2689 # moto 2002/05/16 (木) 06:46:43
お世話になります。トータルで3回目の質問になるのですが、
perl で例えば

<>aa<>bb<>cc<>dd<>  ←1行目
ee<>ff<>gg      ←2行目

このようなデータがあった場合
<>aa
<>bb
<>cc
<>dd
<>ee
<>ff
<>gg
のように出力させるコードを教えてください。
よろしくお願いします。

No. 2690 # ふくし 2002/05/16 (木) 07:09:08
<> が区切り文字だと事前にわかっていれば、
chomp で改行を除き、
<> で split して、<> を改めて付加して出力、ですね。

通常のフィルターの書き方はわかりますか?
chomp、split の使い方は man perlfunc か、
ラクダの本を見てください。
(どっかで日本語の man perl が公開されてたな)

<>が区切り文字だとわかっていなければ、無理だと思います。
というのは、たとえば 1 行目で、<> が区切りなのか、
<>a なのか、<>aa なのか、機械には不明だからです。

No. 2691 # aaa 2002/05/16 (木) 13:00:16
以下はどうでしょうか?

#!/usr/local/bin/perl

my(@array) = ( "<>aa<>bb<>cc<>dd<>", "ee<>ff<>gg" );

foreach $aref ( @array ) {
        $str .= $aref;
}

$str =~ s/\</\n\</g;
$str =~ s[ ^\n ]{}gsx;
print "$str\n";

No. 2692 # moto 2002/05/17 (金) 06:37:10
ふくしさん、aaaさん、
お二人のコードを参考にして解決できました。
ありがとうございました。

No. 2693 # 名無しさん 2002/05/17 (金) 14:02:00
>>2691 aaa
これはちょっと参考になりませんねぇ。。(aaaさんゴメン)
ちょっと間違ってます。

("[*1]<>aa<>bb<>cc<>dd<>[*2]", "[*3]ee<>ff<>gg"
与えられた配列の、*1〜3の所に項目が一つ増えただけで思ったようには動かないと思う。。

1つの変数にぶち込んだ時点で、*2 *3の区別ができなくなる。
そして、
$str =~ s[ ^\n ]{}gsx;
ですが、、^\nでマッチするところは、s(単一行として扱う)が付いてるから、頭の所("\n<>aa...")の\nが取れるだけだし、、gを付ける必要は無い
ここでまた一つ問題がある。。多分、motoさんの発言を見ると、*1の部分にも項目が来ると思われる。。"xx<>aa<>bb..."
そうすると、1行目に<>が入らず、、
xx
<>aa
...
ってなる。。。
あともう一つ。@arrayは配列だって分かるから括弧を付ける必要は無い
my @array = (...)こんな感じ

No. 2694 # 名無しさん 2002/05/17 (金) 14:21:57
自分で書いてみた。

my @target = ("<>aa<>bb<>cc<>dd<>", "ee<>ff<>gg");

my @result = map {
                my @tmp = split(/<>/);
                shift(@tmp) if $tmp[0] eq '';
                @tmp;
        } @target;


foreach (@result) {
        print "<>$_\n";
}

Prev< No. 2689〜2694> Next  [最新発言に戻る] [過去ログ一覧]