0

ファイルから区切られたテキストを取得するために、csvファイルで次を実行できます。

#!/usr/bin/perl
use strict;
use warnings;
use Text::Balanced q/extract_delimited/;

my $filecontents = do { local $/; <> };

while (my $item = extract_delimited($filecontents, '"')) {
    print "Item: $item\n";
}

しかし、結果には常に引用符が含まれていますが、これは私が望まないものであるため、複数行のレコードを完全に分離するために次のことを試みました

#!/usr/bin/perl
use strict;
use warnings;
use Text::Balanced qw/gen_delimited_pat/;

my $filecontents = do { local $/; <> };
$patstring = gen_delimited_patq(\G(?:[^"]|""|""")* ]))

while (my $item = extract_delimited($filecontents, '"')) {
    print "Item: $item\n";
}

私はこの正規表現を知っているので

\G(?:[^"]|""|""")*

Text :: Markdownで処理したい完全な複数行のレコードを見つけましたが、次のようなエラーが発生します

  • 「PATTERN」の使用 明示的な演算子がない場合は、10行目で非推奨になります。
  • グローバルシンボル「$patstring」には、10行目に明示的なパッケージ名が必要です。
  • 検索パターンが10行目で終了していません。

最初と最後の引用符を除いて、次のようなレコードの区切りテキストのみを取得しようとしています。これが理にかなっていることを願っています。

「説明」「Star-Lite2人用フライアルミニウム、錆

仕様:

  • 梱包サイズ:13 "" X 5 ""
  • 1ドア
  • 内部面積:41.25平方フィート
  • ピーク高さ:44 ""
  • 床材:190Tポリエステル、2000mmPUコーティング
  • メッシュ:ヌカカ
  • 極数:ショックコード付きアルミ2個8.5mm。
  • ポールセクション:12""の長さ。
  • レインフライが含まれています。
  • 90 "" X 66 "" X 44 "" "

私が欲しい最初の行を除いて

Star-Lite 2-Person w / Fly Aluminium、Rust

仕様:

  • 梱包サイズ:13 "" X 5 ""
  • 1ドア
  • 内部面積:41.25平方フィート
  • ピーク高さ:44 ""
  • 床材:190Tポリエステル、2000mmPUコーティング
  • メッシュ:ヌカカ
  • 極数:ショックコード付きアルミ2個8.5mm。
  • ポールセクション:12""の長さ。
  • レインフライが含まれています。
  • 90 "" X 66 "" X 44 ""

このモジュールのパターンを修正するにはどうすればよいですか?

編集:機能した間違ったスクリプトを貼り付けました

4

2 に答える 2

1

A bit inelegant, but this will do what I think you want to do:

#!/usr/bin/perl
use strict;
use warnings;
use Text::Balanced qw/extract_delimited extract_multiple/;

my $filecontents = do { local $/; <> };

#replace newlines with pipes
$filecontents=~s/\n/\|/g;
$filecontents=~s/""/inches/g;
#grab all your delimited substrings into an array
my @extracted = extract_multiple($filecontents,
                            [ sub {extract_delimited ($_[0],q{"})}],
                            undef, 1);

foreach my $fragment(@extracted){
    #remove "
    $fragment=~s/"//g;
    $fragment=~s/inches/""/g;
    $fragment=~s/\|/\n/g;
    print "$fragment\n";  
}
于 2012-09-23T19:33:46.210 に答える
0
Global symbol "$patstring" requires explicit package name at line 10.

厳密$patstring変数を宣言するのを忘れました。

Use of ?PATTERN? without explicit operator is deprecated at line 10

gen_delimited_pa​​tは文字列を取ります。あなたはそれを渡しました...まあ、あなたはそれに構文エラーを渡しました。正規表現になっていると思いますか?Perlは、必死になって、それを「パターン」として解析しようとしました。単一の疑問符を使用して、それからあきらめました。

あなたが与えるどちらの例も、これまでうまくいくはずがありませんでした。どちらにも上記と同じエラーが含まれています。Text :: Balanced関数と呼ばれるgen_delimited_patqものはなく(ですgen_delimited_pat)、Text :: Balancedから正しい関数をエクスポートせず、$patstring使用されることもありません。

于 2012-09-23T18:35:06.497 に答える