这个代码片段是一个可以在任何 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";
所以我正在为 Mac OS X 目录服务命令行 (dscl) 实用程序编写一个 perl 包装器。由于站点要求,它必须是 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);
所以如果我能找出编码错误,那么我认为这种方式对我来说效果很好,但如果你有更好的解析这些信息的建议,我很想听听。但是我真的很想弄清楚我应该使用什么编码或方法来桥接两个字符串,我希望这是一个简单的问题,因为我发现了类似的问题,但没有使用桥接处理这种错误。
到目前为止,我已经尝试删除分配:
my $plist = NSString->stringWithCString_($output);
我意识到这个错误不是致命的,但我宁愿在弄清楚之前不要使用这种方法。