2011-08-24 24 views
6

Tôi muốn đọc dữ liệu từ một tệp YAML nhưng tôi cần thứ tự của các phần tử được giữ nguyên.
Có mô-đun trong perl có chức năng này không và cách thực hiện?Bảo quản lệnh YAML perl


Để đối phó với @mugen kenichi

Tôi cố gắng làm những gì tôi muốn, nhưng tôi không tin rằng đây là một giải pháp hợp lý.

YAML cũ:

foo: 
    bar: some value 
    baz: other value 
qwe: 
    bar: yet another value 
    baz: again 

mới YAML

- 
    foo: 
     bar: some value 
     baz: other value 
- 
    qwe: 
     bar: yet another value 
     baz: again 
+4

Nếu đơn hàng có liên quan, bạn nên sử dụng trình tự trong yaml. Suy nghĩ lại cấu trúc dữ liệu yaml của bạn. –

+0

@mugen kenichi Tôi đã cập nhật câu hỏi – bliof

+1

Có thực sự là một ánh xạ được sắp xếp theo mô tả ở đây http://www.yaml.org/spec/1.2/spec.html#id2765410 –

Trả lời

6

Các YAML spec specifically states rằng "phím lập bản đồ không có một trật tự" và rằng "trong mọi trường hợp để nút rất có ý nghĩa, một chuỗi phải được sử dụng". Để suy ra thứ tự từ ánh xạ sẽ vi phạm thông số. Sử dụng ánh xạ theo thứ tự, như đã đề cập bởi mugen, là giải pháp đúng để bảo toàn trật tự.

Nếu bạn thực sự muốn, bạn bằng cách nào đó có thể nhận được một cú pháp YAML để đổ vào một Tie::IxHash mà sẽ giữ gìn trật tự ... nhưng tôi biết không có phân tích cú pháp Perl YAML mang đến cho bạn rằng mức độ kiểm soát. Có thể bạn có thể làm điều gì đó với YAML::Old::Loader, nhưng đó không phải là một trình phân tích cú pháp YAML rất tốt và YAML :: Old :: Loader không được ghi lại.

Tùy chọn thứ ba là sử dụng rõ ràng YAML tags (còn gọi là loại) để hướng dẫn trình phân tích tải bản đồ của bạn dưới dạng loại đặc biệt và sau đó bạn cung cấp gọi lại ... nhưng thậm chí có khả năng trình phân tích cú pháp YAML sẽ cung cấp gọi lại của bạn với một băm không có thứ tự.

Tôi đề nghị bạn chỉ cần thay đổi YAML. Điểm của ngôn ngữ dữ liệu di động là tất cả ý nghĩa ngữ nghĩa rõ ràng trong tệp dữ liệu hoặc thông số, không ngầm trong một trình phân tích cú pháp cụ thể. Ánh xạ theo thứ tự là một thành ngữ YAML được chấp nhận, nhỏ gọn.

- foo: 
     bar: some value 
     baz: other value 
- qwe: 
     bar: yet another value 
     baz: again