my $msf0_fmt = "c3x"; # x because this is likely to # be padded. omit as needed my $cdrom_addr_fmt = "$msf0_fmt I"; my $cdrom_tocentry_fmt = "c4 $cdrom_addr_fmt c"; # will need padding # if struct cdte_addr is larger my $str = pack $cdrom_toentry_fmt; # make the string long enough # ... # call the ioctl on $str my @data = unpack $cdrom_toentry_fmt, $str;