1

私は以下のコードを持っています:

my $file = 'c:\test.log';
open (FILE, "<", $file) or die $!;
my @list = grep /\bAdobe\b/, <FILE>;
my $days;
foreach (@list) {
$days = $_;
print "$days\n";
}

期待される結果は次のとおりです。

"Adobe","10:10:10, 11/10/2011","Ready"

以下のコードを使用して、結果をコンマで分割します。

my @sample = split(',', $days);

期待される結果は次のとおりです。

"Adobe"
"10:10:10
11/10/2011"
"Ready"

しかし、それは私がやりたかったことではありません:

次のように出力を出力したいと思います。

"Adobe"
"10:10:10, 11/10/2011"
"Ready"

Text :: CSVなどのモジュールを使用/インストールせずに、これを実現するにはどうすればよいですか。

アドバイス、ありがとう。

4

4 に答える 4

6

理想的には、CSVパーサーを使用します。Text ::CSVを参照してください。または、すべてのフィールドが二重引用符で囲まれている限り、区切り文字をチェックする少し複雑な正規表現で分割を使用できます。

split /(?<="),(?=")/, $days;
于 2011-11-22T12:00:04.213 に答える
4

私はそれがText::CSVモジュールのために働くと信じています。この例のようなものが機能するはずです:

use Text::CSV;

my $file = 'c:\test.log';
open (my $FILE, "<", $file) or die $!;
my $csv = Text::CSV->new;

while (my $row = $csv->getline($FILE)) {
  my @sample = @$row;
  next if $sample[0] !~ /\bAdobe\b/;
  # do whatever you want
}
于 2011-11-22T11:55:54.773 に答える
2

標準ディストリビューションのText::ParseWordsモジュールも使用できるため、CPANからText :: CSVをインストールする必要はありません(ただし、その制限がある場合は、実際に修正する必要があります) 。

于 2011-11-22T12:41:26.927 に答える
1

文字列"Adobe","10:10:10, 11/10/2011","Ready"はperlコードとして有効であるため、次を使用できますeval

my $file = 'c:\test.log';
open my $fh, "<", $file or die $!;
for (grep /\bAdobe\b/, <FILE>) {
    my @sample = eval;
    # code here
}

ただし、これは、有効な形式であることが確実なデータに対してのみ行ってください。

データからの出力::ダンパー

$VAR1 = [
          "Adobe",
          "10:10:10, 11/10/2011",
          "Ready"
        ];
于 2011-11-22T18:48:21.323 に答える