2014-11-25 2 views
1

Я пытаюсь разбить результаты запроса mysql с помощью модуля perl и DBI. Вот мой код:Perl DBI array - split

#!/usr/bin/perl -w 
use DBI; 

$dbh = DBI->connect('DBI:mysql:host', 'user', 'password' 
        ) || die "Could not connect to database: $DBI::errstr"; 


$sql = "SELECT * FROM users;"; 
$sth = $dbh->prepare($sql); 
$sth->execute or die "SQL Error: $DBI::errstr\n"; 
while (@row = $sth->fetchrow_array) { 

my @value1 = split(".",@row); 
my $domain = $value1[1]; 

print "$domain\n"; 

} 

$dbh->disconnect(); 

Результат запроса аналогичен: username.domain Так что я хочу, чтобы разделить результат с «» чтобы показать только «домен», но он возвращает мне ошибку: Использование неинициализированного значения $ domain в конкатенации (.) или строке ...

Спасибо!

+5

'@ row' в скалярном контексте вычисляет количество элементов в' @ row'. Это то, что вы раскалываете. В каком поле вы хотите разбить? Первый? Это '$ row [0]'. – ikegami

+4

Добавить 'use strict; использовать предупреждения, 'на вершину каждого написанного вами Perl-скрипта, только под shebang, и потерять флаг' -w'. Это поможет избежать множества ошибок и значительно упростит поиск и устранение неполадок. – ThisSuitIsBlackNot

+3

''. "' В split - это регулярное выражение, а 'select *', сопровождаемое 'fetchrow_array', - это, мягко говоря, ужасная идея. –

ответ

-4
#!/usr/bin/perl -w 
use strict; 
use warnings; 
use DBI; 


my $dbh = ''; 
my $sql = ''; 
my $sth = ''; 
my @dbRow=(); 


$dbh = DBI->connect('DBI:mysql:host', 'user', 'password' 
        ) || die "Could not connect to database: $DBI::errstr"; 


$sql = "SELECT * FROM users;"; 
$sth = $dbh->prepare($sql); 
$sth->execute or die "SQL Error: $DBI::errstr\n"; 
while (@dbRow = $sth->fetchrow_array) { 
    foreach my $dbData (@dbRow) 
    { 
     print split (/\./,$dbData)->[1]; 
    } 
} 

$dbh->disconnect(); 
+4

Области, нуждающиеся в улучшении: плохое форматирование. Не компилируется. Маловероятно, что более чем одна область пользователей имеет форму 'user.domain'. '@ domain' плохо назван, так как только' $ domain [1] 'является доменом. Никаких объяснений ключевой проблемы (проблем). – ikegami

4

Давайте рассмотрим ваш код. С добавленными комментариями.

#!/usr/bin/perl -w 
# Always always, start Perl programs with "use strict" and "use warnings". 
# I know you have "-w" on the shebang line, but lose that as "use warnings" 
# is a more flexible improvement. 

use DBI; 

# If you "use strict" then you need to declare all of your variables. So 
# this line should start "my $dbh = ". 
$dbh = DBI->connect('DBI:mysql:host', 'user', 'password' 
        ) || die "Could not connect to database: $DBI::errstr"; 


$sql = "SELECT * FROM users;"; 
$sth = $dbh->prepare($sql); 
$sth->execute or die "SQL Error: $DBI::errstr\n"; 
while (@row = $sth->fetchrow_array) { 
    # Code is always easier to follow with good indentation. 

    # Several issues here. 
    # The first parameter to split() is a regular expression. I recommend 
    # always putting it in /.../ so you're not tempted to assume it's a string. 
    # In a regex, the dot has a special meaning. It matches any character. To 
    # match a literal dot, you need to escape it with a \. 
    # The second parameter to split() is a string to split. You can't give it 
    # an array (well, you can, but it will use the number of elements in the 
    # array which is probably not what you want! 
    my @value1 = split(".",@row); 
    my $domain = $value1[1]; 

    print "$domain\n"; 

} 

$dbh->disconnect(); 

Принимая во внимание все те, что ваш код должен выглядеть примерно так:

#!/usr/bin/perl 

use strict; 
use warnings; 
use DBI; 

my $dbh = DBI->connect('DBI:mysql:host', 'user', 'password') 
    || die "Could not connect to database: $DBI::errstr"; 

my $sql = "SELECT * FROM users;"; 
my $sth = $dbh->prepare($sql); 
$sth->execute or die "SQL Error: $DBI::errstr\n"; 

while (my @row = $sth->fetchrow_array) {  
    # Assume $row[0] is the value to want to split 
    my @value1 = split(/\./, $row[0]); 
    my $domain = $value1[1]; 

    print "$domain\n"; 
} 

$dbh->disconnect(); 
+1

Поскольку вы используете «strict», вы должны объявлять '$ sql',' $ sth' и '@ row', как вы указали сами в своем объяснении. – dgw

+1

Упс. Да. Спасибо, что указали это (и спасибо @mpapec за исправление моего сообщения). –

Смежные вопросы