2017-08-02 42 views
-1

在perl中,只有整數和雙精度的數組,如 @array = qw/4 3.1416 6.7 15 4.3 /, 如何打包列表轉換成二進制序列並保存到一個.bi文件中,其中二進制文件在元素爲整數時必須完全是int,在元素爲雙精度時必須爲double。這種格式非常重要,因爲我需要將它提供給外部可執行文件。混合整數和雙精度類型並將它們打包爲原始二進制格式,並用perl

+1

不要使用類似JSON的可解析格式。 – Sobrique

回答

4
for (@array) { 
    if (int($_) == $_) { 
     $output .= pack($int_format, $_); 
    } else { 
     $output .= pack($double_format, $_); 
    } 
} 

也就是說,你指定的文件格式不能被任何東西讀取。讀者需要知道下一個要讀取的內容是以整數還是雙精度來存儲,但該信息不可用。

也許你的意思是你想要根據@array的字符串中是否存在.來選擇格式。在這種情況下,你會使用以下命令:

for (@array) { 
    if (/\./) { 
     $output .= pack($double_format, $_); 
    } else { 
     $output .= pack($int_format, $_); 
    } 
} 

你所提到的,因爲讀者希望浮點數和整數的特定模式。那麼爲什麼不使用相同的模式呢?

$output .= pack("$int_format$double_format$double_format$int_format$double_format", @array); 

注意,我離開的確切格式含糊。那是因爲你做得很好。

  • 沒有指定該整數的大小:
    • 8位整數(c
    • 16位整數(s
    • 32位整數(l
    • 64位整數(q或使用Math::Int64
    • int相同mpiler已編譯的Perl(i
    • 同Perl使用(j
  • 爲雙精度浮點數格式爲d
  • 沒有指定字節序(對於整數和浮點數):
    • 小端(追加<
    • 大端(追加>
    • 本地字節順序(沒有後綴)
+1

也許你應該在回答之前停下來思考。我再說一遍:第一段代碼會產生不可用的輸出。期。考慮一下'@array = qw/4.0 ... /'vs'@array = qw/4.1 ... /' – ikegami

+0

我很抱歉,我可能誤解了某些內容,但是您的第一個建議運行良好。 – Aki

+0

You顯然沒有運行我提到的測試。我無法阻止你對自己撒謊,但這是你的計劃將會破壞,你的名聲在線上,而不是我的。 – ikegami

相關問題