これでうまくいきます。分割しているトークンを保持しながら分割を使用する秘訣は、ゼロ幅のルックバック一致を使用することです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);