输入文件:
1,a,USA,,
2,b,UK,,
3,c,USA,,
我想更新输入文件中的第4列,从其中一个表中获取值。
我的代码如下:
my $number_dbh = DBI->connect("DBI:Oracle:$INST", $USER, $PASS ) or die "Couldn't
connect to datbase $INST";
my $num_smh;
print "connected \n ";
open FILE , "+>>$input_file" or die "can't open the input file";
print "echo \n";
while(my $line=<FILE>)
{
my @line_a=split(/\,/,$line);
$num_smh = $number_dbh->prepare("SELECT phone_no from book where number = $line_a[0]");
$num_smh->execute() or die "Couldn't execute stmt, error : $DBI::errstr";
my $number = $num_smh->fetchrow_array();
$line_a[3]=$number;
}
答案 0 :(得分:1)
您的数据看起来像是CSV格式。您可能想要使用Parse::CSV。
答案 1 :(得分:0)
+>>
没有按照您的想法行事。事实上,在测试中它似乎根本没有做任何事情。此外,+<
做了一件非常奇怪的事情:
% cat file.txt
1,a,USA,,
2,b,UK,,
3,c,USA,,
% cat update.pl
#!perl
use strict;
use warnings;
open my $fh, '+<', 'file.txt' or die "$!";
while ( my $line = <$fh> ) {
$line .= "hello\n";
print $fh $line;
}
% perl update.pl
% cat file.txt
1,a,USA,,
1,a,USA,,
hello
,,
,,
hello
%
+>
似乎会截断文件。
实际上,您要做的是写入新文件,然后将该文件复制到旧文件上。打开同时读/写的文件看起来就像是在进入一个受伤的世界。
顺便说一句,你应该使用open()
的三参数形式(对于“奇怪的”文件名更安全)并使用词法文件句柄(它们不是全局的,当它们自动超出范围时你的文件为你关闭)。