Этот фрагмент кода является примером, который должен работать в любой системе Mac OS X.
#!/usr/bin/perl
use Foundation;
my $dscl = "/usr/bin/dscl";
sub getGeneratedUID(){
my $name = shift;
my $command = "$dscl -plist . -read /Users/$name GeneratedUID";
print "$command\n";
my $output = `$command`;
my $plist = NSString->alloc()->initWithCString_encoding_($output,NSStringEncodingASCII);
my $data = $plist->dataUsingEncoding_(NSStringEncodingASCII);
my $record = NSPropertyListSerialization->propertyListWithData_options_format_error_($data,NSPropertyListImmutable,0,0);
my $array = $record->objectForKey_('dsAttrTypeStandard:GeneratedUID');
return $array->objectAtIndex_(0)->description()->UTF8String();
}
my $logname = $ENV{'LOGNAME'};
my $guid = &getGeneratedUID($logname);
print "My GUID: $guid\n";
Итак, я пишу оболочку perl для утилиты командной строки службы каталогов Mac OS X (dscl). Это должно быть perl из-за требований сайта, а также из-за того, что эта команда несколько изменила свои выходные данные за эти годы, и я использую возможность для нее форматировать свои выходные данные в виде списка Apple Propertly. Я использовал NSPropertyListSerialization-> propertyListWithData в паре других языков за эти годы, общая идея состояла в том, что если вы преобразуете строку в данные, это создаст для вас NSDictionary из строки, таким образом, заголовок вопроса, лучше ли способ разобрать вывод plist. Пока этот код работает, хотя он выдает следующую ошибку:
2012-01-10 10:57:31.270 perl5.12[1876:1507] Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
Что гуглится вокруг, я понимаю, это линия
my $plist = NSString->alloc()->initWithCString_encoding_($output,NSStringEncodingASCII);
Так что, если я смогу выяснить ошибку кодирования, то я думаю, что этот способ будет работать очень хорошо для меня, но если у вас есть лучшее предложение для анализа этой информации, я хотел бы услышать ее. Однако мне бы очень хотелось выяснить, какую кодировку или метод я должен использовать для соединения двух строк, и я надеюсь, что это простой вопрос, так как я нашел похожие вопросы, но ничего, что касалось ошибок такого рода с использованием моста.
Пока я пытался удалить alloc:
my $plist = NSString->stringWithCString_($output);
Я понимаю, что эта ошибка не является фатальной, но я бы не стал использовать эту методологию, пока не выясню.