2014-12-17 15 views
6

Tôi luôn luôn nghĩ rằng %let tạo ra một biến local nếu được sử dụng bên trong %macro . . . %mendtại sao% không cho phép tạo biến macro cục bộ?

Nhưng khi tôi chạy mã này, nhật ký SAS lãm GLOBAL TESTVAR value1

%let testVar = value2; 
%macro test; 
%let testVar = value1; 
%mend; 

%test 

%put _all_; 

Vì vậy, tôi không thể hiểu tại sao giá trị của biến toàn cục testVar đã thay đổi thành value1. Tôi đã mong đợi nó không thay đổi value2. Câu lệnh %let bên trong %macro sẽ chỉ ảnh hưởng đến bảng biểu tượng cục bộ.

SAS documentation says:

Khi bộ xử lý vĩ mô thực hiện một tuyên bố chương trình vĩ mô có thể tạo ra một biến vĩ mô, bộ vi xử lý vĩ mô tạo ra các biến trong bảng ký hiệu cục bộ nếu không có biến vĩ mô có cùng tên có sẵn để nó

Trả lời

7

Điều quan trọng là 'nếu không có biến macro có cùng tên có sẵn cho nó' - trong trường hợp này, biến macro có cùng tên có sẵn, vì bạn đã xác định testVar là toàn cầu.

Bạn có thể cung cấp cho nó một cái tên không được chia sẻ với một toàn cầu, hoặc dứt khoát tuyên bố nó như là địa phương:

%let testVar = value2; 
%macro test; 
    %local testVar; 
    %let testVar = value1; 
%mend; 

%test 
+0

Cảm ơn, tôi hiểu rồi. Tôi đã nhầm lẫn với ví dụ SAS: '% let new = inventry; % macro name2; % let new = report; . . ' – Alex

+2

@Alex Bạn phải khai báo một cách rõ ràng các biến trong macro như là cục bộ (nếu bạn mong đợi chúng là cục bộ). Không làm như vậy có thể dẫn đến một số mã khó gỡ lỗi nếu macro của bạn xảy ra để gọi các macro khác (hoặc đang được gọi bởi macro khác). –

Các vấn đề liên quan