1

これが私がやろうとしていることです:

テキストファイルを文字列の配列に読み込みたい。;ファイルが特定の文字(主にまたは)を読み取ったときに文字列を終了させたい|

たとえば、次のテキスト

よろしいですか?お願いします
手渡し| 私のコート?

このように片付けられます:

$string[0] = 'Would you;';
$string[1] = ' please hand me|';
$string[2] = ' my coat?';

このようなことについて助けてもらえますか?

4

5 に答える 5

6

これでうまくいきます。分割しているトークンを保持しながら分割を使用する秘訣は、ゼロ幅のルックバック一致を使用することですsplit(/(?<=[;|])/, ...)

注:mctylrの回答(現在の最高評価)は実際には正しくありません。改行でフィールドが分​​割されますが、b/cは一度にファイルの1行でのみ機能します。

入力レコード区切り文字()を使用したgbaconの答え$/は非常に巧妙であり、スペースと時間の両方で効率的ですが、本番コードで見たくないと思います。1つの分割トークンをレコード区切り文字に入れ、もう1つを分割に入れると、少しわかりにくくなり(Perlで戦わなければなりません...)、保守が難しくなります。また、なぜ彼が複数の改行を削除しているのか(あなたが要求したとは思わないのですか?)、なぜ彼が'|'で終了したレコードの終わりにのみそれを行っているのかわかりません。

# open file for reading, die with error message if it fails
open(my $fh, '<', 'data.txt') || die $!; 

# set file reading to slurp (whole file) mode (note that this affects all 
# file reads in this block)
local $/ = undef; 

my $string = <$fh>; 

# convert all newlines into spaces, not specified but as per example output
$string =~ s/\n/ /g; 

# split string on ; or |, using a zero-width lookback match (?<=) to preserve char
my (@strings) = split(/(?<=[;|])/, $string); 
于 2010-02-12T05:08:40.823 に答える
3

\n1つの方法は、特殊文字が見つかったときに、のような別の文字を挿入してから、 :で分割することです。\n

use warnings;
use strict;
use Data::Dumper;

while (<DATA>) {
    chomp;
    s/([;|])/$1\n/g;
    my @string = split /\n/;
    print Dumper(\@string);
}

__DATA__
Would you; please hand me| my coat?

プリントアウト:

$VAR1 = [
          'Would you;',
          ' please hand me|',
          ' my coat?'
        ];

更新:Jamesが提起した元の質問では、__DATA__上記のように、入力テキストが1行で表示されていました。質問の形式が不十分だったため、他の人が質問を編集して1行を2つに分割しました。1行または2行のどちらが意図されているかを知っているのはJamesだけです。

于 2010-02-12T02:17:34.800 に答える
1

@toolicの答えは、複数のセパレーターを非常に簡単に処理できるため、私はそれを好みます。

ただし、物事を過度に複雑にしたい場合は、いつでも次のことを試すことができます。

#!/usr/bin/perl

use strict; use warnings;

my @contents = ('');

while ( my $line = <DATA> ) {
    last unless $line =~ /\S/;
    $line =~ s{$/}{ };
    if ( $line =~ /^([^|;]+[|;])(.+)$/ ) {
        $contents[-1] .= $1;
        push @contents, $2;
    }
    else {
        $contents[-1] .= $1;
    }
}

print "[$_]\n" for @contents;

__DATA__
Would you; please
hand me| my coat?
于 2010-02-12T02:20:51.547 に答える
0

の線に沿った何か

$text = <INPUTFILE>;

@string = split(/[;!]/, $text);

多かれ少なかれトリックを行う必要があります。

編集:「/;!/」を「/[;!]/」に変更しました。

于 2010-02-12T02:14:56.157 に答える
0

(入力レコード区切り文字)を垂直バーに設定して、Perlに半分の作業を$/任せてから、セミコロンで区切られたフィールドを抽出します。

#!/usr/bin/perl

use warnings;
use strict;

my @string;

*ARGV = *DATA;

$/ = "|";
while (<>) {
  s/\n+$//;
  s/\n/ /g;
  push @string => $1 while s/^(.*;)//;
  push @string => $_;
}

for (my $i = 0; $i < @string; ++$i) {
  print "\$string[$i] = '$string[$i]';\n";
}

__DATA__
Would you; please
hand me| my coat?

出力:

$ string [0]='よろしいですか;';
$ string [1]='私に渡してください|';
$ string [2] ='私のコート?';
于 2010-02-12T03:51:39.077 に答える