perl — помощь в устранении неполадок оператора dbi, использующего двойные и одинарные кавычки

Я пытаюсь понять, почему я не мог заставить свои переменные работать должным образом, используя Getopt::Std.

Например, в этом выражении Perl DBI, где имя пользователя и пароль заключены в одинарные кавычки, все работает нормально:

my $dbh = DBI->connect("DBI:mysql:database=$dbsrc;host=$node",'foo-bar','mypw');

Но я хочу изменить этот оператор, чтобы я мог передать переменную для $user, $pw. Я использую Getopt::Std; для передачи этих значений:

my $dbh = DBI->connect("DBI:mysql:database=$dbsrc;host=$node", '$user','$pw');

ЭТО РАБОТАЕТ СЕЙЧАС:

my $dbh = DBI->connect("DBI:mysql:database=$dbsrc;host=$node", $user,$pw);

Я получаю следующее сообщение об ошибке:

DBI connect('database=;host=hostname','',...) failed:

ОБНОВЛЕНО: после того, как все внесли свой вклад, лучший способ устранить эту проблему для меня состоял в том, чтобы увидеть, выполняются ли мои вары. Я в основном передавал неправильные значения. Итак, я просто протестировал часть dbi с помощью getopts для этих двух значений и ничего больше, и смог заставить его работать.


person jdamae    schedule 10.05.2011    source источник
comment
покажите, как вы устанавливаете $user и $pw; версия с двойными кавычками должна работать (как и просто передача ...=3306", $user, $pw)   -  person ysth    schedule 10.05.2011


Ответы (4)


Вы не показываете все сообщение об ошибке, но часть, которую вы показываете, кажется, имеет пустое значение для имени пользователя. Вы уверены, что ваши $user и $pw на самом деле настроены прямо в этой точке вашей программы?

person LHMathies    schedule 10.05.2011
comment
Я использую Getopt для передачи в vars. Моя программа работала, пока я не добавил опции для передачи в user и pw. Теперь я не могу заставить его прочитать значения, если я передам их вне программы. - person jdamae; 10.05.2011
comment
Верно. Попробуйте установить $user и $pw явно и посмотрите, начнет ли работать ваш DBI->connect(). Затем закройте этот вопрос и создайте новый, в котором вы покажете, как вы пытаетесь использовать Getopt. - person LHMathies; 10.05.2011
comment
Спасибо. Я тестирую это сейчас и перепишу этот вопрос для ясности. Я ценю вклад. - person jdamae; 10.05.2011

Кавычки избыточны (…306", $user, $pw) будет означать одно и то же), но если первая версия работает, проблема заключается в значениях переменных, а не в том, как вы их используете.

person Quentin    schedule 10.05.2011
comment
Спасибо. Смотрите мои правки. Я пробовал несколько вещей, таких как «$ user» или просто $ user, но dbi все равно не работает. - person jdamae; 10.05.2011
comment
Все еще не видно, как вы заполняете хэш $opt. - person Quentin; 10.05.2011

Разница в том, что когда вы используете двойные кавычки, переменные интерполируются в строку, поэтому конечной строкой будет значение, которое у вас есть в ваших переменных. С одинарными кавычками окончательная строка не будет интерполирована значением переменной, поэтому она будет «$user», независимо от значения переменной $user.

person Tudor Constantin    schedule 10.05.2011
comment
Спасибо. Смотрите мои правки. Я пробовал несколько вещей, таких как «$ user» или просто $ user, но dbi все равно не работает. - person jdamae; 10.05.2011

my $dbh = DBI->connect("DBI:mysql:database=$dbsrc;host=$node;mysql_compression=1;port=3306", $user,$pw);

должно работать при условии, что $dbsrc, $node, $user и $pw установлены правильно. Какова остальная часть вашего сообщения об ошибке?

my $dbh = DBI->connect("DBI:mysql:database=$dbsrc;host=$node;mysql_compression=1;port=3306", '$user','$pw');

не работает, потому что одинарные кавычки приводят к тому, что буквальные строки «$user» и «$pw» отправляются как учетные данные для входа, а не значения переменных $user и $pw.

person Dave Sherohman    schedule 10.05.2011