我是Perl的新手,我需要完成一个依赖它的项目。我需要拍摄文件夹中的图片,在DB中查找他们的名字,然后根据该行中的其他值重命名图片。
所以说我需要重命名图片
010300000000001002.jpg
然后我需要在db中查找脚本
010300000000001002
USERID
中的。然后当它找到匹配时,我需要它来查找同一行中的EMPNUM
值。然后取EMPNUM
值并将图片重命名为value.jpg,在这种情况下等于1002.所以最终产品最终会像这样:
Old Picture: 010300000000001002.jpg
New Picture: 1002.jpg
然后重复该文件夹中的所有图片。
从DB脚本中读取:
#!/usr/bin/perl -w
use strict;
use DBI;
# Replace datasource_name with the name of your data source. AdventureWorksDW \dbo.DimEmployee
# Replace database_username and database_password
# with the SQL Server database username and password.
my $data_source = q/not giving the data source/;
my $user = q/Not giving the user/;
my $password = q/Not Giving the password /;
my $dbh = DBI->connect($data_source, $user, $password)
or die "Can't connect to $data_source: $DBI::errstr";
# Catch and display status messages with this error handler.
sub err_handler {
my ($sqlstate, $msg, $nativeerr) = @_;
# Strip out all of the driver ID stuff
$msg =~ s/^(\[[\w\s:]*\])+//;
print $msg;
print "===> state: $sqlstate msg: $msg nativeerr: $nativeerr\n";
return 0;
}
$dbh->{odbc_err_handler} = \&err_handler;
$dbh->{odbc_exec_direct} = 1;
# Prepare your sql statement (perldoc DBI for much more info).
my $sth = $dbh->prepare('select userid, empnum from dbo.emp0');
# Execute the statement.
if ($sth->execute)
{
# This will keep returning until you run out of rows.
while (my $row = $sth->fetchrow_hashref)
{
print "ID = $row->{userid}, Name = $row->{empnum}\n";
}
}
$dbh->disconnect;
复制并重命名文件脚本:
#!/usr/bin/perl -w
use strict;
use warnings;
my $i = 1;
my @old_names = glob "/root/pics/*.jpg";
foreach my $old_name (@old_names) {
my $new_name = "picture$i" . ".jpg";
rename($old_name, "/root/pics/$new_name") or die "Couldn't rename $old_name to $new_name: $!\n";
} continue { $i++ }
print "Pictures have been renamed.\n";
编辑: 这就是我最终完成的工作。
#!/usr/bin/perl -w
use strict;
use File::Copy;
use DBI;
my $data_source = q/db/;
my $user = q/user/;
my $password = q/password/;
my $dbh = DBI->connect($data_source, $user, $password)
or die "Can't connect to $data_source: $DBI::errstr";
# Catch and display status messages with this error handler.
sub err_handler {
my ($sqlstate, $msg, $nativeerr) = @_;
# Strip out all of the driver ID stuff
$msg =~ s/^(\[[\w\s:]*\])+//;
print $msg;
print "===> state: $sqlstate msg: $msg nativeerr: $nativeerr\n";
return 0;
}
$dbh->{odbc_err_handler} = \&err_handler;
$dbh->{odbc_exec_direct} = 1;
sub move_image
{
my $user_id = $_[0];
my $emp_num = $_[1];
my $old_name = "/root/picS/${user_id}.jpg";
my $new_name = "/root/picD/${emp_num}.jpg";
move($old_name, $new_name) or return 0;
return 1;
}
# Prepare your sql statement (perldoc DBI for much more info).
my $sth = $dbh->prepare('select userid, empnum from dbo.emp0');
# Execute the statement.
if ($sth->execute)
{
# This will keep returning until you run out of rows.
while (my $row = $sth->fetchrow_hashref)
{
my $user_id = $row->{userid};
my $emp_num = $row->{empnum};
if (move_image($user_id, $emp_num))
{
print "Moved image $user_id to $emp_num successfully\n";
}
else
{
print "Could not move image $user_id to $emp_num successfully\n";
}
}
}
$dbh->disconnect;
答案 0 :(得分:2)
首先,我建议使用move
来自File::Copy。 rename subroutine限制了何时可以使用它。但是,如果您确定两个图像将始终位于同一文件夹中,则rename
应该没问题,甚至可能更有效。
将以下内容添加到代码顶部,以便能够使用File::Copy
:
use File::Copy;
其次,如果你想在这里集成功能,我会把“移动”代码变成子程序。
sub move_image
{
my $user_id = $_[0];
my $emp_num = $_[1];
my $old_name = "/root/pics/${user_id}.jpg";
my $new_name = "/root/pics/picture${emp_num}.jpg";
move($old_name, $new_name) or return 0;
return 1;
}
然后调用子程序:
# This will keep returning until you run out of rows.
while (my $row = $sth->fetchrow_hashref)
{
my $user_id = $row->{userid};
my $emp_num = $row->{empnum};
if (move_image($user_id, $emp_num))
{
print "Moved image $user_id to $emp_num successfully\n";
}
else
{
print "Could not move image $user_id to $emp_num successfully\n";
}
}
只需像我展示的那样将子程序添加到原始脚本中。不要尝试使用两个不同的脚本。 Subroutines非常有用。